PHPでYahooのOAuthを試してみる
CentOSにPHPのとりあえずの開発環境を作成してみる
の続き
PHPでYahooのOAuthを試してみる。
【参考】 OAuth2.0でYahooに接続するphpエージェントを作る | ペンクおじさんのエンジニアブログ - Penq Inc. http://penq.co.jp/blog/engineer/oauth2-0/3142
※VirtualBoxのマシンのIPアドレスは「192.168.56.101」になってます。
サンプルプログラムの作成
index.php
<?php // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたアプリケーションIDを設定する)'); define('CALLBACK_URL', 'http://192.168.56.101/callback.php'); define('AUTH_URL', 'https://auth.login.yahoo.co.jp/yconnect/v1/authorization'); //-------------------------------------- // 認証ページにリダイレクト //-------------------------------------- $params = array( 'client_id' => CONSUMER_KEY, 'scope' => 'profile address email openid', 'response_type' => 'code', ); // リダイレクト header("Location: " . AUTH_URL . '?' . http_build_query($params));
callback.php
<?php // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたアプリケーションIDを設定する)'); define('CONSUMER_SECRET', '(控えておいたシークレットを設定する)'); define('CALLBACK_URL', 'http://192.168.56.101/callback.php'); // URL define('TOKEN_URL', 'https://auth.login.yahoo.co.jp/yconnect/v1/token'); define('INFO_URL', 'https://userinfo.yahooapis.jp/yconnect/v1/attribute?schema=openid'); //-------------------------------------- // アクセストークンの取得 //-------------------------------------- $params = array( 'code' => $_GET['code'], 'grant_type' => 'authorization_code', 'redirect_uri' => CALLBACK_URL, ); // POST送信 $options = array('http' => array( 'method' => 'POST', 'content' => http_build_query($params), 'header' => 'Authorization: Basic ' . base64_encode(CONSUMER_KEY.':'.CONSUMER_SECRET), )); $res = file_get_contents(TOKEN_URL, false, stream_context_create($options)); // レスポンス取得 $token = json_decode($res, true); if(isset($token['error'])){ echo 'エラー発生'; exit; } $access_token = $token['access_token']; //-------------------------------------- // ユーザー情報を取得してみる //-------------------------------------- $options = array('http' => array( 'method' => 'GET', 'header' => 'Authorization: Bearer ' . $access_token, )); $res = file_get_contents(INFO_URL, false, stream_context_create($options)); echo "<pre>" . print_r(json_decode($res, true), true) . "</pre>";
サンプルプログラムの確認
http://192.168.56.101/
にアクセスすると下記の画面が表示される。
[同意する]と
http://192.168.56.101/callback.php
が呼ばれ、ユーザー情報が表示される。
YConnectのライブラリを使う場合
下記のサイトからYConnect PHP SDKをダウンロードし、
libディレクトリを、index.phpやcallback.phpを同じ所に置く。
YConnect:PHPアプリ(Authorization Codeフロー) - Yahoo!デベロッパーネットワーク http://developer.yahoo.co.jp/yconnect/server_app/sample/php_explicit.html
また、下記のサイトからjwtをダウンロードし、
JWT.phpをlibディレクトリに置く。
luciferous/jwt https://github.com/luciferous/jwt
あとは、下記のような感じでプログラムを書けば同じように動作する。
index.php
<?php require("lib/YConnect.inc"); // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたアプリケーションIDを設定する)'); define('CONSUMER_SECRET', '(控えておいたシークレットを設定する)'); define('CALLBACK_URL', 'http://192.168.56.101/callback.php'); //-------------------------------------- // 認証ページにリダイレクト //-------------------------------------- $cred = new ClientCredential(CONSUMER_KEY, CONSUMER_SECRET); $client = new YConnectClient($cred); // セッションに保存 session_start(); $_SESSION['state'] = md5(microtime() . mt_rand()); $_SESSION['nonce'] = md5(microtime() . mt_rand()); // リダイレクト $client->requestAuth( CALLBACK_URL, $_SESSION['state'], $_SESSION['nonce'], OAuth2ResponseType::CODE_IDTOKEN, array( OIDConnectScope::OPENID, OIDConnectScope::PROFILE, OIDConnectScope::EMAIL, OIDConnectScope::ADDRESS ), OIDConnectDisplay::DEFAULT_DISPLAY, array(OIDConnectPrompt::DEFAULT_PROMPT) );
callback.php
<?php require("lib/YConnect.inc"); // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたアプリケーションIDを設定する)'); define('CONSUMER_SECRET', '(控えておいたシークレットを設定する)'); define('CALLBACK_URL', 'http://192.168.56.101/callback.php'); //-------------------------------------- // アクセストークンの取得 //-------------------------------------- $cred = new ClientCredential(CONSUMER_KEY, CONSUMER_SECRET); $client = new YConnectClient($cred); // セッションから取得 session_start(); $state = $_SESSION['state']; // 認可コードを取得 $code_result = $client->getAuthorizationCode($state); // アクセストークンをリクエスト $client->requestAccessToken( CALLBACK_URL, $code_result ); //-------------------------------------- // ユーザー情報を取得してみる //-------------------------------------- $client->requestUserInfo($client->getAccessToken()); echo "<pre>" . print_r($client->getUserInfo(), true) . "</pre>";