Přejít k navigační liště

Zdroják » Různé » Přihlašování k Twitteru pomocí OAuth

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

Články Různé

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.

Nálepky:

(Č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
key
a Consumer 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.

Komentáře

Odebírat
Upozornit na
guest
1 Komentář
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
Zobrazit všechny komentáře
ouagadougou

Před nedávnem jsem natrefil na mobilní stránku s přihlásením OAuth http://dabr.co.uk/

Přístupnost není jen o splnění norem: nový pohled na inkluzivní design

Přístupnost a inkluze možná nepatří mezi nejžhavější témata digitálního světa – dokud o nich nezačne mluvit Vitaly Friedman. Na WebExpo 2024 předvedl, že inkluzivní design není jen o splněných checkboxech, ale hlavně o lidech. S energií sobě vlastní obrátil zažité přístupy naruby a ukázal, že skutečně přístupný web je nejen možný, ale i nezbytný.

Efektivnější vývoj UI nebo API: Co si odnést z WebExpo 2025?

Různé
Komentáře: 0
Jak snadno implementovat moderní uživatelské rozhraní? Které funkce brzdí rychlost vašeho webu? A kdy raději sami přibrzdit, abychom využitím AI nepřekročili etické principy? Debatu aktuálních dev témat rozdmýchá sedmnáctý ročník technologické konference WebExpo, která proběhne v Praze od 28. do 30. května. Který talk či workshop si rozhodně nenechat ujít? Toto je náš redakční výběr z vývojářských hroznů.

Zapřáhněte AI jako nikdy předtím. Květnová konference WebExpo přivítá hvězdy technologického světa

Od 28. do 30. května 2025 promění pražský Palác Lucerna na tři dny technologická konference WebExpo. Na programu je více než 80 přednášek a workshopů od expertů z celého světa. WebExpo tradičně propojuje vývojáře, designéry, marketéry i byznysové lídry a nabízí praktické dovednosti, strategické myšlení a přináší nejnovější trendy nejen v oblasti AI.