コンテンツにスキップ

OIDC@SSO

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. OIDC:OpenID Connect (外部ID連携)

OIDCとは

SSO の一種である。

OAuth をベースとして、認証フェーズを追加し、認証/認可を実装する。

そのため、OAuth の一種ともいえる。


02. OIDCの仕組み

アーキテクチャ

認証フェーズの委譲先の ID プロバイダー、ログインしたい Web サイト、から構成される。


クレーム

クレームは資格情報の要素である。

委譲元のクライアントは、ID プロバイダーから取得したクレームを資格情報として扱い、認可処理を実行する。

クレーム 説明
sub アカウントの識別子
profile アカウントのプロフィールURL
name アカウントの氏名
email アカウントのメールアドレス
phone アカウントの電話番号
address アカウントの住所
... ...


認可リクエスト時のクレームの取得

scope パラメーター

認可リクエスト時に、scope パラメーターでクレームグループを指定し、ID プロバイダーからクレームを取得できる。

ID プロバイダーは、取得したクレームグループに対応したクレームを ID トークンに設定し、クライアントに返信する。

委譲元のクライアントは、取得したクレームを資格情報として扱い、認可処理を実行する。

クレームグループ 取得できるクレーム (資格情報の要素)
openid これは、OIDCの場合に必須である。トークンエンドポイントから、アクセストークンに加えてIDトークンを発行できるようになる。
profile namefamily_namegiven_namemiddle_namenicknamepreferred_usernameprofilepicturewebsitegenderbirthdatezoneinfolocaleupdated_at
email emailemail_verified
phone phone_numberphone_number_verified
address address
ユーザー定義のクレームグループ 自由にクレームを設定できる

claims パラメーター

認可リクエスト時に、claims パラメーターで特定のクレームを指定し、クレームを取得できる。

クレームの指定の仕方が複雑らしい...


03. トークンの検証

IDトークンの検証

ID トークンの情報 (署名部分、有効期限、発行元など) から、ID トークンの署名を検証できる。


アクセストークン署名検証

▼ JWT仕様の場合

アクセストークンの情報 (署名部分、有効期限、発行元など) から、アクセストークンの署名を検証できる。

以下のいずれかの方法で検証できる。

  • 認可サーバーから取得した公開鍵 (一般的)
  • 認可サーバーから取得した共通鍵
  • 認可サーバーのイントロスペクションエンドポイント


04. OIDCの種類

ベースになっている OAuth と同様にして、OIDC には仕組み別に『認可コードフロー』『暗黙的フロー』『リソースオーナー・パスワード・資格情報ズフロー (ダイレクト・アクセス・グラント) 』などがある。


05. OAuthとの違い

目的

OIDC は認証の仕組みである。

一方で、OAuth は認可の仕組みである。

トークンの違い

OIDC は OAuth の拡張であるため、仕組みは非常に似ている。

OIDC では、OAuth とは異なり、アクセストークン (JWT 仕様かどうかはツール次第) だけでなく ID トークン (必ず JWT 仕様) の使用する。

また、OAuth の脆弱性に対処できる。

oidc_vs_oauth


06. 認可コードフロー

仕組み

OAuth の認可コードフローと仕組みが似ており、アクセストークンだけでなく ID トークンも使用する。

短命な認可コードを送信すると、ID プロバイダーからリフレッシュトークンを含むアクセストークンと ID トークンを取得できる。

oidc_codeflow


Keycloakの場合

▼ 認可リクエスト送信

アプリから Keycloak 宛に認可リクエストを送信する。

$ curl http://<Keycloakのドメイン>/realms/oidc-sample/protocol/openid-connect/auth?response_type=code&client_id=rp1&redirect_uri=http://<アプリケーションのドメイン>/oidc&scope=openid

▼ 認可レスポンス受信

Keycloak は認可レスポンスを受信し、アプリに対してリダイレクトを送信する。

$ curl http://<アプリケーションのドメイン>/oidc?session_state= ... &code=<認証コード>

▼ トークンリクエスト送信

認可コードを使用して、Keycloak にトークンリクエストを送信する。

ID トークンとアクセストークンを取得できる。

$ curl -d "grant_type=authorization_code&code=<認証コード>&redirect_uri=http://<アプリケーションのドメイン>/oidc&client_id=rp1&client_secret=<Client secret>" http://<Keycloakのドメイン>/realms/oidc-sample/protocol/openid-connect/token

{
  "access_token": <アクセストークン>,
  "expires_in": 300,
  "refresh_expires_in": 1800,
  "refresh_token": <リフレッシュトークン>,
  "token_type": "Bearer",
  "id_token": <IDトークン>,
  "not-before-policy": 0,
  "session_state": "8468db1c-feb4-4803-bfeb-213149b560cf",
  "scope": "openid email profile"
}

▼ ユーザー情報の取得

$ curl -H "Authorization: Bearer <アクセストークン>" http://<Keycloakのドメイン>/realms/oidc-sample/protocol/openid-connect/userinfo

{
  "sub": <User ID>,
  "email_verified": false,
  "preferred_username": "admin",
  "given_name": "",
  "family_name": ""
}

▼ アクセストークンの再作成

リフレッシュトークンを使用して、アクセストークンを再作成する。

$ curl -X POST -d "client_id=rp1&client_secret=<Client Secret>&grant_type=refresh_token&refresh_token=<リフレッシュトークン>&scope=openid profile" http://<Keycloakのドメイン>/realms/oidc-sample/protocol/openid-connect/token


運搬

アクセストークンを Authorization ヘッダーで運べる。


07. SLO:シングルログアウト

シングルログアウトとは

SSO をログアウトする仕組みのこと。

複数の方式を組み合わせて SSO をログアウトする。


RP-Initiated

▼ シングル

▼ グローバル

記入中...


フロントチャネル

▼ シングル

▼ グローバル

フロントエンドのブラウザが、ID プロバイダーのログアウトエンドポイント (<IDプロバイダーのドメイン>/<IDプロバイダーによる>) に POST リクエストを送信し、すべてのアプリケーションからログアウトする。


バックチャネル

▼ シングル

▼ グローバル

ID プロバイダーが、バックエンドのいずれかのアプリケーションのログアウトエンドポイント (<アプリケーションのドメイン>/<IDプロバイダーのクライアントパッケージによる>) に POST リクエストを送信し、そのアプリケーションでログアウト処理を実行する。

セッションデータが失効し、バックエンドのアプリケーションが起点となってログアウト処理を始める場合、それはバックチャネルである。

また、フロントエンドのブラウザがバックエンドのアプリケーションにログアウトリクエストを送信し、これが起点となる場合もバックチャネルである。