-
Notifications
You must be signed in to change notification settings - Fork 0
MS_AuthCodeGrantFlowWithPKCE
- 戻る(OAuth PKCE)
- Authorization Code Grant Flow with PKCE
- OAuth 2.0 for Browser-Based Apps
- UserAgentでOAuth2のTokenを取得するベスト・プラクティス
Implicit 非推奨に伴い、
SPAで PKCE する場合のプロファイル。
-
カスタム URL スキームを使用しない
「response_mode=fragment」で認可リクエストを行う。 -
従って、基本的には、ネイティブでやってた PKCE を、
「response_mode=fragment」で、まんま SPA で
実装すれば良い。
※ IdP が「response_mode=fragment」に対応している必要がある。
補足(
response_modeの選択肢): Authorization Code Flow の既定は
response_mode=query(?code=...)で、SPA でもこれは使える。
元ページがfragment(#code=...)を挙げているのは、
Implicit からの移行を念頭に置いているためと読める
(Implicit はfragment固定なので、リダイレクト URI の登録や
フロントエンドの受け取り処理をそのまま流用できる)。
なおfragmentはサーバやプロキシのログに残らないという利点もある
(OAuth 2.0 Threat Model (Access)を参照)。
-
JavaScript から基本認証の付加は難しいので、
AuthZ(N) 側が
client_secret_postを
サポートしていると吉。
(そもそも、client_secret無しの基本認証ってのもアレ)
補足(Public Client なので
client_secretは「持てない」):
SPA は配布物の中身がすべて閲覧できるため、そもそも
client_secretを秘密にできない Public Client に分類される。
「不要」というより「持たせてはいけない」が正しく、
token_endpoint_auth_methodはnoneを使う。
client_secret_postは Confidential Client 向けの方式である。
基本的に、ネイティブ・アプリケーションと同様に、
フロントエンド・ホスト側のエンドポイントは利用しなくていい。
-
認可リクエストはフロントエンド・ホストからリダイレクトで開始するのだと
考えていたが、- しかし、Router を定義した SPA では、自サイトに HTTP リクエストが飛ばず、
- ネイティブ・アプリケーションと同様に、Public Client から直接リクエストした。
-
リダイレクト・エンドポイントを経由して Code を受け取るのだと考えていたが、
- しかし、Router を定義した SPA では、自サイトに HTTP リクエストが飛ばず、
- カスタム URL スキームと同様、直接、Public Client に戻って Code を取得する。
※ Router(URL によるページ遷移)を定義した
SPAでは、
自サイトに HTTP リクエストが飛ばなくなる。と言うのがポイント。
補足(
code_verifierはどこに置くか): 上記のとおり
リダイレクトで戻ってきた先も同じブラウザ タブの JavaScript なので、
code_verifierとstateはsessionStorageに置くのが一般的である
(localStorageはタブ/オリジンをまたいで残るため、
別タブの攻撃面が広がる)。
リダイレクトでページが再ロードされてもメモリ上の変数は消えるため、
「一時メモリに置く」だけでは動かない点に注意。
バックエンドから client_secret 付きで Token リクエストにするものと
思っていたが、
-
下記の「参考」を確認すると、
client_secretは不要らしい
(SPA 上から Token リクエスト可能)。 -
一方で、Hybrid Flow の code は
バックエンドからclient_secret付きで Token リクエスト
(code_verifier無いから)。
補足(現在の推奨は BFF): 本ページの結論(SPA から直接
Token リクエストする)は当時の標準的な答えだったが、その後
「OAuth 2.0 for Browser-Based Apps」の
改版で、**トークンをブラウザに置かない BFF(Backend for Frontend)**が
第一の選択肢として整理された。
Web Storage 上のトークンは XSS 一発で抜かれるため、
トークンをサーバ側セッションに保持し、ブラウザには
HttpOnly Cookie だけを渡す構成が推奨されている。
「PKCE + SPA 直接」は BFF を置けない場合の次善策、という位置づけである。
- Implement the OAuth 2.0 Authorization Code with PKCE Flow
https://developer.okta.com/blog/2019/08/22/okta-authjs-pkce- Replace Implicit Flow with PKCE
https://developer.okta.com/blog/2019/08/22/okta-authjs-pkce#replace-implicit-flow-with-pkce
- Replace Implicit Flow with PKCE
-
Authorization Code Flow with Proof Key for Code Exchange (PKCE)
https://auth0.com/docs/flows/concepts/auth-code-pkce -
Execute an Authorization Code Grant Flow with PKCE
https://auth0.com/docs/api-auth/tutorials/authorization-code-grant-pkce
- PKCE 4 SPA(Authorization Code Grant Flow with PKCE)実装ノウハウ
https://www.osscons.jp/joar0xbhj-537/
- OAuth PKCE
- Single-page application
- UserAgentでOAuth2のTokenを取得するベスト・プラクティス
- OAuth 2.0 for Browser-Based Apps
- OpenID Connect - クライアント認証
Tags: IT国際標準, 認証基盤, クレームベース認証, OAuth
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。