Actionsを使ってアプリケーション毎やコネクション毎でMFAを行うか行わないか判断してみる [Auth0 Actions]

2022.06.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Auth0ではActionsという機能を使うことによって認証フローのカスタマイズを行うことが可能です。

nodejsでコードを書くことによってAuth0のログインイベントの情報を扱うことができます。

今回はこれを使ってMFAを実行するかしないかを判定したいと思います。

以下のユースケースを想定しました。

  • 開発環境で動かすアプリはMFAはスキップしたい
  • 特定のアプリの場合、ログイン方法によってはMFAはスキップしたい
    • 例えば、googleログイン時はMFAをスキップ、パスワードを使ってログインするときはMFAを行う

カスタマイズ時におけるAuth0でのMFAの設定

Multi-factor Authenticationの画面のDefine policiesという設定項目の中に、ユーザーが追加の認証要素を使用して認証できるようになるタイミングを定義する箇所があります。

Require Multi-factor Auth という項目を Never にする必要があります。

AlwaysUse Adaptive MFAだとAuth0によってMFAのフローが行われますが、Neverだとユーザーはログインするために追加のファクターを使用する必要がなくなります。 これでActionsを使って制御できるようになります。

Actionsをかく

かなり昔に書いたブログに載せていましたが、Loginフローに追加します。

※ 組み込みに関しては上記記事を参照していただければと。

MFAを実行するコードは以下にしています。

onExecutePostLogin内で api.multifactor.enable() を実行

exports.onExecutePostLogin = async (event, api) => {

  // provider
  //   any: Use any of the configured challenges.
  //   duo: Use the Duo mutlifactor provider.
  //   google-authenticator: Use the Google Authenticator provider.
  //   guardian: Use the Guardian provider.
  api.multifactor.enable("any", {"allowRememberBrowser": false});
};

開発環境で動かすアプリはMFAはスキップしたい といった場合は、Auth0のアプリケーションに紐づくclient_idで判定しました。

例)

// 特定いのアプリケーションはMFAをスキップする
  if(event.client.client_id === "tr8xyo8WdlyZZvWFZpBrXilDpfatGxc8") {
    return;
  }

特定のアプリの場合、ログイン方法によってはMFAはスキップしたい といった場合は

client_idconnection.name で判定できます。

例) アプリAかつgoogle認証の場合はスキップする

  // 特定のアプリケーションかつ特定のコネクションでログインされた時はMFAをスキップする
   if(event.client.client_id === "XZiyC6UATH9Mr5tlHOxwJNp1VEdfTuBd" && event.connection.name === "google-oauth2") {
    return;
  }

event.connection.name とスキップする条件のコネクション名で判定します。

event.connection.id でも判定は可能なので、好きな方を使いましょう。

今回試したような単純なユースケースだと比較的簡単に判定できました(アプリケーションのclient.idとログインに使用されたconnection.nameだけ)。

ユーザー、アプリケーション、コネクションなど、さまざまな条件でMFAのカスタマイズを行えるは便利でした。 会社の従業員の場合はMFA不要、協力会社の従業員はMFA必要といった仕様の場合に遭遇した時に使えそうなので覚えておこうと思います