Úžasný svět WordPressu a Django integrace

Úžasný svět WordPressu a Django integrace

event_note 28.02.2019

Připravujeme web AnalyticalPlatform.com. Aneb jak jsme začali zobrazovat výstupy našeho „Financial research software“ týmu nejdříve v rámci wordpressové stránky www.objektivni.info a následně se přeorientovali na komplexní Analytical Platform.

Ve světě webových stránek vládne jednoduchý, ale silný WordPress. Na jednoduchý projekt, blog, jednoduchou prezentaci je jednoduše jednoduchý. Uživatelská autentifikace, správa zapomenutých hesel atd. je součástí standardní instalace. Bylo by hezké tuto funkcionalitu využít i jinde – dostat bezpečně uživatelské jméno, nebo jinou relevantní informaci… v Django.

Cookie (sušenka) může být sdílena mezi jednotlivými servery pod jedním doménovým jménem, zde problém není.

Zřejmé by bylo použít autentifikační cookie WordPressu…

Problém

Jméno authentifikační cookie je vytvořeno spojením řetězce ”‘wordpress_” a MD5 hash funkce použité na “site url”. Obsah cookie je tvořen uživatelským jménem, čas vytvoření cookie a hash.

Jinými slovy – bez přístupu k databázi WordPressu s uživatelskými hesly nejsme schopni ověřit pravost auth cookie z WordPressu.

Řešení

WordPress obsahuje jednoduchý systém na rozšíření jeho funcionalit pomocí pluginů. Pluginy mohou volat funkci add_action k zaregistrování či zavedení specifické funkcionality.

Vytvořili jsme nový plugin zavádějící volání k vytvoření naší specifické-nové-další cookie. Nastavuje cookie ve chvíli přihlášení uživatele do WordPressu – akce “wp_login”.

Naštěstí PHP obsahuje kryptografickou podporu v základní instalaci. Vytvořili jsme obsah cookie pomocí symetrické kryptografie s využitím Counter (CTR) módu. Dalšími použitými opatřeními byl náhodně volený počáteční vektor a HMAC na test integrity zprávy.

Momentálně ukládáme v cookie pouze uživatelské jméno. Užití naší vlastní cookie nám v budoucnu  umožňuje do cookie uložit jakýkoliv další WordPress relevantní obsah.

Technický detail – PHP obsahuje dvě funkce na nastavení cookie. “setcookie” kóduje hodnotu cookie. My používáme “setrawcookie” pro přesné nastavení cookie.

Část Django

Django a WordPress sdílejí pouze tajný klíč. Cookie je automaticky předávána všem serverům v rámci jedné domény.

Django zkouší dostat naší specifickou cookie z požadavku, rozkóduje ji, zkontroluje její integritu a pokud je vše v pořádku, vrátí uživatelské jméno.

Doslov

Jakmile bylo vše doděláno a fungující, přišel nový požadavek na WordPress funkcionalitu… se závěrem, že WordPress není už optimální. Plný Django REST server a plný Javascript framework na straně klienta… udělal tento mini projekt/cvičení překonaný.

Miloň Krejča