Auth0_アクセストークンでのMFA登録手順(OTP, SMS, Email)
背景
Auth0のユーザーがMFA登録を行う方法は大きく分けて以下2つがあります。
-
①Auth0標準画面を使う方法
こちらは何も準備がいらないためとても簡単ですが、登録できるのは最初の1要素のみで、SMSを複数登録したり、SMS登録後に追加でOTPを登録したり、といったことはできません。 -
②APIを使う方法
そのため、今回はより自由にMFA登録が可能な ②APIを使う方法 を見ていきますが、こちらは更に以下2つの方法があります。-
②-1 リソースオーナーパスワードクレデンシャルズフロー(ROPG)で取得したMFAトークンを使う方法
→ 以下の公式ドキュメントに記載があります。
https://auth0.com/docs/secure/multi-factor-authentication/authenticate-using-ropg-flow-with-mfa -
②-2 特定のaudienceとscopeを指定したアクセストークンを使う方法
→ 今の所ドキュメントとしてはまとまっていないようで、Authentication APIにさらっとヒントが書かれているだけなのですが、この方法はApplicationが許可するGrant-Typeを減らすことができる(Grant-Type:Passwordの許可が不要になる=余計な穴を空けなくて済む)というメリットがあります。今回はこちらの方法を解説していきます。
https://auth0.com/docs/api/authentication#add-an-authenticator
-
対象
Auth0のプランによっては使用できないMFA要素があるようです。
Auth0フリープラン登録後30日以内、または、エンタープライズプランに加入している方は各種MFAが利用できるかと思いますので、この記事はそういった方を対象としています。
1.設定
Auth0管理ダッシュボードへログインします。
1-1.アプリケーション設定
左メニュー「Applications」を押下しアプリケーションを一つ選び、Settingsタブ > 下部の「Advanced Settings」> 「Grant-Type」で「MFA」にチェックを入れて「Save」します。
※今回はSPAのアプリケーションに対して許可しました。
1-2.MFA設定
左メニュー Security > Multi-factor Auth で使いたいMFA要素をオンにします。
※今回はOTP、SMS、Emailをオンにしています。
少し下に進んだところにある ②Define policies > Require Multi-factor Auth は、
RulesなどからMFAを起動している方は「Never」、そうでない方でテナント内全てのアプリケーションのログインで毎回MFAが要求されても問題ない方は「Always」にして、「Save」を押下します。
※「Never」にした上でRules等を書くと、特定の条件下でのみMFAを要求したりすることが可能です。
2.MFA登録用のアクセストークン取得
左メニュー Extensions > Auth0 Authentication API Debugger へアクセスします。
(インストールされていない場合はインストールしてください。)
「Application」は、「1-1 アプリケーション設定」でGrant-Type: MFAを許可したアプリケーションを選びます。
「OAuth2 / OIDC」タブへ移動し、「Audience」へ 「https://YOUR-DOMEIN/mfa/」 を入力してトグルをオン、「Scope」へ「openid enroll」を入力します。YOUR-DOMEINはご自身のテナントのドメイン名を入力してください。
上部に戻り、「OAuth2/OIDC LOGIN」を押下してログインします。
scopeとaudが意図したものになっているか確認し、access_tokenの値をコピーします。
3. MFA登録
MFAオーセンティケーターを追加・検証します。
URLにはHTTP, Shell(Curl), Javascriptのリクエスト例が載っていますのでご参考ください。
今回はHTTPでリクエストします。リクエストツールはPostmanやVSCodeプラグインのRestClientなどお好みで。
- (オーセンティケーター追加)
https://auth0.com/docs/api/authentication?http#add-an-authenticator - (OTP検証)
https://auth0.com/docs/api/authentication?http#verify-with-one-time-password-otp- - (OOB_SMS/Email検証)
https://auth0.com/docs/api/authentication?http#verify-with-out-of-band-oob-
3-1.OTP登録
POST https://YOUR_DOMAIN/mfa/associate
Content-Type: application/json
Authorization: Bearer ACCESS_TOKEN
{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"authenticator_types": ["otp"]
}
{
"authenticator_type": "otp",
"secret": "COPY_HERE!",
"barcode_uri": "otpauth://totp/TENANT_NAME:ACOUNT_NAME?secret=xxxxxx&issuer=xxx&algorithm=SHA1&digits=6&period=30"
}
レスポンスのsecretをもとに、QRコードを生成します。以下のツールを使わせていただきます。
OTPアプリは、今回はGoogle Authenticatorです。
https://ichiro-kun.com/post/1646/
※Google Authenticator以外を使う場合、QRコード生成の際に必要なパラメーターが異なったりするようですので適宜ご確認ください。
- issser : SYSTEM_NAME(なんでも可)
- user : USER_NAME(なんでも可)
- secret : コピーしたsecret
として「QRコード生成」を押下します。
OTPアプリからQRコードを登録し、表示される6桁のコードを確認して以下の検証リクエストを行います。
POST https://YOUR_DOMAIN/oauth/token
Content-Type: application/x-www-form-urlencoded
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&mfa_token=(MFA登録用のアクセストークン)
&grant_type=http://auth0.com/grant-type/mfa-otp
&otp=(OTPアプリに表示される6桁のコード)
アクセストークンが返ってきたら登録完了です。
{
"access_token": "eyJ~~~~~~~~~",
"scope": "xxxx",
"expires_in": xxxx,
"token_type": "Bearer"
}
3-2.SMS登録
POST https://YOUR_DOMAIN/mfa/associate
Content-Type: application/json
Authorization: Bearer ACCESS_TOKEN or MFA_TOKEN
{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"authenticator_types": ["oob"],
"oob_channels": "sms",
"phone_number": "+81 PHONE_NUMBER"
}
※PHONE_NUMBERはハイフン不要です。また、+81は日本の国番号です。
{
"authenticator_type": "oob",
"binding_method": "prompt",
"oob_channel": "sms",
"oob_code": "Fe26.2~~~~~~~"
}
次の検証リクエストでoob_codeの値と、「2.MFA登録用のアクセストークン取得」で取得したアクセストークンを使います。
POST https://YOUR_DOMAIN/oauth/token
Content-Type: application/x-www-form-urlencoded
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&mfa_token=ACCESS_TOKEN
&grant_type=http://auth0.com/auth/grant-type/mfa-oob
&oob_code=OOB_CODE
&binding_code=BINDING_CODE(電話番号へ送られてきた6桁のコード)
アクセストークンが返ってきたら登録完了です。
{
"access_token": "eyJ~~~~~~~~~",
"scope": "xxxx",
"expires_in": xxxx,
"token_type": "Bearer"
}
3-3.Email MFA登録
POST https://YOUR_DOMAIN/mfa/associate
Content-Type: application/json
Authorization: Bearer ACCESS_TOKEN or MFA_TOKEN
{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"authenticator_types": ["oob"],
"oob_channels": "email",
"email": "EMAIL_ADDRESS@EXAMPLE.COM"
}
{
"authenticator_type": "oob",
"binding_method": "prompt",
"oob_channel": "email",
"oob_code": "Fe26.2~~~~~~~"
}
次の検証リクエストでoob_codeの値と、「2.MFA登録用のアクセストークン取得」で取得したアクセストークンを使います。
POST https://YOUR_DOMAIN/oauth/token
Content-Type: application/x-www-form-urlencoded
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&mfa_token=ACCESS_TOKEN
&grant_type=http://auth0.com/auth/grant-type/mfa-oob
&oob_code=OOB_CODE
&binding_code=BINDING_CODE(メールアドレスへ送られてきた6桁のコード)
アクセストークンが返ってきたら登録完了です。
{
"access_token": "eyJ~~~~~~~~~",
"scope": "xxxx",
"expires_in": xxxx,
"token_type": "Bearer"
}
5.MFA登録されているか確認
Auth0管理ダッシュボードで、ユーザーの情報を確認します。
左メニュー「User Management」> Users > 対象のユーザー > Details > Multi-Factor Authentication が以下のようになっていれば正常に登録できています。次回ログイン時から、登録したMFAが利用可能です。
※ログイン画面でMFAを確認する場合、ブラウザにMFA省略Cookie「auth0-mf」「auth0-mf-compat」が残っているとMFAが省略されるので、プライベートブラウザで開くか、ブラウザのCookie/キャッシュを削除してログインしてみてください。
以上でMFA登録完了です。お疲れさまでした。
Discussion