PHP SDK
PHP SDK
PHPを用いたAuthorization Codeフローのサンプルコードの説明をします。
-
サポートバージョン
- PHP 5.6以降
- curl 7.52.1以降
- openssl 1.1.0以降
-
SDK & サンプルコード
- Yahoo! ID連携 PHP SDK(外部サイト)
- ダウンロード(外部サイト)
ライブラリーを読み込む
Yahoo! ID連携 PHP SDKのREADMEをご覧ください。
Authorizationエンドポイントにリクエストして同意画面を表示する
YConnectClientクラスを使って同意画面にリダイレクトさせます。
YConnectClientクラスにはAuthorization
Codeフローで必要なメソッドがすべて実装されています。
ClientCredentialクラス
メソッド | 説明 |
---|---|
|
コンストラクタです。 |
YConnectClientクラス
メソッド | 説明 |
---|---|
|
コンストラクタです。 |
|
Authorizationエンドポイントにリクエストして同意画面を表示します。 |
OAuth2ResponseTypeクラス
定義済み定数 | 説明 |
---|---|
|
認可コードを取得するための定数です。 |
OIDConnectScopeクラス
定義済み定数 | 説明 |
---|---|
|
ユーザー識別子を取得するための定数です。 |
|
姓名・生年・性別を取得するための定数です。 |
|
メールアドレスと確認済みフラグを取得するための定数です。 |
|
ユーザー登録住所情報を取得するための定数です。 |
OIDConnectDisplayクラス
定義済み定数 | 説明 |
---|---|
|
UserAgentに適した形でページを表示するための定数です。 |
|
パソコン版のテンプレートを表示するための定数です。 |
|
スマートフォン版のテンプレートを表示するための定数です。 |
|
ポップアップ版のテンプレートを表示するための定数です。 |
|
ネイティブアプリ版のテンプレートを表示するための定数です。 |
OIDConnectPromptクラス
定義済み定数 | 説明 |
---|---|
|
ユーザーの認証、認可のための定数です。 |
|
同意画面非表示のための定数です。(必須の場合はエラーが返却されます) |
|
ユーザーの再認可のための定数です。 |
|
ユーザーの再認証のための定数です。 |
|
ユーザーの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クラス
メソッド | 説明 |
---|---|
|
コールバックURLからAuthorizaiton Codeを抽出します。stateを検証して正しければAuthorizaiton Codeの値を、そうでなければfalseを返します。 |
// 認可コードを取得
$code_result = $client->getAuthorizationCode( $state );
リクエスト時の値とレスポンスのstateの検証を内部で行っています。検証が正しい場合は、認可コードを返します。エラーレスポンスが返された場合は内部で例外処理を投げます。
Tokenエンドポイントにリクエストしてアクセストークンを取得する
取得した認可コードを用いてアクセストークン、リフレッシュトークンを取得します。
YConnectClientクラス
メソッド | 説明 |
---|---|
|
Tokenエンドポイントにリクエストします。 |
|
アクセストークンを取得します。 |
|
アクセストークンの有効期限を取得します。 |
|
リフレッシュトークンを取得します。 |
// 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クラス
メソッド | 説明 |
---|---|
|
IDトークンを検証します。 |
|
復号された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クラス
メソッド | 説明 |
---|---|
|
属性取得API(UserInfoAPI)にリクエストします。 |
|
ユーザー識別子などを連想配列として取得します。 |
// UserInfo APIにリクエスト
$client->requestUserInfo( $client->getAccessToken() );
// UserInfo情報を取得
echo "<pre>" . print_r( $client->getUserInfo(), true ) . "</pre>";
各登録情報はUserInfoの連想配列に保持されているので必要に応じて参照してください。
アクセストークンを更新する
リフレッシュトークンをつかって有効期限切れのアクセストークンを更新します。
メソッド | 説明 |
---|---|
|
アクセストークンを更新します。 |
// アクセストークンが有効期限切れであるかチェック
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
- Yahoo! ID連携とは
- ガイドラインを確認する
- Yahoo! JAPAN IDを取得する
- Client IDを登録する
- 各種フロー
- ネイティブアプリを開発
- 属性取得API(UserInfoAPI)
- ID Token
- JavaScript SDK
- PHP SDK
- Java SDK
- デザインガイドライン
- APIアクセス実装方法
- Yahoo! ID連携用語集
- FAQ