Přihlašování k Twitteru pomocí OAuth

Twitter při přístupu ke svému API umožňuje aplikaci kromě přihlášení pomocí jména a hesla i pokročilejší způsob, při kterém je použita technologie, nazývaná OAuth. Její velká výhoda je v tom, že umožňuje vytvářet aplikace, které nevyžadují uživatelské heslo k účtu. V článku naleznete podrobný návod.
(Článek byl převzat z blogu Jana Tichého s autorovým svolením. Zde na Zdrojáku jsme se protokolu OAuth věnovali v článku OAuth – nový protokol pro autentizaci k vašemu API – pozn. red.)
Knihovna pro práci s OAuth
Pro přístup k Twitter API využijeme nějakou existující knihovnu. Já budu vše ukazovat na knihovně Abraham TwitterOAuth. Ta se sestává ze dvou souborů. Jednak OAuth.php
pro obecnou práci s jakýmkoliv OAuth, jednak nad tím postavený twitterOAuth.php
pro přístup právě k Twitter API.
V prvním kroku si tedy celou knihovnu stáhněte a zahrňte do své aplikace obvyklým způsobem, ať už přes explicitní require_once
, nebo například s využitím autoloadu.
Registrace aplikace u Twitteru
Dále musíte v rozhraní Twitteru registrovat svou aplikaci, aby Twitter věděl, s kým má tu čest a komu vlastně své uživatele autentizuje. To vyřídíte na adrese https://twitter.com/oauth_clients. Většina položek je jasná, popíšu jen ty, u kterých byste mohli váhat:
- Jako Application type vyberte
Browser
. - Callback URL je adresa, na kterou se k vám budou uživatelé vracet poté, co se úspěšně autentizují na straně Twitteru.
- Defaut Access Type zvolte podle toho, jestli chcete využívat twitterovské API pouze pro přihlašování či čtení různých informací, nebo zda do něj budete chtít i zapisovat – například posílat uživatelům statusy, měnit nastavení jejich Twitter účtu apod.
- Nakonec zaškrtněte i Use Twitter for login.
Po úspěšné registraci vám systém přidělí Consumer
a
keyConsumer secret
, kterými budete při každé komunikaci s API prokazovat, že to je zrovna a právě ta vaše aplikace. Rozhodně je tedy nikde nezveřejňujte. Pro jednoduchost si je nyní uložíme jako konstanty:
define('CONSUMER_KEY', 'ahjcEcDhfsRKZvQk'); define('CONSUMER_SECRET', 'EhWLtbn3M3DaPL0q7WLLe2xiBft1E7q8');
Posíláme uživatele na autentizační server
Ve zkratce řečeno probíhá přihlášení tak, že odešlete uživatele na autentizační server Twitteru, tam se uživatel přihlásí zadáním svého username a hesla, server vám jej vrátí zpátky a potvrdí vám, že se jedná o toho a toho uživatele. Teď se podívejme na první polovinu tohoto procesu.
Nejprve vytvoříme instanci třídy TwitterOAuth
. Jako parametry zadáme consumer tokeny, které jsme získali výše:
$oauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
Dále musíme mít přidělen request token, pod kterým budeme celou autentizaci provádět. Požádáme tedy o přidělení request tokenu:
$requestToken = $oauth->getRequestToken();
Request token se ve skutečnosti skládá ze dvou částí – klíče a tajemství. Obě hodnoty si uchováme v sessions, protože je budeme potřebovat později, až se nám uživatel vrátí z autentizačního serveru:
$_SESSION['request_token_key'] = $requestToken['oauth_token']; $_SESSION['request_token_secret'] = $requestToken['oauth_token_secret'];
Nyní získáme autentizační URL, na které uživatele pošleme. Jako parametr zadáme klíč právě získaného request tokenu:
$url = $oauth->getAuthorizeURL($requestToken['oauth_token']);
A teď už uživateli dané URL buďto vypíšeme, aby si na něj kliknul, nebo jej tam pošleme rovnou a bez ptaní:
header('Location: ' . $url, TRUE, 301); exit;
Celý skript tedy bude vypadat nějak takto:
// načteme knihovnu require_once 'library/twitterOAuth.php'; // definujeme si konstanty define('CONSUMER_KEY', 'ahjcEcDhfsRKZvQk'); define('CONSUMER_SECRET', 'EhWLtbn3M3DaPL0q7WLLe2xiBft1E7q8'); // vytvoříme si základní instanci $oauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); // vyžádáme si request token $requestToken = $oauth->getRequestToken(); // uložíme request token do sessions $_SESSION['request_token_key'] = $requestToken['oauth_token']; $_SESSION['request_token_secret'] = $requestToken['oauth_token_secret']; // získáme URL autentizačního serveru $url = $oauth->getAuthorizeURL($requestToken['oauth_token']); // přesměrujeme uživatele na autentizační server header('Location: ' . $url, TRUE, 301); exit;
Vítáme uživatele zpátky
Pokud se uživatel na autentizačním serveru úspěšně přihlásí, pošle jej Twitter zpátky k nám do skriptu, který jsme výše zadali do nastavení Callback URL
. V tomto skriptu musíme udělat následující kroky.
Nejprve vytvoříme instanci, ovšem již navázanou na náš request. To se zajistí tak, že za první dva obligátní parametry se přidají ještě další dva s uloženým request tokenem:
$oauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['request_token_key'], $_SESSION['request_token_secret']);
Od tohoto okamžiku už je request token nepotřebný, takže jej můžeme pro pořádek zrušit:
unset($_SESSION['request_token_key']); unset($_SESSION['request_token_secret']);
Teď potřebujeme od autentizačního serveru získat informace o uživateli, abychom vůbec věděli, kdo že se to tam přihlásil. Tyto údaje si můžeme uložit například do sessions a dále je nějak využívat:
$info = $oauth->getAccessToken(); $_SESSION['user_id'] = $info['user_id']; $_SESSION['user_name'] = $info['screen_name'];
V poli $info
je kromě ID a jména uživatele také ještě takzvaný access token. Ten si uchováme pro případ, že bychom v budoucnu chtěli jménem uživatele posílat do Twitter API ještě nějaké další dotazy. Já si to uložím jen do sessions, ale samozřejmě je možné si access token uchovat i trvale například do databáze. Stejně jako u request tokenu, i access token se skládá z klíče a tajemství:
$_SESSION['access_token_key'] = $info['oauth_token']; $_SESSION['access_token_secret'] = $info['oauth_token_secret'];
A to je vše, už jsme komplet přihlášeni. Celý kód uvedeného skriptu by vypadal nějak takto:
require_once 'library/twitterOAuth.php'; // definujeme si konstanty define('CONSUMER_KEY', 'ahjcEcDhfsRKZvQk'); define('CONSUMER_SECRET', 'EhWLtbn3M3DaPL0q7WLLe2xiBft1E7q8'); // vytvoříme si instanci pro daný request $oauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['request_token_key'], $_SESSION['request_token_secret']); // vymažeme request token ze sessions unset($_SESSION['request_token_key']); unset($_SESSION['request_token_secret']); // získáme a uchováme info o přihlášeném uživateli $info = $oauth->getAccessToken(); $_SESSION['user_id'] = $info['user_id']; $_SESSION['user_name'] = $info['screen_name']; $_SESSION['access_token_key'] = $info['oauth_token']; $_SESSION['access_token_secret'] = $info['oauth_token_secret'];
Posíláme další požadavky
Uživatele už máme přihlášeného, můžeme tedy do Twitter API posílat jeho jménem požadavky. Nejprve musíme vytvořit instanci třídy TwitterOAuth
, ale jako třetí a čtvrtý parametr nyní zadáme access token, který jsme si výše uložili do sessions:
$oauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['access_token_key'], $_SESSION['access_token_secret']);
Všechny další požadavky se pak už velice jednoduše posílají přes volání metody OAuthRequest
. Následuje několik příkladů přímo z dokumentace k námi používané knihovně:
$content = $oauth->OAuthRequest('https://twitter.com/account/verify_credentials.xml', array(), 'GET'); $content = $oauth->OAuthRequest('https://twitter.com/statuses/replies.xml', array(), 'POST'); $content = $oauth->OAuthRequest('https://twitter.com/statuses/update.xml', array('status' => 'Test OAuth update. #testoauth'), 'POST');
Konkrétní podoba jednotlivých požadavků už je mimo záběr tohoto článku a doporučuji k tomu prostudovat specifikaci Twitter API.
Na co ještě nezapomenout?
Určitě jste si všimli, že v ukázkových skriptech spousta věcí chybí, nejsou tam ošetřeny žádné chybové stavy apod. Nechal jsem to tak záměrně kvůli jednoduchosti a pochopitelnosti ukázek. Každopádně pokud to budete někde implementovat, tak je nutné ještě ošetřit zejména následující věci:
- nepovedené instancování
TwiterOAuth
, - neúspěšné dotazy pro request token, access token, autentizační URL či jiné requesty,
- přímý přístup na callback URL, kdy není v sessions žádný request token uložen,
- totéž pro běžné requesty, pokud ještě nemáme uložen žádný access token,
- návrat uživatele po neúspěšné autentizaci, který se pozná tak, že na konci callback URL není za otazníčkem připojen parametr
oauth_token
, - někde na začátku skriptů se samozřejmě musí nastartovat sessions.
Před nedávnem jsem natrefil na mobilní stránku s přihlásením OAuth http://dabr.co.uk/