🦁

Auth0_アクセストークンでのMFA登録手順(OTP, SMS, Email)

2022/07/12に公開

背景

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などお好みで。

3-1.OTP登録

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桁のコードを確認して以下の検証リクエストを行います。

OTP検証リクエスト
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登録

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登録用のアクセストークン取得」で取得したアクセストークンを使います。

SMS検証リクエスト
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登録

MFA用Email追加リクエスト
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登録用のアクセストークン取得」で取得したアクセストークンを使います。

Email検証リクエスト
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