ID Token
ID Token とはユーザー認証情報を含む改ざん検知用の暗号署名付き Token です。JWT(JSON Web Token)フォーマットで Base64URL エンコードされています。 ソーシャルPLUS では、JWT の署名生成アルゴリズムとして RSA-SHA256 を採用しています。 取得した ID Token を使用する前に ID Token の検証 を行ってください。
JWT の詳細な仕様については以下をご参照ください。
ID トークンは機密情報であり、傍受されると不正使用される可能性があります。
ヘッダー
パラメーター | 必須 | 説明 |
---|---|---|
typ | ○ | JWT 固定 |
kid | ○ | 署名検証に用いる公開鍵の Key ID Cert エンドポイント で得られる JWK の kid の値に一致する。 |
alg | ○ | RS256 固定。署名のアルゴリズム |
ペイロード
パラメーター | 型 | 必須 | Scope | 説明 |
---|---|---|---|---|
iss | string | ○ | 発行者の識別子。サービス設定ごとに自動で発行される「サービスID」の値 | |
aud | string | ○ | 受信者の識別子。クライアント情報の Client ID の値 | |
sub | string | ○ | ソーシャルPLUS ID | |
iat | number | ○ | ID Token の発行時刻。UNIX タイムスタンプ | |
exp | number | ○ | ID Token の有効期限。UNIX タイムスタンプ | |
nonce | string | ※ | リプレイアタック防止のランダム値 ※Authorization エンドポイントのリクエスト時に nonce パラメータを指定した場合に含まれます。 | |
c_hash | string | ※ | Authorization Code のハッシュ値 ※Authorization エンドポイントのリクエスト時の response_type パラメーターに code id_token を指定した場合に含まれます。 | |
primary_key | string | ※ | お客様サービス側ユーザID | |
provider | string | ○ | ログインプロバイダ(line , apple , yahoo , google , x ) | |
provider_uid | string | ○ | ログインプロバイダ側で発行されたユーザー識別子 | |
name | string | profile | フルネーム | |
name#ja-Kana-JP | string | profile | フルネーム(カナ表記) | |
family_name | string | profile | 姓 | |
family_name#ja-Kana-JP | string | profile | 姓(カナ表記) | |
given_name | string | profile | 名 | |
given_name#ja-Kana-JP | string | profile | 名(カナ表記) | |
middle_name | string | profile | ミドルネーム | |
preferred_username | string | profile | ユーザー名 | |
profile | string | profile | プロフィールページの URL | |
picture | string | profile | プロフィール画像の URL | |
website | string | profile | ウェブサイトの URL | |
gender | string | profile | 性別 ・男性 male ・女性 female ・その他 other | |
birthdate | string | profile | 生年月日 | |
updated_at | string | profile | ユーザー情報の更新日時 | |
string | メールアドレス | |||
phone_number | string | phone | 電話番号 | |
address | Address object | address | Address オブジェクト 参照 |
Address オブジェクト
パラメーター | 型 | 必須 | 説明 |
---|---|---|---|
formatted | string | 住所全体。region, locality, street_address を半角スペースで結合した値 | |
street_address | string | 番地以降 | |
locality | string | 市区町村 | |
region | string | 都道府県 | |
postal_code | string | 郵便番号 |
検証方法
ID Token を取得したら、以下の手順を参考に検証を行ってください。とくに明記していない限りすべての検証が必須です。JWT 対応のライブラリを用いる場合は各ライブラリに従って適宜必要な処理を行ってください。
-
JWT はピリオド
.
で区切られた Header, Payload, Signature の3つで構成されています。それぞれの値を Base64URL でデコードします。 -
検証のために Cert エンドポイント で公開鍵を取得します。
-
Header に含まれる kid と、Cert エンドポイントで取得した公開鍵データの kid が一致するものを用いて、Base64URL デコード前の
Header + '.' + Payload
に対して Signature が正しい署名であることを検証します。署名生成アルゴリズムは RS256(RSA-SHA256)です。 -
発行者 iss の値が、サービス設定ごとに自動で発行される「サービスID」の値と等しいことを確認します。サービス設定ごとに発行される「サービスID」はあらかじめ、ソーシャルログインマネージャー でサービス選択後のヘッダーメニューからコピーして確認することが可能です。
-
受信者 aud の値が、クライアント情報の Client ID の値と等しいことを確認します。
-
(Hybrid フロー利用時)認可コードの置き換え攻撃を防ぐために、認可コード code の値を SHA256 でハッシュ化し、オクテットの前部を Base64URL エンコードした文字列と c_hash の値が等しいことを確認します。
-
ID Token の有効期限 exp が切れていないことを確認します。
-
(Implicit フローまたは Hybrid フロー利用時。ご利用サービス側で必要であれば)ID Token の発行時刻 iat が許容範囲内であるか確認します。Authorization エンドポイント へのリクエスト時にご利用サービス側で nonce を保存してから ID Token を受け取るまでの所要時間を目安として、サービスのポリシーで所要時間を決めてください。
-
(Implicit フローまたは Hybrid フロー利用時。ユーザー認証リクエスト時に nonce を指定した場合)Authorization エンドポイント へのリクエスト時に送信した nonce の値と、ID Token で返された nonce の値が等しいことを確認します。
- 3. 〜 6. および 9. の手順のなかで検証に失敗する場合は、ID Token が改ざんされている可能性があるため認証処理を中断し、エラー処理などを行います。
- 7. および 8. の手順で検証に失敗する場合は、ID Token の有効期限や認証時刻を超過しているため認証処理を中断し、再度ソーシャルログインをユーザー認証リクエストからやりなおします。
値の利用
ユーザーの識別には、ソーシャルPLUS ID sub または、お客様サービス側ユーザID primary_key の値を利用します。
ソーシャルログイン時に利用されたログインプロバイダ provider により発行されたユーザー識別子(たとえば LINE が発行した userId の値など)を直接取得したい場合は provider_uid から取得できます。
email や phone_number フィールドの値をユーザーの一意の識別子として使用しないでください。メールアドレスや電話番号はユーザーにより任意で変更される可能性があります。ユーザーの同意が得られない場合は、値がそのものが返されないこともあります。