Yahoo! ID連携

IDトークンについて

IDトークンとは

IDトークンとはユーザー認証情報を含む改ざん検知用の署名付きトークンであり、JWT(JSON Web Token)フォーマットでエンコードされています。Yahoo! ID連携では、JWTの署名生成アルゴリズムとしてHMACーSHA256を採用しています。

Yahoo! ID連携を利用するクライアントでYahoo! JAPAN IDをベースにユーザー認証を行う場合は、アクセストークンやリフレッシュトークンではなく必ずIDトークンに含まれる認証情報を元にユーザーセッション管理を行ってください。



IDトークンを構成するパラメーター

パラメーター 返却する属性 実際の値のサンプル
iss IDトークンの発行元 https://auth.login.yahoo.co.jp
user_id ユーザー識別子
(26文字固定長)
KVNE5DZLWIY4Y57TRDLURJOOEU
aud IDトークンの発行対象のアプリケーションID
(最大255Byteの可変長文字列)
dj0zaiZpPWxCUTczV01KazczNSZzPWNvbnN1bWVyc2VjcmV0Jng9NDc-
exp IDトークンの有効期限の時刻のUNIXタイムスタンプ 1350366631
iat IDトークンの発行時刻のUNIXタイムスタンプ 1347947431
nonce Authorizationリクエスト時に送信したnonce値 ad1399ba48948e34b1047870dc7dbb26


IDトークンの正当性の検証手順

サーバーサイドアプリケーション

サーバーサイドアプリケーションの場合はシークレットを用いてIDトークンの検証することが可能です。検証には以下のライブラリが利用可能です。
https://github.com/luciferous/jwt(外部サイト)

  1. Authorizationリクエスト時に送信するstate値とnonce値を保存します。
  2. Authorizationエンドポイントのresponse_typeにid_tokenを含めたリクエストを送信し、エンドユーザーに認証・認可をさせます。
  3. リダイレクトされたときのstate値がAuthorizationリクエスト時のstate値と一致することを確認します。
  4. id_tokenパラメーターをbase64デコードします。
  5. JWTのヘッダー部とペイロード部とシグネチャー部の3つへ「.」(ドット)で分割します。
  6. アプリケーションID発行時のシークレットを用いて、ペイロード部をHMAC-SHA256によって生成した値とシグネチャー部の文字列が一致することを確認します。
  7. id_token発行元がYahoo! JAPANであることを確認します。
    • issの値が"https://auth.login.yahoo.co.jp"と一致すること確認します。
  8. id_token発行対象のアプリケーションIDであることを確認します。
    • audの値が発行時のアプリケーションIDと一致することを確認します。
  9. id_tokenが有効期限内であることを確認します。
    • 現在時刻のタイムスタンプ値がexpの値より小さいことを確認します。
  10. id_tokenが発行後10分以内であることを確認します。
    • iatの値が、「(現在時刻のタイムスタンプ値)-(600秒)」以上であることを確認します。
  11. id_token内のnonce値がAuthorizationリクエスト時に送信したnonce値と一致することを確認します。
    • nonce値が、データベースにストアしてあるnonceと一致することを確認します。
    • リプレイアタックを防止するため、確認済のnonce値はデータベースから破棄します。

クライアントサイドアプリケーション

クライアントサイドアプリケーションでは、必ずCheckTokenエンドポイントを利用し、発行されたIDトークンの正当性の検証をする必要があります。

  1. Authorizationリクエスト時に送信するstate値とnonce値を保存します。
  2. Authorizationエンドポイントのresponse_typeにid_tokenを含めたリクエストを送信し、エンドユーザーに認証・認可をさせます。
  3. リダイレクトされた時のstate値がAuthorizationリクエスト時のstate値と一致することを確認します。
  4. CheckTokenエンドポイントにid_tokenをパラメーターとしてリクエスト送信します。
  5. id_token発行元がYahoo! JAPANであることを確認する。
    • issの値が"https://auth.login.yahoo.co.jp"と一致すること確認します。
  6. id_token発行対象のアプリケーションIDであることを確認します。
    • audの値が発行時のアプリケーションIDと一致することを確認します。
  7. id_tokenが有効期限内であることを確認します。
    • 現在時刻のタイムスタンプ値がexpの値より小さいことを確認します。
  8. id_tokenが発行後10分以内であることを確認します。
    • iatの値が、「(現在時刻のタイムスタンプ値)-(600秒)」以上であることを確認します。
    • クライアントサイドアプリケーションではエンドユーザーが端末側の時刻設定を手動で現在時刻と異なる時刻に設定している場合があるため、サーバーから返却される現在時刻を比較対象のタイムスタンプとして利用することを推奨します。
  9. id_token内のnonce値がAuthorizationリクエスト時に送信したnonce値と一致することを確認します。
    • nonce値が、データベースにストアしてあるnonceと一致することを確認します。
    • リプレイアタックを防止するため、確認済のnonce値はデータベースから破棄します。


Yahoo!知恵袋で調べる