この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
現在ベータ版としてActionsの機能が公開されています。
将来、RulesからActionsへの移行を検討しないといけない時期が来るかもしれないので、この段階で試してみようと思います。
シナリオ
簡易なアプリケーションで、メールアドレスドメインのホワイトリスト
でログインできるアドレスを制限し、多要素認証
を行うログインフローカスタマイズをRulesで行っているとします。
Ruleスクリプト
メールアドレスドメインのホワイトリスト
classmethod.jp
じゃないとログインできないようにする。
function emailDomainWhitelist(user, context, callback) {
if(context.clientID !== '<アプリケーションのクライアントID>'){
return callback(null, user, context);
}
// Access should only be granted to verified users.
if (!user.email || !user.email_verified) {
return callback(new UnauthorizedError('Access denied.'));
}
const whitelist = ['classmethod.jp']; //authorized domains
const userHasAccess = whitelist.some(
function (domain) {
const emailSplit = user.email.split('@');
return emailSplit[emailSplit.length - 1].toLowerCase() === domain;
});
if (!userHasAccess) {
return callback(new UnauthorizedError('Access denied.'));
}
return callback(null, user, context);
}
多要素認証
プッシュ、SMS、音声、OTPまたはEメールでの多要素認証を有効にする
function multifactorAuthentication(user, context, callback) {
if(context.clientID !== '<アプリケーションのクライアントID>'){
return callback(null, user, context);
}
context.multifactor = {
provider: 'any',
// optional, defaults to true. Set to false to force authentication every time.
// See https://auth0.com/docs/multifactor-authentication/custom#change-the-frequency-of-authentication-requests for details
allowRememberBrowser: false
};
callback(null, user, context);
}
現状のフローを確認
どのMFAを使うのかという設定は以下の画像のようにしています。
ホワイトリスト以外のドメインでログイン
gmailのアドレスでログインすると、
このようにエラー内容がURLのパラメータについてコールバック先に返却されています。ログインも完了しません。
多要素認証
メールアドレスのドメイン確認を突破した後、以下のように多要素認証を行う画面に遷移します
Actionsに置き換える
Rulesでの動作は正常に終えたので、このフローを実際にActionsに移行してみます。
使用するフローはLogin
です。
Actionを作っていきましょう
メールアドレスドメインのホワイトリスト
Actionを作成すると、以下のコードが最初から書かれているので、これをカスタマイズしていきます。
/** @type {PostLoginAction} */
module.exports = async (event, context) => {
return {};
};
event
はactions-event-objectに含まれるプロパティを使用でき、
context
はactions-context-objectに含まれるプロパティを使用できます。
Ruleと同じようなやり方でAction化してみました。
/** @type {PostLoginAction} */
module.exports = async (event, context) => {
if(event.client.id !== '<アプリケーションのクライアントID>'){ //クライアントIDはSecretsに入れてもいいかな
return {};
}
// Access should only be granted to verified users.
if (!event.user.email || !event.user.emailVerified) {
throw new Error('Logins are not allowed.');
}
const whitelist = ['classmethod.jp']; //authorized domainsもSecretsに入れてもいいかな
const userHasAccess = whitelist.some(
function (domain) {
const emailSplit = event.user.email.split('@');
return emailSplit[emailSplit.length - 1].toLowerCase() === domain;
});
if (!userHasAccess) {
throw new Error('Logins are not allowed.');
}
return {};
};
ログインユーザーの情報は、event
オブジェクトから取得しています。
また、Ruleではcallback関数を使ってエラーを返していましたが、Actionsではthrowでerrorを返すようです。
Actionをデプロイした後、以下のようにLoginフローに組み込みます。
多要素認証
多要素認証も同様にRuleと同じようなやり方でAction化をしてみました。
/** @type {PostLoginAction} */
module.exports = async (event, context) => {
if(event.client.id !== '<アプリケーションのクライアントID>'){ //クライアントIDはSecretsに入れてもいいかな
return {};
}
return {
command: {
type: "multifactor",
provider: "any"
}
};
};
同様にフローに組み込みます(EmailDomainWhitlistの下)
Actionフローの確認
ActionsはRulesの後に動くので、Rulesのスクリプトが起動しないようにdisableにしてから行います。
Rulesと同じような手順でログインしてみると、同じようにエラーになります(ホワイトリスト以外のドメインでログイン)。
Auth0のログにもエラーが出力されていることがわかります。
多要素認証も、Rulesと同様にメールアドレスのドメイン確認を突破したらMFAの画面に遷移します。
まとめ
Rulesでカスタマイズしていた処理をActionsに書き換えてみました。 コールバック方法やイベントオブジェクトの取得方法は異なりますが、同じnodejsでかけるのでそれほど苦労しないで移行は可能だと思います。
※ まだベータ版なので、本番環境ではなく開発環境やテスト環境で試しましょう