📝

Okta が発行する ID Token の amr claim を眺めてみた

2024/01/11に公開

Okta が Authentication Method Reference (AMR) をサポートしているようだったので[1]、せっかくなので試してみて備忘録として残しておきます。
AMR については、RFC 8176 Authentication Method Reference Values[2] や OpenID Connect (OIDC) の amr クレームの説明[3]も併せて確認すると良いかもしれません。

Okta の AMR 実装については以下のドキュメント[1:1]に記載がありました。

https://developer.okta.com/docs/guides/configure-amr-claims-mapping/main/

上記のドキュメントには外部 IdP から AMR クレームを受け取る場合のフローや設定などが色々記載されていますが、以下の通り単純に Okta から発行される ID Token に amr クレームを含めるだけであればデフォルトで行われるようです。

Custom OpenID Connect apps
If you're using a custom OpenID Connect app in the Okta IdP org, amr claims are sent to the SP by default and no additional configuration is required.
(引用元: https://developer.okta.com/docs/guides/configure-amr-claims-mapping/main/#custom-openid-connect-apps)

さっそく試してみますが、ここでは Okta における OIDC RP や MFA の設定方法の詳細については割愛します。

まずは、以下のような Authentication Request の URL からフローを開始します。

https://<Okta domain>/oauth2/default/v1/authorize?response_type=code&client_id=<Client ID>&redirect_uri=http://localhost:8080/login/callback&scope=openid offline_access&state=abc&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&code_challenge_method=s256

Username および Password の入力が要求されるので、入力後に [Sign In] を押下します。

Authorization Code が取得できるため、以下の通り Token Request によって ID Token を取得します。

$ curl -i --request POST \
       --url 'https://<Okta Domain>/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/login/callback' \
       --data 'code=<Authorization Code>' \
       --data 'code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk' \
       --data 'client_id=<Client ID>'

{"token_type":"Bearer","expires_in":3600,"access_token":"eyJ...","scope":"openid","id_token":"eyJ..."}

このときの ID Token をデコードした結果は以下の通りでした。


ID Token

Username / Password による認証をおこなったため amr クレームの配列として pwd が含まれているようです。

pwd
Password-based authentication [RFC4949].
(引用元: https://www.rfc-editor.org/rfc/rfc8176.html#section-2)

次に MFA を有効にしてみます。

Username / Password による認証を行ったのちに FIDO2 (WebAuthn) を使用した MFA を実施します。

このときの ID Token をデコードした結果は以下の通りでした。

amr クレームの配列として pwd、swk、mfa が含まれていました。

pwd
Password-based authentication [RFC4949].

mfa
Multiple-factor authentication [NIST.800-63-2] [ISO29115]. When
this is present, specific authentication methods used may also be
included.

swk
Proof-of-Possession (PoP) of a software-secured key. See
Appendix C of [RFC4211] for a discussion on PoP.

(引用元: https://www.rfc-editor.org/rfc/rfc8176.html#section-2)

MFA として FIDO2 (WebAuthn) を使用したので、hwk が含まれるような気がしていましたが実際には swk でした。
念の為 Authenticator として YubiKey を使用する場合もためしてみます。

このときの ID Token をデコードした結果は以下の通り hwk が含まれていました。

YubiKey は問題なく Authenticator として登録できているようです。

一応 amr クレームについては過去のリリースノートに記載がありました[4]

New Values for amr Base Claim
We improved some behaviors related for base claim amr:
・When MFA factors sms or call are used, the amr claim returns mca (opens new window).
・When MFA factor token:hardware is used, the amr claim returns hwk.
・When MFA factor web is used, the amr claim returns swk.

(引用元: https://developer.okta.com/docs/release-notes/2017/#strict-policy-enforcement-for-password-changes)

あとは RFC 4211 の Appendix C[5] の記述とかも気になります。

hwk
Proof-of-Possession (PoP) of a hardware-secured key. See
Appendix C of [RFC4211] for a discussion on PoP.

swk
Proof-of-Possession (PoP) of a software-secured key. See
Appendix C of [RFC4211] for a discussion on PoP.

(引用元: https://www.rfc-editor.org/rfc/rfc8176.html#section-2)

今回はあくまで試してみただけの備忘録なのでここら辺で終わります。
気が向いたら以下のドキュメントに記載の ACR も試してみようかと思います。

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

ではまた!

脚注
  1. Configure AMR claims mapping https://developer.okta.com/docs/guides/step-up-authentication/main/ ↩︎ ↩︎

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

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

  4. okta Developer Release Notes 2017 https://developer.okta.com/docs/release-notes/2017/#strict-policy-enforcement-for-password-changes ↩︎

  5. Internet X.509 Public Key Infrastructure Certificate Request Message Format (CRMF) | Appendix C. Why do Proof-of-Possession (POP) https://www.rfc-editor.org/rfc/rfc4211#appendix-C ↩︎

GitHubで編集を提案

Discussion