「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。 目次 †概要 †認可コード横取り攻撃 (authorization code interception attack) への対策
課題 †ネイティブアプリが、外部ブラウザを使用してOAuth 2.0認証要求を発行する場合、
という方式があるが(下図を参照)、 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | End Device (e.g., Smartphone) | | | | +-------------+ +----------+ | (6) Access Token +----------+ | |Legitimate | | Malicious|<--------------------| | | |OAuth 2.0 App| | App |-------------------->| | | +-------------+ +----------+ | (5) Authorization | | | | ^ ^ | Grant | | | | \ | | | | | | \ (4) | | | | | (1) | \ Authz| | | | | Authz| \ Code | | | Authz | | Request| \ | | | Server | | | \ | | | | | | \ | | | | | v \ | | | | | +----------------------------+ | | | | | | | (3) Authz Code | | | | Operating System/ |<--------------------| | | | Browser |-------------------->| | | | | | (2) Authz Request | | | +----------------------------+ | +----------+ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
対策 †
仕様 †仕様の概要 †このフローは、
+-------------------+ | Authz Server | +--------+ | +---------------+ | | |--(A)- Authorization Request ---->| | | | | + t(code_verifier), t_m | | Authorization | | | | | | Endpoint | | | |<-(B)---- Authorization Code -----| | | | | | +---------------+ | | Client | | | | | | +---------------+ | | |--(C)-- Access Token Request ---->| | | | | + code_verifier | | Token | | | | | | Endpoint | | | |<-(D)------ Access Token ---------| | | +--------+ | +---------------+ | +-------------------+ 仕様の詳細 †
各エンドポイントで受け取るパラメタ †
ハッシュ関数 †
codeとの関連 †
セキュリティに関する考慮事項 †code_verifier †
盗聴者からの保護 †
code_challenge †code_challengeの生成にソルト(やストレッチ)が不要な理由。
このため、code_challengeの生成にソルト(やストレッチ)は不要。 補足 †client_secret不要?問題 †概要 †OAuth PKCEのアクセストークン・リクエストでは、client_secretは不要で、client_idのみでOK。
参考 †
オレオレPKCE †概要 †
フロー †① Resource Owner(ユーザ)がスマホ上のClient(スマホネイティブ・アプリ)をクリックする。 ② Client(スマホネイティブ・アプリ)が起動する。 ③ Client(スマホネイティブ・アプリ)のログイン ボタン or リンクをクリックする。 ④ 外部ブラウザが起動して、Client(バックエンドWebアプリ)へWebアクセスする。 [ここからOAuth2のAuthoriaztion Codeフローでの認証] ⑤ Client(バックエンドWebアプリ)はClient(スマホネイティブ・アプリ)の要求を受けて ⑥ Authorization Serverがログイン画面を表示する。 ⑦ Resource Owner(ユーザ)がクレデンシャル(ID, PWD)を入力する。 ⑧ Authorization ServerはAuthoriaztion Code(code)を発行し ⑨ Client(バックエンドWebアプリ)は、先ず、stateパラメタを検証し、stateが問題なければ、 ⑩ Authorization ServerからClient(バックエンドWebアプリ)へAccessToken?発行 ⑪ Client(バックエンドWebアプリ)は、AccessToken?を使用してUserInfo?エンドポイントにリクエストし、 [ここまでOAuth2のAuthoriaztion Codeフローでの認証] ⑫ Client(バックエンドWebアプリ)は、Client(スマホネイティブ・アプリ)用の一時codeを生成してcode_verifierと紐つけて保持する。 ⑬ 次に、カスタムURLスキームでClient(スマホネイティブ・アプリ)へリダイレクトし、これによって、一時codeとstateを渡す。 ⑭ Client(スマホネイティブ・アプリ)は、一時codeとstateを受け取り、先ず、state検証する。 ⑮ Client(バックエンドWebアプリ)のTokenエンドポイントは、 ⑯ Client(スマホネイティブ・アプリ)は、認証tokenを取得する。 ⑰ Client(スマホネイティブ・アプリ)は、 認証tokenを使用して スマホ向けPKCE †Authorization Code Grant Flow with PKCE †SPAでPKCEする場合のプロファイル。 参考 †
仕様 †
関連 †OAuth PKCE利用時の構成図 †OAuth 2.0 for Native Apps †OAuth 2.0 for Browser-Based Apps †Tags: :IT国際標準, :認証基盤, :クレームベース認証, :OAuth |