この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Auth0でSMSを送信する際、3つのプロバイダータイプを選択できます。
※ SMSは、多要素認証、パスワードレス認証時に使用します
- Auth0
- デフォルトで、100メッセージに制限されています。評価やテストを目的とした時に使用することが多いです
- Twilio
- SMS用のTwilio Programmable SMS APIまたは音声用のTwilio Programmable Voice APIを使用してメッセージを送信します。本番環境ではこれを使うことが多いかと思います。Auth0と統合されている唯一のプロバイダーです。
- Custom
- Auth0と統合されていないプロバイダーを使用してメッセージを送信したい時に使用します。Send Phone Message Hookという機能を使います
Amazon Simple Notification Service(SNS)を使ってSMSを送信したいという要望があったため、今回のきじではCustomプロバイダータイプを選択して設定してこうと思います。
前提
- AWSのアカウントにサインアップ済み
- AmazonSNSFullAccessロールを持つ新しいAmazon IAMユーザーを作成しておきます
Send Phone Message Hookの作成
Hookとは、Auth0プラットフォームの選択された拡張ポイントに対して実行されたときのAuth0の動作をカスタマイズできる、安全な自己完結型の機能です。Auth0は実行時にHookを呼び出して、カスタムNode.jsコードを実行します。
Auth0ダッシュボードにログインし、左メニューのHooksをクリックします。遷移したページ下部にSend Phone Messageの項目があるので、Create New Hookをクリックします。
名前を入力し、CREATEボタンを押します。
作成が完了すると、Hookの一覧ページに戻るので、作ったHookを編集していきます。
Hook Secretを作成します。 ここには、以下のキーで対応する値を設定します。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_REGION
3つ追加できたことを確認しましょう。
追加した後は、SMS経由で確認コードを送信するためにAWS SNSを呼び出すコードを追加していきます。 エディタに書かれているコードを以下のものに全て置き換えます。
// Load the SDK
var AWS = require("aws-sdk");
/**
@param {string} recipient - phone number
@param {string} text - message body
@param {object} context - additional authorization context
@param {string} context.factor_type - 'first' or 'second'
@param {string} context.message_type - 'sms' or 'voice'
@param {string} context.action - 'enrollment' or 'authentication'
@param {string} context.language - language used by login flow
@param {string} context.code - one-time password
@param {string} context.ip - ip address
@param {string} context.user_agent - user agent making the authentication request
@param {string} context.client_id - to send different messages depending on the client id
@param {string} context.name - to include it in the SMS message
@param {object} context.client_metadata - metadata from client
@param {object} context.user - To customize messages for the user
@param {function} cb - function (error, response)
*/
module.exports = function(recipient, text, context, cb) {
process.env.AWS_ACCESS_KEY_ID = context.webtask.secrets.AWS_ACCESS_KEY_ID;
process.env.AWS_SECRET_ACCESS_KEY = context.webtask.secrets.AWS_SECRET_ACCESS_KEY;
process.env.AWS_REGION = context.webtask.secrets.AWS_REGION;
var params = { Message: text, PhoneNumber: recipient };
var publishTextPromise = new AWS.SNS({ apiVersion: "2010-03-31" })
.publish(params)
.promise();
publishTextPromise
.then(function() {
cb(null, {});
})
.catch(function(err) {
cb(err);
});
};
保存した後にエディタを確認すると、上記のようにaws-sdkのパッケージがないと警告が表示されていますので、このパッケージをフックに含める必要があります。
スパナのマークをクリックし、npm modulesをクリックしますと、モジュールを追加するエリアが表示されるので,ここから追加します(Add Module)
検索ボックスにaws-sdk
と入力して追加します
実行テスト
右上のRunアイコンをクリックして、フックをテストします。パラメータを編集してSMSを受信する電話番号を指定し、Runボタンをクリックします。
※ recipient
に受信する番号を設定
リクエストが成功すると、200OKが返ってきます。 指定した電話番号にもメッセージが届いているはずです。
実際のログインフローで試してみる
テスト実行が終わったので、実際のアプリケーションを使ってログインを行いSMSが送信されるのか確認します。
Multi-factor Authenticationの画面で、Phone Message
のトグルがオンになっていることを確認しましょう。
Phone Message
の設定では、Choose Delivery ProviderをCustomに変更します。
全て設定が終わったあと、アプリケーションからログインを実行し、SMSが機能しているか確認しましょう。
テキストメッセージが届かない場合はログを確認します。
最後に
Amazon SNSを使ってAuth0からテキストメッセージを送ってみました。
統合されているTwilio以外を使うということになった時はPhone Message Hook
を使うことで可能になるので是非試してみてください。
Auth0のドキュメントには Infobip
,TeleSign
, Vonage
, Esendex
,Mitto
といったサービスをプロバイダーとする方法も記載されていますので、これらを使いたい時は参照してください。