📚

Okta の Authentication Context Class Reference (acr) の実装を眺めてみた

2024/01/22に公開

はじめに

Okta が Authentication Context Class Reference (ACR) に対応しているようだったので[1]、せっかくなので試してみて備忘録として残しておきます。

https://developer.okta.com/docs/guides/step-up-authentication/main/

ACR の説明については OpenID Connect Core[2] などから確認することができます。

acr
OPTIONAL. Authentication Context Class Reference. String specifying an Authentication Context Class Reference value that identifies the Authentication Context Class that the authentication performed satisfied.
(参考: https://openid.net/specs/openid-connect-core-1_0.html#IDToken)

例えば、Okta では ACR value を使用して以下のようなフローを実現することができるようです。


Authentication flow using ACR values[1:1]

Okta は acr_values として以下のような値を事前定義しており、1FA や 2FA などの指定ができるようです。
また、phrphrh といった OpenID Connect Extended Authentication Profile (EAP) ACR Values 1.0[3] で定義されている値についても記載があります。

動作確認

1FA

まずは、以下のように arc_values として urn:okta:loa:1fa:any という値を指定した Autorization Request をおこないます。

https://${yourOktaDomain}/oauth2/default/v1/authorize?client_id={clientId}
&response_type=code
&scope=openid
&redirect_uri=https://${yourOktaDomain}/authorization-code/callback
&state=296bc9a0-a2a2-4a57-be1a-d0e2fd9bb601
&acr_values=urn:okta:loa:1fa:any

Username および Password による認証のみが要求され、認証が成功すると Authorization Code が発行されます。

取得した Authorization Code などを使用して Token Request をおこないます。

$ curl -i  -u '<Client ID>:<Client Secret>' --request POST \
            --url 'https://${yourOktaDomain}/oauth2/default/v1/token' \
            --header 'Accept: application/json' \
            --header 'Content-Type: application/x-www-form-urlencoded' \
            --data 'grant_type=authorization_code' \
            --data 'redirect_uri=http://localhost:8080/authorization-code/callback' \
            --data 'code=<Authorization Code>'
...
{"token_type":"Bearer","expires_in":3600,"access_token":"eyJ...","scope":"openid","id_token":"eyJ..."}

取得した Access Token をでコードした結果は以下の通りになっていました。Authorization Request で指定した acr の値がクレームとして含まれています。


Access Token

ID Token をでコードした結果は以下の通りになっていました。こちらも Authorization Request で指定した acr の値がクレームとして含まれています。また、amr クレームも含まれており、パスワードを使用して認証が行われたことが確認することができます[4]


ID Token

2FA

次に、以下のように acr_values として urn:okta:loa:2fa:any という値を指定した Authorization Request をおこないます。

https://${yourOktaDomain}/oauth2/default/v1/authorize?client_id={clientId}
&response_type=code
&scope=openid
&redirect_uri=https://${yourOktaDomain}/authorization-code/callback
&state=296bc9a0-a2a2-4a57-be1a-d0e2fd9bb601
&acr_values=urn:okta:loa:2fa:any

Username および Password による認証がおこなわれた後、ユーザーの MFA の設定状況によって以下のような追加での認証が要求されます。

取得した Authorization Code などを使用して Token Request をおこないます。

$ curl -i  -u '<Client ID>:<Client Secret>' --request POST \
            --url 'https://${yourOktaDomain}/oauth2/default/v1/token' \
            --header 'Accept: application/json' \
            --header 'Content-Type: application/x-www-form-urlencoded' \
            --data 'grant_type=authorization_code' \
            --data 'redirect_uri=http://localhost:8080/authorization-code/callback' \
            --data 'code=<Authorization Code>'
...
{"token_type":"Bearer","expires_in":3600,"access_token":"eyJ...","scope":"openid","id_token":"eyJ..."}

取得した Access Token をでコードした結果は以下の通りになっていました。Authorization Request で指定した acr の値がクレームとして含まれています。


Access Token

ID Token をでコードした結果は以下の通りになっていました。こちらも Authorization Request で指定した acr の値がクレームとして含まれています。また、amr クレームも含まれており、MFA が行われたことを確認することができます[4:1]


ID Token

おわりに

ざっくりと Okta の ACR の実装について眺めてみました。
とりあえず、一般的な ACR の利用用途として使用できそうという印象でした (Okta Identity Engine で評価フローなどのカスタマイズができそうですが、今回は一旦スルーします)。

なお、ドキュメントに特に言及はありませんでしたが、Access Token にも acr クレームが含まれることから RFC 9470 OAuth 2.0 Step Up Authentication Challenge Protocol[5] みたいなこともできそうな雰囲気を感じました。

ではまた!

脚注
  1. Step-up authentication using ACR values https://developer.okta.com/docs/guides/step-up-authentication/main/ ↩︎ ↩︎

  2. OpenID Connect Core 1.0 incorporating errata set 2 | https://openid.net/specs/openid-connect-core-1_0.html#acrSemantics ↩︎

  3. OpenID Connect Extended Authentication Profile (EAP) ACR Values 1.0 - draft 00 https://openid.net/specs/openid-connect-eap-acr-values-1_0-ID1.html ↩︎

  4. Authentication Method Reference Values | 2. Authentication Method Reference Values https://www.rfc-editor.org/rfc/rfc8176.html#section-2 ↩︎ ↩︎

  5. OAuth 2.0 Step Up Authentication Challenge Protocol https://datatracker.ietf.org/doc/rfc9470/ ↩︎

GitHubで編集を提案

Discussion