認証フロー
もちろんです。Keycloakを使ったユーザー認証の認可コードフローについて、矢印($\rightarrow$)と番号を使って、ステップごとの流れをより明確に表現します。
🔑 Keycloak 認可コードフローの流れ
このフローは、主にユーザーのブラウザ(フロントチャネル)を介したやり取りと、サーバー間の直接通信(バックチャネル)に分かれます。
I. 認証リクエストの開始(ブラウザ経由)
ユーザーがアプリケーションの保護されたリソースへアクセスしようとするステップです。
- ユーザー $\rightarrow$ クライアントApp
- 保護されたリソースへのアクセスを要求。
- クライアントApp $\rightarrow$ Keycloak
- ユーザーをKeycloakの認可エンドポイントへリダイレクト。
- (リクエスト内容:
client_id、response_type=code、redirect_uriなど)
- Keycloak $\rightarrow$ ユーザー
- Keycloakのログイン画面を表示。
II. ユーザー認証とコード発行(ブラウザ経由)
Keycloakがユーザーの身元を確認し、一時的な「鍵」を発行するステップです。
- ユーザー $\rightarrow$ Keycloak
- ユーザー名とパスワードを入力し、認証を試みる。
- Keycloak
- 認証情報を検証。
- Keycloak $\rightarrow$ クライアントApp (ブラウザ経由でリダイレクト)
- 認証成功後、
redirect_uriへリダイレクト。 - URLパラメータに認可コード (
code) を付与。
- 認証成功後、
III. トークンの交換(サーバー間通信:最も重要)
クライアントサーバーが、ブラウザからは見えない安全な通信で、認可コードを本物のトークンに交換するステップです。
- クライアントApp (サーバーサイド) $\rightarrow$ Keycloak (トークンエンドポイント)
- 認可コードとクライアントシークレット (
client_secret) を含むPOSTリクエストを送信。 - (リクエスト内容:
grant_type=authorization_code、code、client_secret)
- 認可コードとクライアントシークレット (
- Keycloak
- 認可コードと
client_secretを検証。
- 認可コードと
- Keycloak $\rightarrow$ クライアントApp (サーバーサイド)
- 検証成功後、以下のトークンセットを応答。
- アクセストークン (Access Token)
- IDトークン (ID Token)
- リフレッシュトークン (Refresh Token)
- 検証成功後、以下のトークンセットを応答。
IV. リソースへのアクセスと利用
クライアントアプリケーションが、取得したトークンを使ってAPIなどのリソースにアクセスするステップです。
- クライアントApp $\rightarrow$ API (リソースサーバー)
- アクセストークンをHTTPヘッダー(
Authorization: Bearer <token>)に含めて、APIへリクエスト。
- アクセストークンをHTTPヘッダー(
- API $\rightarrow$ Keycloak (または公開鍵)
- 受け取ったアクセストークンの署名を検証。
- API $\rightarrow$ クライアントApp
- トークンが有効であれば、リクエストされたデータを応答。
このフローでは、機密情報であるトークンとクライアントシークレットが、ユーザーのブラウザを介さずにサーバー間でのみ交換されるため、高いセキュリティが保たれます。