Okta の Authentication Context Class Reference (acr) の実装を眺めてみた
はじめに
Okta が Authentication Context Class Reference (ACR) に対応しているようだったので[1]、せっかくなので試してみて備忘録として残しておきます。
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 などの指定ができるようです。
また、phr
、phrh
といった 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] みたいなこともできそうな雰囲気を感じました。
ではまた!
-
Step-up authentication using ACR values https://developer.okta.com/docs/guides/step-up-authentication/main/ ↩︎ ↩︎
-
OpenID Connect Core 1.0 incorporating errata set 2 | https://openid.net/specs/openid-connect-core-1_0.html#acrSemantics ↩︎
-
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 ↩︎
-
Authentication Method Reference Values | 2. Authentication Method Reference Values https://www.rfc-editor.org/rfc/rfc8176.html#section-2 ↩︎ ↩︎
-
OAuth 2.0 Step Up Authentication Challenge Protocol https://datatracker.ietf.org/doc/rfc9470/ ↩︎
Discussion