OAuth2 server a opensourceová deziluze

OAuth 2

OAuth2 je moderní protokol umožňující třetím stranám (třeba cizím webům) získat přístup k datům (třeba uživatelů) s povolením uživatele a to bez toho, aby se třetí strana dozvěděla uživatelovy přístupové údaje. Využívá jej například Google API, Facebook a asi tucet dalších megakorporací a tím pádem celkem není problém sehnat OAuth2 klient. Ale server na PHP, to je něco docela jiného…

Dnešní den jsem strávil prohrabováním bezpočtem knihoven, prohlašujících se za OAuth2 server. Začal jsem třemi, co jsou v nabídce na oficiálním OAuth2 webu, ale nebylo mi dáno u nich skončit a tak následoval ještě stoh dalších. Nebudu rozebírat co všechno jsem prošel a na čem skončil (mám v tom guláš a dohromady bych to stejně nedal), ale uvedu pár odstrašujících příkladů:

Z nabídky na OAuth2 tu máme oauth2-server-php což je na první pohled celkem robustní knihovna. Má dokonce i vlastní autoloader a naditý README.MD soubor, ve kterém je dokonce řádek po řádku rozepsaný příklad. Jenže ono to má několik háčků:

  • příklad nám ukazuje, jak se autorizovat s tokenem, ale už nám neříká, jak token získat
  • ale to je nakonec fuk, protože využívá PDOStorage, který ale postrádá jednu podstatnou věc – strukturu databáze, se kterou pracuje. Hledal jsem všude možně, ale marně.

Naštěstí jsem narazil na poznámku, že je tato knihovna vlastně důkladně přepsaná jiná knihovna, ale ani tady to nebylo růžové. Je pravda, že knihovna je podstatně úspornější a ani nepotřebuje vlastní autoloarder a příklad s databází má přibalený dokonce soubor .sql se strukturou. Jenže zas ta úprava kódu není nijak růžová. Hemží se to tu funkcemi jako extract() nebo list(), metody si berou třeba i 6 parametrů, komentáře jsou spíš k zlosti, ale to celkem nic není.

Oba příkladové servery mají definovanou konstantu SALT a říkají, že se má použít něco unikátního pro váš systém. Co už ale neříkají je, že se tato konstanta nikdy a nikde nepoužije (placebo efekt, zřejmě). Pak nám chce hashovat pomocí blowfish, který mezi standardní php algoritmy nepatří (a ani není zas tak skvělý, abychom museli brát zrovna ten). Poslední kapka nastala u přidělování tokenu, kdy se ukázalo, že funkce pro ověření hesla má přehozené parametry a proto vám nikdy nepotvrdí, že je heslo správně.

Jak asi tušíte, v tomto momentě jsem potlačil cholerický záchvat a začal psát tento článek. Zítra si nejspíš vezmu k ruce specifikaci a napíšu si nějaký fungující server sám. Ono ty ostatní knihovny na tom totiž nebyly nijak lépe, spíš naopak.

Faktem je, že by možná bylo na místě zjištěné chyby opravit a poslat do githubu, ale protože v prvním případě netuším, jak má struktura databáze vypadat a v druhém je zřejmě užití blowfishe a přehození parametrů není chyba, ale záměr.

Na stránce autora první zmíněné knihovny je navíc k tomuto tématu umístěný takový komiks. Věřte, že po jeho shlédnutí jsou výše popsané pasti opravdovou lahůdkou!