PHP SDK
PHP SDK
PHPを用いたAuthorization Codeフローのサンプルコードの説明をします。
- サポートバージョン
- PHP 5.3 (5.3.x)以降(curl、json関連のパッケージが必要です)
- curl 7.34.0以降
- openssl 1.0.1以降
- SDK&サンプルコード
- Yahoo! ID連携 PHP SDK(外部サイト)
- ダウンロード(外部サイト)
- Yahoo! ID連携 PHP 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 = "https://" . $_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情報を保存する場合には外部から読み取られないように保存してください。