Úžasný svět WordPressu a Django integrace
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.
- MD5 hash na “site url” je statický a v podstatě se nemění
- Využívat by jsme chtěli uživatelské jméno, ale potřebujeme si být jisti, že skutečně jde o uživatelské jméno z našeho partnerského serveru a ne o podvrženou informaci
- Hash je bezpečnostní část. Obsahuje hash uživatelského jména, času vytvoření cookie, scheme (obvykle řetězec “auth”) a z řetězce hash uživatelského hesla znaky od pozice 8 do 12. Wordpres hash uživatelského hesla je vytvořen s užitím AUTH_KEY a AUTH_SALT proměných.
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