oauth2-yahoo-japan を公開しました
PHP で Oauth 2 クライアント(ものすごく簡略化すると「〇〇でログイン」みたいなもの)を実装する際に使うライブラリに、The PHP League OAuth2-Client というものがあります。このライブラリを使って自作する以外にも、先人が作ったものを利用することができます。こちらのリストを見ると、有名どころはひと通りカバーされているのですが、Yahoo! Japan(Yahoo! ID連携 v2)に対応しているものがなかったので作成し、Packagist で公開してみました。公開ページはこちらです。
インストール方法
インストール方法は、他のパッケージと同様
composer require gn-office/oauth2-yahoo-japan
で関連パッケージもあわせてインストールできます。
サンプル
使い方ですが、ひとつのファイルでトークンの取得からユーザー情報の取得まで行うのであれば、以下のような感じになります。clientId、clientSecretは、Yahoo! デベロッパーネットワークでアプリを作成したときに表示されたものを、redirectUri にはコールバック URL として登録したものを記載してください。
<?php
require_once '/path/to/vendor/autoload.php';
use GNOffice\OAuth2\Client\Provider\YahooJapan;
session_start();
$provider = new YahooJapan([
'clientId' => '{yconnect-client-id}',
'clientSecret' => '{yconnect-client-secret}',
'redirectUri' => 'https://example.com/callback-url',
]);
// 認証コードの取得
if (!isset($_GET['code'])) {
// 認証用 URL の取得
$authorizationUrl = $provider->getAuthorizationUrl();
// CSRF 対策のパラメータ(state)をセッションに保存
$_SESSION['oauth2state'] = $provider->getState();
// リプレイアタック対策のパラメータ(nonce)をセッションに保存
$_SESSION['oauth2nonce'] = $provider->getNonce();
// 認可コード横取り攻撃対策(PKCE)のパラメーター(code_verifier)をセッションに保存
$_SESSION['oauth2code_verifier'] = $provider->getCodeVerifier();
// 認証用 URL にリダイレクト
header('Location: ' . $authorizationUrl);
exit;
// Check for errors
} elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) {
if (isset($_SESSION['oauth2state'])) {
unset($_SESSION['oauth2state']);
}
exit('Invalid state');
} else {
// アクセストークンの取得
try {
$accessToken = $provider->getAccessToken('authorization_code', [
'code' => $_GET['code'],
'code_verifier' => $_SESSION['oauth2code_verifier']
]);
try {
$nonce = $_SESSION['oauth2nonce'];
$token_values = $accessToken->getValues();
$id_token = $token_values['id_token'];
$access_token = $accessToken->getToken();
// アクセストークンの検証
$verify_token = $provider->verifyToken($id_token, $access_token, $nonce);
// ユーザー情報の取得
$user = $provider->getResourceOwner($accessToken);
printf('Hello %s!', $user->getName());
} catch (GNOffice\OAuth2\Client\Provider\Exception\InvalidTokenException $e) {
exit($e->getMessage());
}
} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
// Failed to get the access token or user details.
exit($e->getMessage());
}
}
ユーザー情報取得メソッドの一覧
ユーザー情報の取得に関するメソッドは、例に挙げている getName() 以外にもいくつか用意しています。どの値が取得できるかはアクセストークン取得時の scope パラメータによって異なります。詳しくは属性取得API(UserInfoAPI)の説明ページを参照してください。
メソッド名 | 取得できる値 |
---|---|
getId() | ユーザー識別子(GUID) |
getName() | 姓名 |
getFirstName() | 名 |
getLastName() | 姓 |
getNickname() | ニックネーム |
getPicture() | プロフィール画像URL |
getEmail() | メールアドレス |
getAddress() | 住所の配列 ['country’] 国コード ['postal_code’] 郵便番号 ['region’] 都道府県 ['locality’] 市町村 ['formatted’] 都道府県 + 市区町村 |
toArray() | 上記のすべてを配列で返す |
ディスカッション
コメント一覧
まだ、コメントがありません