Protokół OAuth w PHP

OAuth to otwarty protokół pozwalający na bezpieczną autoryzację za pomocą API dla aplikacji desktopowych, mobilnych i aplikacji internetowych. OAuth pozwala użytkownikowi dać dostęp do jego informacji, opcji na stronie A (dostawcy OAuth, np. Twitter) innej stronie B (konsumentowi) bez podawania pełnych danych uwierzytelniających (np. bez podawania loginu i hasła). Standard te obecnie jest implementowany na coraz większej ilości strony, jako że pozwala im wystawiać bezpieczniejsze API, jak i dające pewność użytkownikami co zewnętrzna strona z nimi zrobi. Przykładowa prosta aplikacja webowa przedstawiona jest na twitteroauth.appspot.com - gdzie poprzez OAuth udostępniamy stronie ostatnie tweety z naszego konta na Tweeterze.

Lista dostawców, czyli stron udostępniających API poprzez OAuth jest dość długa. Na liście tej znajdziemy Twittera, Google, MySpace, czy także Gadu Gadu. Dla twórców konsumentów - stron korzystających z takiego API dostępne jest wiele bibliotek dla różnych języków programistycznych.

OAuth i PHP

Oprócz prostej biblioteki OAuth na oauth.googlecode.com jest dostępne także binarne rozszerzenie na pecl.php.net. Obie biblioteki posiadają przykładowe skrypty. Dodatkowo znaleźć można w sieci różne gotowe skrypty i biblioteki na API OAuth różnych serwisów (jak np. dla Twittera). Rozszerzenie z pecl kompilujemy i instalujemy standardowo:
phpize
./configure
make
make install
Do php.ini dodajemy extension=oauth.so;.

Tworzymy konsumenta dla Twittera w PHP

  • Zaczynamy od zarejestrowania klienta/konsumenta na http://twitter.com/oauth_clients. Podajemy nazwę naszej "aplikacji", a także jej typ (aplikacja webowa) i adres callback - adres URL na naszej stronie, na który zostanie przekierowany użytkownik po pomyślnej autoryzacji na stronie Twittera.
    oauth1
  • Po udanym zarejestrowaniu aplikacji wygenerowany zostanie klucz Consumer key oraz Consumer secret, a także podane zostaną podstawowe adresy URL API potrzebne przy wykorzystaniu API:
    • Request token URL: http://twitter.com/oauth/request_token
    • Access token URL: http://twitter.com/oauth/access_token
    • Authorize URL: http://twitter.com/oauth/authorize
  • Korzystając z binarnego rozszerzenia z Pecl kod do uwierzytelnienia użytkownika wygląda tak:
    <?php
    // inicjalizacja
    $oauth = new OAuth("Consumer Key tutaj","Consumer secret tutaj",OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
    // pobieranie tokena żądania (request token)
    $request_token_info = $oauth->getRequestToken("http://twitter.com/oauth/request_token");
    // zapisujemy oauth_token_secret do pliku
    file_put_contents("token.txt",$request_token_info['oauth_token_secret']);
    // przekierowujemy użytkownika na stronę logowania:
    header('Location: http://twitter.com/oauth/authorize?oauth_token='.$request_token_info['oauth_token']);
    
    oauth2
  • Po udanym zalogowaniu na Tweeterze użytkownik zostanie przekierowany na adres URL podany jako callback. Oto przykład kodu obsługującego zwrotkę:
    <?php
    $oauth = new OAuth("Consumer Key tutaj","Consumer secret tutaj",OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
    // wczytujemy oauth_token_secret
    $request_token_secret = file_get_contents("token.txt");
    if(!empty($_GET['oauth_token'])){
    $oauth->setToken($_GET['oauth_token'],$request_token_secret);//user allowed the app, so u
    $access_token_info = $oauth->getAccessToken('http://twitter.com/oauth/access_token');
    // żądamy przykładową metodę API:
    $data = $oauth->fetch('http://twitter.com/account/verify_credentials.json');
    if($data){
        $response_info = $oauth->getLastResponse();
        echo "<pre>";
        print_r(json_decode($response_info));
        echo "</pre>";
        }
    }
    
Nie trzeba stosować binarnych rozszerzeń. Można także wykorzystać biblioteki napisane w czystym PHP, np. twitteroauth. Pobieramy kod za pomocą GITa (lub ręcznie jak go nie masz):
git clone git://github.com/abraham/twitteroauth.git
I edytujemy plik example/index.php wstawiając klucz i consumer secret.

Jeżeli chcesz umożliwić rejestrację/logowanie użytkowników za pomocą konta na Twitterze to prostszym rozwiązaniem może okazać się zastosowanie RPXnow.

RkBlog

PHP w Akcji, 17 October 2009

Comment article
Comment article RkBlog main page Search RSS Contact