🤖 OAuth PKCE フローを調べた
PKCE(RFC 7636)は Authorization Code フローの拡張。クライアントシークレットを持てない SPA/モバイル/CLI 向け。
sequenceDiagram
participant C as Client
participant A as Auth Server
C->>C: verifier 生成 → SHA256 → challenge
C->>A: GET /authorize?code_challenge=...&method=S256
A->>A: ユーザー認証
A-->>C: Authorization Code
C->>A: POST /token (code + code_verifier)
A->>A: SHA256(verifier) == challenge?
A-->>C: Access Token
要点
- Code Verifier(ランダム文字列)→ SHA256 → Code Challenge を作り、認可リクエスト時に challenge を送る
- 認可コード取得後、トークンリクエスト時に verifier を送る
- サーバー側で SHA256(verifier) == challenge を検証
- verifier はトークンリクエストまでネットワークに流れないので、認可コードを傍受されてもトークンは取られない
OAuth 2.1 では PKCE が必須、Implicit と ROPC は削除予定。
関連 RFC
- RFC 7636 — PKCE
- RFC 6749 — OAuth 2.0
- RFC 8252 — Native Apps
- OAuth 2.1 draft
- Security BCP
実例: wrangler OAuth 認証が SSH 越しで失敗した話 — wrangler CLI も PKCE を使っている。