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()上記のすべてを配列で返す

この記事を書いた人
グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。