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」になってます。

アプリケーションの登録

下記のページにアクセスして、アプリケーションを作成する。
https://e.developer.yahoo.co.jp/dashboard/

アプリケーション名やURLを設定する。

「アプリケーションID」と「シークレット」を控えておく。


あと、アプリケーションの[編集]から

コールバックURLを設定する。

サンプルプログラムの作成

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>";