Po maturitě na pražském gymnáziu jsme se s kamarádem Jirkou Antoňů začali poohlížet po různých nabídkách stáží v IT a v CZ.NIC byli natolik odvážní, že se nás bez většího přemlouvání ujali a vymysleli pro nás na léto zajímavý program, z něhož doufejme nebudeme profitovat jen my, ale i samotné sdružení.
Naším prvním úkolem bylo zprovoznit přihlašování přes MojeID do několika největších systémů pro správu obsahu (CMS) a Jirka pro implementaci vybral WordPress, Joomla!, PrestaShop, OpenCart a Drupal. Všechny pluginy jsou volně dostupné na GitLabu a dokumentaci k nim naleznete zde.
WordPress se k implementaci MojeID hodil jednak proto, že je nejrozšířenějším CMS na světě a na jeho pluginu WooCommerce běží zhruba 12 % českých e-shopů, jednak protože pro něj již existoval funkční plugin pro protokol OpenID Connect. Do WordPressu se OIDC instalovalo velice jednoduše, stačilo jen umístit soubory do složky běžící instance (či plugin jednoduše nahrát přes WordPress admin rozhraní) a v nastavení jej povolit. Konfigurace už byla náročnější – v úspěšném přihlášení nám například v jednu chvíli bránila nesprávně zvolená hodnota klíče, podle kterého WordPress z účtu MojeID získával přezdívku uživatele. Plugin jsme ale nakonec rozchodit zvládli a výsledkem je dokumentace provádějící uživatele instalací krok po kroku. Zároveň jsme se poučili o tom, že nastavení, které neexistuje, se nemůže rozbít, což se nám později hodilo při tvorbě vlastních pluginů.
Jako druhý jsme (po půlhodinové hádce s PHP composerem ohledně verze pluginu) zprovoznili rozšíření do Drupalu, se kterým se pracovalo o poznání jednodušeji – krom credentials a endpointů je třeba vyplnit už jen OpenID scope. Jirka navíc přidal MojeID jako samostatnou službu, takže uživatel musí nastavit pouze credentials a scope zadává jen v případě, že chce ten přednastavený o nějaké položky rozšířit. Kód pro tuto službu se také aktuálně snažíme dostat do upstreamu oficiálního pluginu. U Drupalu je však kromě nastavení služby také potřeba umístit tlačítko pro přihlášení. Tato nutnost se mně osobně líbí, protože tím uživatel nepřichází o kontrolu nad vzhledem stránky a může se rozhodnout, zda bude tlačítko všem na očích v postranní liště nebo zda bude schované v zápatí stránky. Způsob jeho umisťování mi rovněž plně vyhovoval – v záložce designu stránky stačilo pro rozšíření OpenID Connect přidat tlačítko, zvolit v rozbalovací liště jeho pozici a bylo hotovo.
Pokud by se někomu zdálo umisťování tlačítka v Drupalu moc složité, z OpenCartu radost mít rozhodně nebude. Instalace rozšíření i jeho konfigurace jsou podle mě na vrcholu škály uživatelské nepřívětivosti. Tlačítko totiž musíte vložit do šablony stránky, ze které následně CMS web renderuje. To obnáší kopírování zdrojového kódu z dokumentace, nahrávání grafických balíčků na server a další nepříjemnosti, které leckoho odradí. Zvláště v dokumentaci k OpenCartu jsem se proto snažil vše popsat co nejjednodušeji – závisí na ní de facto počet úspěšných instalací pluginu. K dispozici jsou dvě ukázkové implementace – tlačítko v rozbalovací liště uživatelského účtu a v patičce stránky. Jirka musel navíc celé rozšíření napsat úplně od základu, jelikož poslední publikovaná verze SSO pluginu byla šest let stará a tím pádem nepoužitelná. Od jeho publikování v roce 2017 navíc vyšel OpenCart 4, jehož pluginy už nepoužívají modifikační systém OCMOD a nelze je tak rozumně přepsat pro novou verzi systému. Také je nutno podotknout, že i z vývojářského hlediska je psaní pluginů pro OpenCart naprostou noční můrou. Nejenže neexistuje pro moduly ve verzi 4 absolutně žádná dokumentace, ale některá specifika, která si OpenCart z dlouholetého vývoje přinesl, silně ztěžují i pochopení fungování pluginů ze samotného kódu OC. Pomyslnou třešničkou na dortu je pak fakt, že jediným možným způsobem instalace (a potažmo vývoje) pluginu je nahrání velice specificky pojmenovaného a uspořádaného .zip souboru do instalačního formuláře. Samotná instalace pak podle mě sestává z více kroků, než by bylo potřeba. Stačilo by jen nahrát soubor s rozšířením, aktivovat jej a pokračovat ke konfiguraci. Namísto toho ale musíte potvrdit, že chcete nahraný plugin skutečně nainstalovat, a nádavkem ještě ve spleti rozbalovacích lišt hledat kategorii nastavení, ve které jej můžete zapnout. Konfigurace probíhá jako obvykle vyplněním credentials, OpenID scope a endpointů. Ty bychom sice mohli napevno nastavit a uživatel by pouze přepínal mezi testovacími a ostrými, ale protože pro OpenCart žádné up-to-date OIDC rozšíření neexistuje, rozhodli jsme se plugin publikovat volně konfigurovatelný. Lze jej tak použít pro přihlášení pomocí účtu kteréhokoli poskytovatele identit a není limitován pouze na MojeID.
Předposledním pluginem, který jsme zprovoznili a který rovněž vyžadoval programátorský zásah, bylo přihlášení přes MojeID do Joomla!. Ta je vývojářsky o něco příjemnější než OpenCart (byť ne o mnoho), jejím specifikem je několik rozsáhlých konfigurací všeho možného i nemožného v XML souborech. Instalace rozšíření je zde velmi jednoduchá – uživatel jej pouze nahraje přes admin panel a ono se samo aktivuje, stačí ho pak jen nakonfigurovat obdobně jako ostatní pluginy. Stejně jako u OpenCartu jsme zvolili implementaci univerzálního OpenID Connect klienta, uživatel tedy není omezený na používání MojeID, ale může si nakonfigurovat i jiné libovolné IdP. Zakomponování přihlášení do stránky vnímám těžší než tomu bylo u Drupalu, ale v porovnání s OpenCartem je stále celkem jednoduché. Vzhledem k tomu, že Joomla! nepodporuje možnost přidat na stránku tlačítko, je zapotřebí vytvořit modul stránky obsahující obrázek s odkazem na přihlášení. U něj může uživatel opět určit umístění tlačítka a jedinou vadou na kráse může být rámeček ohraničující modul.
Jako poslední jsme MojeID implementovali do PrestaShopu, což hlavně pro Jirku znamenalo postavit plugin na zelené louce. Jediné OIDC rozšíření je totiž dostupné za podle nás přemrštěnou cenu, a tak jsme uvítali možnost svůj plugin publikovat s otevřenou licencí. Jirka nicméně posléze poznamenal, že kdyby to bylo pro osobní použití, než aby ho psal, raději by si ho koupil… Vývoj byl u PrestaShopu výrazně příjemnější, než u jiných CMS, a byť se také neobešel bez svých specifik, užili jsme si ho asi nejvíc. Opět jsme se snažili o univerzální implementaci OpenID Connect bez vazby na MojeID. Instalace probíhá stejně jako u WordPressu, tedy přesunem souborů na server s běžící instancí či nahráním přes GUI a následnou aktivací. Konfigurace je minimální, zahrnuje jen credentials, scope a endpointy, odpadá zde rovněž nutnost umisťovat tlačítko pro přihlášení.
Jako nejjednodušeji instalovatelný plugin bych tedy označil ten do PrestaShopu v závěsu s WordPressovým. Do Joomla! a OpenCart jej sice lze instalovat skrze admin panel, zase ale vyžadují vytváření modulů a úpravy šablon pro umístění přihlašovacího tlačítka. Co se Drupalu týče, je pro instalaci třeba spustit PHP composer, což nemusí být vždy snadné, a proto bych ji označil za nejnáročnější z této pětice pluginů, byť jeho konfigurace je naopak dost jednoduchá.
Myslím si, že nám oběma práce na tomto projektu hodně dala, ať už to byly nové znalosti v oblasti protokolu OpenID Connect, psaní pluginů pro nejrůznější CMS nebo vhled do práce dokumentaristy. Rozhodně také prohloubila naše nadšení pro opensource, protože zdokumentovat již fungující plugin je mnohem příjemnější než jej psát celý sám.
Pokud by vás z našeho příspěvku cokoli zaujalo nebo byste chtěli implementovat podporu OpenID Connect i pro svůj web, veškerou dokumentaci, včetně odkazů na samotné pluginy, naleznete zde.