このガイドでは、1回限り使用できるコードを送信するためにカスタムSMSゲートウェイを使用する方法について説明します。
デフォルトでは、パスワードレスSMS接続 は、Twilio を使用して1回限り使用できるコードを送信します。ただし、カスタムSMSゲートウェイがある場合は、代わりにそれを使用するために接続を変更できます。
Auth0は、基本的なSMS認証に対応していません。
SMSパスワードレス接続をセットアップします。方法については、パスワードレス接続 の「パスワードレスの実装」セクションをご覧ください。
Management APIのアクセストークンを取得 します。これは、パスワードレス接続を更新するために、Mangement APIを呼び出すために必要です。
GET接続 エンドポイントを使用して、テナントに関する接続についての情報を取得します。より具体的には、パスワードレスSMS接続のIDを取得する必要があります。そうすることで、接続自体を更新する後のAPI呼び出しでそれを使用できます。Management APIに以下の呼び出しを行う前に、ACCESS_TOKEN
を手順1で取得したトークンに置き換えてください。
cURL
C#
Go
Java
Node.JS
Obj-C
PHP
Python
Ruby
Swift
curl --request GET \
--url https://your-auth0-tenant.com/api/v2/connections \
--header 'authorization: Bearer {yourAccessToken}'
エンドポイントからの応答は、オブジェクトの配列です。各オブジェクトは、テナントと関係がある1つの接続を表しています。
4. 接続IDを特定します。手順2でGET接続エンドポイント から返されたオブジェクトの配列を確認して、パスワードレス接続と関係があるIDを見つけることができます。パスワードレス接続のある特定のオブジェクトを見つけるには、"name": "sms"
プロパティを検索できます。接続で、セットアッププロセス中にあなたが提供したTwilio情報が現在表示されていることに注目してください。
[
{
"id" : "con_UX85K7K0N86INi9U" ,
"options" : {
"disable_signup" : false ,
"name" : "sms" ,
"twilio_sid" : "TWILIO_SID" ,
"twilio_token" : "TWILIO_AUTH_TOKEN" ,
"from" : "+15555555555" ,
"syntax" : "md_with_macros" ,
"template" : "Your SMS verification code is: @@password@@" ,
"totp" : {
"time_step" : 300 ,
"length" : 6
},
"messaging_service_sid" : null ,
"brute_force_protection" : true
},
"strategy" : "sms" ,
"name" : "sms" ,
"is_domain_connection" : false ,
"realms" : [
"sms"
],
"enabled_clients" : []
}
]
See all 27 lines
接続を更新する。接続の更新エンドポイント に対してPATCH呼び出しを行うことで、これを実行できます。より具体的には、SMS Gatewayに関する情報を提供するために、接続options
オブジェクトを更新します。
呼び出しのたびにoptions
オブジェクト全体を送信しなければなりません。そうしないと、後続の呼び出しに含まれない既存のデータが上書きされます。
以下の項目を変更します。
twilio_sid
およびtwilio_token
の両方のパラメーターを削除します。
provider
パラメーターを追加し、sms_gateway
に設定します。
gateway_url
パラメーターを追加し、SMSゲートウェイのURLに設定します。Auth0は、ゲートウェイを使用してあなたに代わってメッセージを送信するために、このURLに到達できなければなりません。
ペイロードはこのようになっているはずです。
{
"options" : {
"strategy" : "sms" ,
"provider" : "sms_gateway" ,
"gateway_url" : "{urlOfYourGateway}" ,
"from" : "+1 234 567" ,
"template" : "Your verification code is: @@password@@" ,
"brute_force_protection" : true ,
"forward_req_info" : "true" ,
"disable_signup" : false ,
"name" : "sms" ,
"syntax" : "md_with_macros" ,
"totp" : {
"time_step" : 300 ,
"length" : 6
}
},
"is_domain_connection" : false ,
"enabled_clients" : []
}
認証済み要求
SMSゲートウェイが、トークンベースの認証済み要求を受け入れたら、options
オブジェクトに以下を追加できます。
"gateway_authentication" : {
"method" : "bearer" ,
"subject" : "urn:Auth0" ,
"audience" : "urn:MySmsGateway" ,
"secret" : "MySecretToSignTheToken" ,
"secret_base64_encoded" : false
}
options
オブジェクトにgateway_authentication
を含めた場合、Auth0は、SMSゲートウェイに要求を送信するときはいつでも、認証
ヘッダーにJSON Web Token を追加します。トークンは、gateway_authentication.subject
およびgateway_authentication.audience
値を含み、gateway_authentication.secret
で署名されます。
シークレットがBase64URLエンコードされている場合は、secret_base64_encoded
をtrue
に設定します。
接続を更新したら、Auth0は、ユーザーがパスワードレス接続にサインアップまたはログインするたびに、以下をSMSに送信します。
{
"recipient" : "+1 399 999" ,
"body" : "Your verification code is: 12345" ,
"sender" : "+1 234 567"
}
options
オブジェクトのforward_req_info
プロパティをtrue
に設定した場合、ゲートウェイは、パスワードレスプロセスを開始するHTTP要求からも情報を受け取ります。これには、/passwordless/start
およびユーザーエージェントを呼び出すクライアントのIPアドレスが含まれます。
{
"recipient" : "+1 399 999" ,
"body" : "Your verification code is: 12345" ,
"sender" : "+1 234 567" ,
"req" : {
"ip" : "167.56.227.117" ,
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"
}
}
エラー処理
Auth0は、SMSゲートウェイから返されたHTTPコードのみを考慮し、他の応答を無視します(たとえば、応答本文や応答タイプ)。
SMSゲートウェイが200以外のHTTPコードを返した場合、/passwordless/start
エンドポイントは、HTTP 400コードと以下のような応答を返します。
{
"error" : "sms_provider_error" ,
"error_description" : "Unexpected response while calling the SMS gateway: <HTTP Code Returned by the SMS Gateway>" }
}
SMSゲートウェイがHTTP 401を返した場合、error_description
は、 SMSゲートウェイ呼び出し中に認証に失敗しました:401 になります。(エラーの説明の言葉遣いは、いつでも変更される可能性がありますのでご注意ください)
Auth0では、カスタムSMSゲートウェイに対するHTTPの呼び出しについて、30秒のタイムアウトを強制できます。SMSゲートウェイがこの時間枠内に応答しなかった場合も、/passwordless/start
エンドポイントはHTTP 400コードを返します。応答は、上記のフォーマットで行われ、error_description
フィールドは、 SMSゲートウェイ呼び出し中にタイムアウト:<Timeout Code>
となります。(繰り返しになりますが、エラーの説明の言い回しは、いつでも変更される可能性があります)