Yahoo! ID連携

PHP SDK

PHP SDK

PHPを用いたAuthorization Codeフローのサンプルコードの説明をします。

  • サポートバージョン
    • PHP 5.3 (5.3.x)以降(curl、json関連のパッケージが必要です)
  • SDK&サンプルコード


ライブラリーを読み込む

はじめに必要なライブラリーを読み込みます。ダウンロードしたSDKのlibディレクトリを任意の場所に配置、include_pathなどを設定してください。

sample.php
// Yahoo! ID連携ライブラリー読み込み
require("autoload.php");


Authorizationエンドポイントにリクエストして同意画面を表示する

YConnectClientクラスを使って同意画面にリダイレクトさせます。
YConnectClientクラスにはAuthorization Codeフローで必要なメソッドがすべて実装されています。

ClientCredentialクラス

メソッド 説明
public ClientCredential::__construct(string $client_id, string $client_secret) コンストラクタです。

YConnectClientクラス

メソッド 説明
public YConnectClient::__construct(ClientCredential $cred) コンストラクタです。
public void YConnectClient::requestAuth(string $redirect_uri, string $state, string $nonce, string $response_type [, array $scope, string $display, array $prompt]) Authorizationエンドポイントにリクエストして同意画面を表示します。

OAuth2ResponseTypeクラス

定義済み定数 説明
OAuth2ResponseType::CODE 認可コードを取得するための定数です。
OAuth2ResponseType::CODE_IDTOKEN 認可コードとIDトークンを取得するための定数です。

OIDConnectScopeクラス

定義済み定数 説明
OIDConnectScope::OPENID ユーザー識別子を取得するための定数です。
OIDConnectScope::PROFILE 姓名・生年・性別を取得するための定数です。
OIDConnectScope::EMAIL メールアドレスと確認済みフラグを取得するための定数です。
OIDConnectScope::ADDRESS ユーザー登録住所情報を取得するための定数です。

OIDConnectDisplayクラス

定義済み定数 説明
OIDConnectDisplay::DEFAULT_DISPLAY パソコン版のテンプレートを表示するための定数です。
OIDConnectDisplay::SMART_PHONE スマートフォン版のテンプレートを表示するための定数です。

OIDConnectPromptクラス

定義済み定数 説明
OIDConnectPrompt::DEFAULT_PROMPT ユーザーの認証、認可のための定数です。
OIDConnectPrompt::NONE 同意画面非表示のための定数です。(必須の場合はエラーが返却されます)
OIDConnectPrompt::CONSENT ユーザーの再認可のための定数です。
OIDConnectPrompt::LOGIN ユーザーの再認証のための定数です。
sample.php
use YConnect\Constant\OIDConnectDisplay;
use YConnect\Constant\OIDConnectPrompt;
use YConnect\Constant\OIDConnectScope;
use YConnect\Constant\ResponseType;
use YConnect\Credential\ClientCredential;
use YConnect\YConnectClient;
use YConnect\Credential\ClientCredential;
use YConnect\YConnectClient;

// アプリケーションID, シークレット
$client_id     = "YOUR_APPLICATION_ID";
$client_secret = "YOUR_SECRET";

// 各パラメータ初期化
$redirect_uri = "http://" . $_SERVER["SERVER_NAME"] . $_SERVER["PHP_SELF"];

// リクエストとコールバック間の検証用のランダムな文字列を指定してください
$state = "44Oq44Ki5YWF44Gr5L+644Gv44Gq44KL77yB";
// リプレイアタック対策のランダムな文字列を指定してください
$nonce = "5YOV44Go5aWR57SE44GX44GmSUTljqjjgavjgarjgaPjgabjgog=";

$response_type = OAuth2ResponseType::CODE_IDTOKEN;
$scope = array(
    OIDConnectScope::OPENID,
    OIDConnectScope::PROFILE,
    OIDConnectScope::EMAIL,
    OIDConnectScope::ADDRESS
);
$display = OIDConnectDisplay::DEFAULT_DISPLAY;
$prompt = array(
    OIDConnectPrompt::DEFAULT_PROMPT
);

// クレデンシャルインスタンス生成
$cred = new ClientCredential( $client_id, $client_secret );
// YConnectクライアントインスタンス生成
$client = new YConnectClient( $cred );
// Authorizationエンドポイントにリクエスト
$client->requestAuth(
    $redirect_uri,
    $state,
    $nonce,
    $response_type,
    $scope,
    $display,
    $prompt
);

実際の開発の際にはstate、nonceは固定の文字列ではなく独自の仕様でランダムな文字列を生成してデータベースなどに保存してください。stateはAuthorizationエンドポイントからのコールバックURL受け取り時に、nonceはIDトークンを復号時の検証に必要です。

各パラメーター値の詳細についてはAuthorizationエンドポイントを参照してください。



コールバックURLを受け取り、認可コードを抽出する

同意後に返されるコールバックURLを受け取り、認可コードなどを抽出します。

YConnectClientクラス

メソッド 説明
public mixed YConnectClient::getAuthorizationCode(string state) コールバックURLからAuthorizaiton Codeを抽出します。stateを検証して正しければAuthorizaiton Codeの値を、そうでなければfalseを返します。
sample.php
// 認可コードを取得
$code_result = $client->getAuthorizationCode( $state );

リクエスト時の値とレスポンスのstateの検証を内部で行っています。検証が正しい場合は、認可コードを返します。エラーレスポンスが返された場合は内部で例外処理を投げます。



Tokenエンドポイントにリクエストしてアクセストークンを取得する

取得した認可コードを用いてアクセストークン、リフレッシュトークンを取得します。

YConnectClientクラス

メソッド 説明
public void YConnectClient::requestAccessToken(string $returen_uri, string $code_result) Tokenエンドポイントにリクエストします。
public string YConnectClient::getAccessToken() アクセストークンを取得します。
public string YConnectClient::getAccessTokenExpiration() アクセストークンの有効期限を取得します。
public string YConnectClient::getRefreshToken() リフレッシュトークンを取得します。
sample.php
// Tokenエンドポイントにリクエスト
$client->requestAccessToken(
    $redirect_uri,
    $code_result
);
// アクセストークン、リフレッシュトークン
echo "ACCESS TOKEN : " . $client->getAccessToken() . "‹br/›‹br/›";
echo "REFRESH TOKEN: " . $client->getRefreshToken() . "‹br/›‹br/›";
echo "EXPIRATION   : " . $client->getAccessTokenExpiration() . "‹br/›‹br/›";


IDトークンを復号、検証してユーザー識別子を取得する

Authorizationエンドポイントリクエストのレスポンスタイプに「CODE_IDTOKEN」を指定している場合にはIDトークンを取得できます。ここではIDトークンを復号して検証します。検証結果が正しい場合、IDトークンオブジェクトとしてユーザー識別子を取得します。

YConnectClientクラス

メソッド 説明
public Boolean YConnectClient::verifyIdToken(string $nonce) IDトークンを検証します。
public IdToken YConnectClient::getIdToken() 復号されたIDトークンのオブジェクトを取得します。
sample.php
// IDトークンを検証
$client->verifyIdToken( $nonce );
echo "‹pre›" . print_r( $client->getIdToken(), true ) . "‹/pre›";

requestAccessTokenメソッドコールの直後にこの復号と検証を行ってください。検証に失敗した場合には内部で例外処理を投げます。正しく検証が行えた場合のみYahoo! ID連携の認証を認めてください。

各パラメーターはIDトークンオブジェクトのプロパティーに保持されているので必要に応じて参照してください。特別な場合を除き、IDトークンオブジェクト内の情報は保存する必要はありません。



UserInfo APIにリクエストしてユーザー識別子を取得する

アクセストークンを用いてユーザー識別子などを取得します。Authorizationエンドポイントリクエスト時に指定したScopeの情報(姓名・生年・性別、メールアドレス、登録住所情報など)が取得できます。

YConnectClientクラス

メソッド 説明
public void YConnectClient::requestUserInfo(string $access_token) UserInfo APIにリクエストします。
public mixed YConnectClient::getUserInfo() ユーザー識別子などを連想配列として取得します。
sample.php
// UserInfo APIにリクエスト
$client->requestUserInfo( $client->getAccessToken() );
// UserInfo情報を取得
echo "‹pre›" . print_r( $client->getUserInfo(), true ) . "‹/pre›";

各登録情報はUserInfoの連想配列に保持されているので必要に応じて参照してください。



アクセストークンを更新する

リフレッシュトークンをつかって有効期限切れのアクセストークンを更新します。

YConnectClientクラス

メソッド 説明
public void YConnectClient::refreshAccessToken(string $refresh_token) アクセストークンを更新します。
sample.php
// アクセストークンが有効期限切れであるかチェック
if( $ae->invalidToken() ) {
    try {
        // 保存していたリフレッシュトークンを指定してください
        $refresh_token = "STORED_REFRESH_TOKEN";
        // Tokenエンドポイントにリクエストしてアクセストークンを更新
        $client->refreshAccessToken( $refresh_token );
        echo "‹h1›Refresh Access Token Request‹/h1›";
        echo "ACCESS TOKEN : " . $client->getAccessToken() . "‹br/›‹br/›";
        echo "EXPIRATION   : " . $client->getAccessTokenExpiration();
    } catch ( OAuth2TokenException $te ) {
        // リフレッシュトークンが有効期限切れであるかチェック
        if( $te->invalidGrant() ) {
            // はじめのAuthorizationエンドポイントリクエストからやり直してください
            echo "‹h1›Refresh Token has Expired‹/h1›";
        }
    }
}

有効期限が切れのアクセストークンでAPI(ここではUserInfo API)にアクセスした場合、内部で例外処理を投げます。保存しておいたリフレッシュトークンでアクセストークンを更新してください。

アクセストークン更新時にリフレッシュトークンが有効期限切れだった場合には、Authorizationエンドポイントのリクエストからやり直してください。



アクセストークンなどの保存について

サーバー側でアクセストークン、リフレッシュトークン、IDトークン、UserInfo情報を保存する場合には外部から読み取られないように保存してください。



Yahoo!知恵袋で調べる