YahooID連携を試してみた-2

前回からの続きです。前回からかなり時間が立っていて若干今更感がありますが。。。申し訳ないです。。。

ということで、今回は③アクセストークンの取得の部分を作ってみようと思います。

アクセストークン、IDトークンを取得

TokenエンドポイントからアクセストークンとIDトークンを取得できます。

https://developer.yahoo.co.jp/yconnect/v2/authorization_code/token.html

前回の「ログイン画面を表示してみた」の後、Yahooのログイン画面でログインをすると、WEBアプリにリダイレクトされます。

その際にGETパラメータで「code(認可コード)」が渡されます。その「code」を使いトークンを取得します。

最低限必要なリクエストパラメータは、「grant_type」「redirect_uri」「code」 のようです。

// Tokenエンドポイントに送信するデータ
$data = [
    "grant_type" => "authorization_code",
    "redirect_uri" => "http://localhost/y_id_sample",
    "code" => $_GET["code"]
];

また、TokenエンドポイントはBasic認証が掛かっています。

Client IDとClient Secretを”:”(コロン)で連結し、Base64エンコードを行って、Authorizationヘッダーで送信する必要があります。

Client IDとClient Secretは、アプリケーションの管理から確認できます。

// 発行されたクライアントID
$client_id = "sample";
$secret = "sample_secret";

// ヘッダー
$header = array(
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: ".strlen($data),
    "Authorization: Basic " . base64_encode($client_id . ":" . $secret),
);

上記で記載したリクエストヘッダーとパラメータを送信します。

そうすると、アクセストークンとIDトークンが取得できます。

レスポンスはJSON形式なので、json_decode($tokenApiResponse,true);でデコードしましょう。

// context
$context = array(
    "http" => array(
        "method"  => "POST",
        "header"  => implode("\r\n", $header),
        "content" => $data,
        "ignore_errors" => '1'
    )
);

// Tokenエンドポイントにリクエストを送信して結果を取得
$token_api_url = $open_id_conf["token_endpoint"];
$tokenApiResponse = file_get_contents($token_api_url, false, stream_context_create($context));

// jsonデコード
$tokenApiResponse = json_decode($tokenApiResponse,true);
if (isset($tokenApiResponse['error'])) {
    // エラーの場合は、ログイン画面にリダイレクト
    return header("Location: login.php");
}

エラーなく取得できている場合は、以下のパラメターが返ってくるはずです。

  • access_token
  • token_type
  • refresh_token
  • expires_in
  • id_token

これでアクセストークン、IDトークンの取得は完了です。

次回は④のIDトークンの検証などをやってみようと思います。