前回の記事で、Auth0を利用するアプリからSMS認証用の電話番号を更新する機能を考えたので
今度は、電話番号を登録しているユーザーだけ多要素認証(SMS認証)を実施するようにRulesを設定してみました。
設定内容
Auth0のMFA設定
Auth0のMFA設定のFactorsをSMSのみ有効化する。

Rulesの設定
以下のコードをRulesに設定します。
function (user, context, callback) {
const request = require('request');
const authenticatorSearchUrl = auth0.baseUrl + '/users';
request({
url: authenticatorSearchUrl + '/' + user.user_id + '/enrollments',
headers: {
Authorization: 'Bearer ' + auth0.accessToken
},
},
function(err, response, body) {
if (err) return callback(err);
if (response.statusCode !== 200) return callback(new Error(body));
var data = JSON.parse(body);
data = data.filter(function(u) {
return (u.auth_method === 'sms') && (u.status === 'confirmed');
});
if (data.length > 0) {
context.multifactor = {
provider: 'any',
allowRememberBrowser: true
};
}
callback(null, user, context);
});
}
注意点
前回の記事に書いた電話番号の削除方法で登録されている有効な電話番号を全て削除してしまうと
SMS認証が発動しなくなります。
元々、電話番号が登録されているのであれば、そのユーザーはリカバリーコードを保持しているはずなので
SMS認証がスキップされるのではなく、リカバリーコードの入力を求められるべきかと思いますが、このRulesの実装ではそれが実現できていません。
電話番号の削除機能を実装するにしても
一度電話番号を登録したら、その後全ての電話番号は削除できないようにして
少なくとも、有効な電話番号が一つは残るようにしておいた方が良いかもしれません。