+ 作るログイン
図を読み込んでいます…
1 / 7
図でつながる 認証と暗号の基礎 / 全9章

OIDC ― OAuthに認証結果を伝える仕組みを足す

発行
アニメモ公式
版
第2版
改訂
コマ
全7

IDトークンとアクセストークンを色分けし、nonce・issとsub・UserInfoの役割を整理します。

OAuthに、認証結果を伝える層を足す

OpenID Connect(OIDC)は、OAuth 2.0を土台に、利用者の認証結果をクライアントへ伝える仕組みです。ログインを受け入れるアプリをRP、認証を行う提供者をOPと呼びます。

OAuthのアクセストークンはAPIへのアクセス用でした。OIDCでは、それに加えてIDトークンという認証結果を使います。OpenID Connect Core

この教材はAuthorization Code Flowの例です。画面の雰囲気だけで「OAuthログイン」と覚えず、何がアプリへ返るかを追ってみましょう。

  • 08 / SECURITY NOTES
  • 1 / 7
  • OAuthに、認証結果を伝える層を足す
  • OIDC:認証結果を伝える
  • OAuth 2.0:アクセスを委ねる土台
  • IDトークンはアプリ向けの認証結果。

openidスコープを付けて、認証を依頼する

アプリは scope=openid を含む認証リクエストを送ります。必要に応じて profile なども要求します。PKCEやリクエストとの対応確認も、採用するフローに従って組み込みます。

この例では、リクエストにランダムな nonce を付け、アプリ側に記憶します。IDトークンに返る値と照合するためです。

nonce とPKCEの code_verifier は別の値です。前者はIDトークンと認証リクエストを結び付け、後者は認可コードの交換を保護します。認証リクエスト

  • 08 / SECURITY NOTES
  • 2 / 7
  • openidスコープで、認証を依頼
  • アプリ / RP
  • 認証提供者 / OP
  • UserInfo
  • CLIENT
  • AUTHORIZATION
  • RESOURCE
  • scope: openid
  • nonce = n1 を保持
  • nonce = n1
  • この例はコードフロー。nonceとPKCEは別の役割。

コードを交換すると、役割の違うトークンが返る

利用者がOPで認証され、アプリが受け取った認可コードを交換します。コードフローの成功応答にはIDトークンとアクセストークンが含まれます。

図では、紫のIDトークンと緑のアクセストークンを分けて描きます。IDトークンは、このアプリへ認証結果を伝えます。アクセストークンは、許可されたAPIへアクセスするために使います。

この二つを同じ「ログインした証拠」として、好きな場所へ渡してよいわけではありません。トークン応答

  • 08 / SECURITY NOTES
  • 3 / 7
  • コードを交換して、二種類を受け取る
  • アプリ / RP
  • 認証提供者 / OP
  • UserInfo
  • CLIENT
  • AUTHORIZATION
  • RESOURCE
  • IDトークン
  • 認可コードを交換
  • アクセストークン
  • IDトークンとアクセストークンは、役割が違う。

IDトークンを、アプリ自身が検証する

アプリは信頼するOPとアルゴリズムのもとで署名などを検証し、iss が想定するOPか、aud が自分のクライアントIDを含むか、有効期限を過ぎていないかを確認します。nonce を送ったなら、その一致も必須です。

複数のaudienceや azp など、条件付きの検証もあります。実装では規格に対応したライブラリを使い、必要な設定を省略しません。IDトークンの検証

図の三つの関門は、署名・宛先・リクエストとの結び付きを表しています。

  • 08 / SECURITY NOTES
  • 4 / 7
  • IDトークンを、アプリが検証する
  • IDトークン
  • 発行者と署名
  • 宛先と期限
  • リクエスト
  • 信頼するOP・鍵・方式
  • aud は自分を含む?
  • nonceは一致?
  • nonce = n1
  • 発行者・署名・aud・期限、送ったnonceなどを照合する。

利用者を結び付ける基準は、issとsub

同じ sub という文字列でも、別のOPが発行したなら別人かもしれません。通常は発行者issと、その発行者のもとでのsubの組を利用者との結び付けに使います。

メールアドレスは変わることがあり、OPの扱いによっては再割当てもあります。email_verified が真でも、すべてのサービス間で同じ人を永久に表す識別子になるわけではありません。

図では同じ「123」という札の上に、異なる発行者の札が載っています。同じ文字列を見ただけでアカウントを統合しない理由です。クレームの安定性

  • 08 / SECURITY NOTES
  • 5 / 7
  • 利用者は、issとsubの組で結び付ける
  • 発行者 A
  • 発行者 B
  • iss = Provider A
  • iss = Provider B
  • sub = 123
  • sub = 123
  • 同じ文字列でも、別の主体
  • メールアドレスやsub単独で、別の提供者の人を統合しない。

追加プロフィールは、必要ならUserInfoへ

アプリはアクセストークンを使ってUserInfoエンドポイントを呼び、許可されたプロフィール情報を得られます。UserInfoの sub はIDトークンの sub と一致するか確認します。

ログイン後は、アプリ自身のセッションや権限モデルへ接続します。OIDCが「教材Xの編集者は誰か」まで決めるわけではありません。

図では緑のトークンがUserInfoへ進み、紫のIDトークンはアプリに残ります。IDトークンを任意のAPI用Bearerトークンとして流用しないことがポイントです。UserInfo応答

  • 08 / SECURITY NOTES
  • 6 / 7
  • プロフィールを得るならUserInfoへ
  • アプリ / RP
  • 認証提供者 / OP
  • UserInfo
  • CLIENT
  • AUTHORIZATION
  • RESOURCE
  • IDトークン
  • アクセストークン
  • アプリのセッション
  • 返されたsubも一致を確認
  • UserInfoのsubを照合し、アプリ自身のセッションへつなぐ。

確認:IDトークンの宛先は、写真API?

答えはこのログインを受け入れるクライアントです。IDトークンはアプリへ認証結果を伝え、アクセストークンは指定されたAPIへのアクセスを担います。

OIDCを読むときは、「誰が認証したか」「どのアプリに向けた結果か」「どのリクエストに対応するか」を確認してください。

OAuthはアクセスの委譲、OIDCは認証結果の伝達、JWTはそれらで利用されることがあるデータ形式。この三つを役割で分けると、同じ通信に登場しても混乱しにくくなります。

  • 08 / SECURITY NOTES
  • 7 / 7
  • 確認:IDトークンはAPIのアクセス用?
  • IDトークン
  • クライアントへ
  • 認証結果を検証する
  • アクセストークン
  • 指定されたAPIへ
  • アクセスを判定する
  • 答えは NO。認証結果の受け手は、ログインするアプリ。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]