PHP SDK

PHP SDK

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

ライブラリーを読み込む

Yahoo! ID連携 PHP SDKのREADMEをご覧ください。

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

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

ClientCredentialクラス

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

YConnectClientクラス

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

OAuth2ResponseTypeクラス

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

OIDConnectScopeクラス

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

OIDConnectDisplayクラス

定義済み定数 説明
OIDConnectDisplay::DEFAULT_DISPLAY
UserAgentに適した形でページを表示するための定数です。
OIDConnectDisplay::DEFAULT_PC
パソコン版のテンプレートを表示するための定数です。
OIDConnectDisplay::SMART_PHONE
スマートフォン版のテンプレートを表示するための定数です。
OIDConnectDisplay::POPUP
ポップアップ版のテンプレートを表示するための定数です。
OIDConnectDisplay::NATIVE_APP
ネイティブアプリ版のテンプレートを表示するための定数です。

OIDConnectPromptクラス

定義済み定数 説明
OIDConnectPrompt::DEFAULT_PROMPT
ユーザーの認証、認可のための定数です。
OIDConnectPrompt::NONE
同意画面非表示のための定数です。(必須の場合はエラーが返却されます)
OIDConnectPrompt::CONSENT
ユーザーの再認可のための定数です。
OIDConnectPrompt::LOGIN
ユーザーの再認証のための定数です。
OIDConnectPrompt::SELECT_ACCOUNT
ユーザーのID切替のための定数です。
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 = "https://" . $_SERVER["SERVER_NAME"] . $_SERVER["PHP_SELF"];
 
// リクエストとコールバック間の検証用のランダムな文字列を指定してください
$state = "44Oq44Ki5YWF44Gr5L+644Gv44Gq44KL77yB";
// リプレイアタック対策のランダムな文字列を指定してください
$nonce = "5YOV44Go5aWR57SE44GX44GmSUTljqjjgavjgarjgaPjgabjgog=";
// 「code verifier」としてトークン置き換え攻撃対策のランダムな文字列を指定してください
// https://datatracker.ietf.org/doc/html/rfc7636#section-4.1
$plain_code_challenge = "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM";
 
$response_type = OAuth2ResponseType::CODE;
$scope = array(
    OIDConnectScope::OPENID,
    OIDConnectScope::PROFILE,
    OIDConnectScope::EMAIL,
    OIDConnectScope::ADDRESS
);
$display = OIDConnectDisplay::DEFAULT_DISPLAY;
$prompt = array(
    OIDConnectPrompt::DEFAULT_PROMPT
);
$max_age = 3600;
 
// クレデンシャルインスタンス生成
$cred = new ClientCredential($client_id, $client_secret);
// YConnectクライアントインスタンス生成
$client = new YConnectClient($cred);
// Authorizationエンドポイントにリクエスト
$client->requestAuth(
    $redirect_uri,
    $state,
    $nonce,
    $response_type,
    $scope,
    $display,
    $prompt,
    $max_age,
    $plain_code_challenge,
);

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

plain_code_challengeはS256としてSDK内でCode Challengeに変換され、クエリパラメータに含まれます。

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

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

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

YConnectClientクラス

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

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

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

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

YConnectClientクラス

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

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

ここではIDトークンを復号して検証します。検証結果が正しい場合、IDトークンオブジェクトとしてユーザー識別子を取得します。

YConnectClientクラス

メソッド 説明
public Boolean YConnectClient::verifyIdToken(
    string $nonce,
    string $access_token
)
IDトークンを検証します。
public IdToken YConnectClient::getIdToken()
復号されたIDトークンのオブジェクトを取得します。
// IDトークンを検証
$client->verifyIdToken($nonce, $access_token);
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)
属性取得API(UserInfoAPI)にリクエストします。
public mixed YConnectClient::getUserInfo()
ユーザー識別子などを連想配列として取得します。
// UserInfo APIにリクエスト
$client->requestUserInfo( $client->getAccessToken() );
// UserInfo情報を取得
echo "<pre>" . print_r( $client->getUserInfo(), true ) . "</pre>";

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

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

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

メソッド 説明
public void YConnectClient::refreshAccessToken(string $refresh_token)
アクセストークンを更新します。
// アクセストークンが有効期限切れであるかチェック
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 $token_exception ) {
        // リフレッシュトークンが有効期限切れであるかチェック
        if( $token_exception->invalidGrant() ) {
            // はじめのAuthorizationエンドポイントリクエストからやり直してください
            echo "<h1>Refresh Token has Expired</h1>";
        }
    }
}

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

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

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

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

アプリケーションの管理

Yahoo! ID連携 v2

開発のヒント