TwilioのVerify APIで音声通話認証(OTP)を試してみた
こんにちは、昴です。
今回はTwilioのVerify APIを使って、音声通話で認証コード(OTP)を届ける「音声通話認証」を試してみます。
はじめに
Twilioは電話やSMS、チャットなどのコミュニケーション機能を組み込むためのクラウドベースのAPIプラットフォームです。TwilioのAPIを利用することで通信ソリューションを自由にカスタマイズして構築することができます。 以前、Twilio VerifyのTry it outを使ってノーコードでSMS二要素認証を試してみたという記事で、SMSを使った認証コードの送受信をノーコードで体験しました。Twilio Verifyはそれ以外にも「音声通話」「WhatsApp」「メール」など複数のチャネルで認証コードを送ることができます。 今回はその中でも「音声通話」チャネルにフォーカスして、curlでAPIを叩く形で音声OTP認証を試してみます。メールや外部サービスとの連携は一切不要で、Twilioアカウントだけで完結するのがポイントです。
前提・検証環境
本記事の手順を進めるにあたり、以下の環境および権限が必要です。
- Twilioアカウントが開設済みであること
- OTPを受信できる電話番号があること(携帯電話・固定電話どちらでも可)
- curlが使える環境があること(Mac/LinuxのターミナルまたはWindows PowerShell)
設定
Verify Serviceを作成する
まずTwilioコンソールのサイドバーから Verify > Services へ移動し、「Create New」ボタンをクリックします。

設定ウィンドウが表示されるので、以下の項目を入力・設定します。
- Friendly name:分かりやすい名前を入力します(例:My-Voice-Verify-Service)
- Authorize the use of friendly name.:チェックを入れます
- Verification channels:「Voice」のトグルをオン(青色)にします
設定できたら「Continue」をクリックします。

「Continue」をクリックするとそのままService settings画面に遷移します。
Service SIDを確認して環境変数に設定する
Service settings画面に「Service SID」(VAで始まる文字列)が表示されています。これがVerify APIを呼び出す際に使用するIDです。コピーしておきます。

次に、TwilioコンソールのAccount Dashboardを選択し、画面右側の「Account Info」セクションから Account SID(ACで始まる文字列)と Auth Token を確認します。

確認できたら環境変数に設定します。
- Mac/Linux(ターミナル)の場合:
export TWILIO_ACCOUNT_SID="ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export TWILIO_AUTH_TOKEN="your_auth_token"
export VERIFY_SERVICE_SID="VAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- Windows(PowerShell)の場合:
$env:TWILIO_ACCOUNT_SID = "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$env:TWILIO_AUTH_TOKEN = "your_auth_token"
$env:VERIFY_SERVICE_SID = "VAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
実践
認証コードを音声通話で送信する
以下のコマンドを実行します。電話番号の部分をOTPを受け取りたい電話番号(国際形式)に置き換えてください。日本の携帯番号の場合、090-1234-5678 → +819012345678(先頭の0を取って+81をつける)という形式です。
- Mac/Linux(ターミナル)の場合:
curl -X POST "https://verify.twilio.com/v2/Services/${VERIFY_SERVICE_SID}/Verifications" \
--data-urlencode "To=+819012345678" \
--data-urlencode "Channel=call" \
-u "${TWILIO_ACCOUNT_SID}:${TWILIO_AUTH_TOKEN}"
- Windows(PowerShell)の場合:
curl.exe -X POST "https://verify.twilio.com/v2/Services/$env:VERIFY_SERVICE_SID/Verifications" --data-urlencode "To=+819012345678" --data-urlencode "Channel=call" -u "$($env:TWILIO_ACCOUNT_SID):$($env:TWILIO_AUTH_TOKEN)"
SMSのときと比べると Channel=sms が Channel=call に変わっているだけです。エンドポイントもパラメータの構造もほとんど同じなので、SMS認証の実装を持っているシステムに音声認証を追加したい場合もスムーズに対応できます。
コマンドが成功すると以下のようなレスポンスが返ってきます。
{
"sid": "VExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"service_sid": "VAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"to": "+819012345678",
"channel": "call",
"status": "pending",
...
}
"status": "pending" が返ってきたら送信成功です。数秒以内に指定した電話番号に着信があります。

音声で届いた認証コードを確認する
電話に出ると、自動音声が6桁の認証コードを3回読み上げます。
「Twilio Verify Service の電話認証コードは xxxxxx。 繰り返します。xxxxxx。最後にもう一度繰り返します。xxxxxx。ありがとうございました。」
読み上げられたコードをメモします。
認証コードを検証する
音声で届いた6桁のコードを使って検証を行います。+819012345678 と 123456 をそれぞれ実際の電話番号と受信したコードに置き換えてください。
- Mac/Linux(ターミナル)の場合:
curl -X POST "https://verify.twilio.com/v2/Services/${VERIFY_SERVICE_SID}/VerificationCheck" \
--data-urlencode "To=+819012345678" \
--data-urlencode "Code=123456" \
-u "${TWILIO_ACCOUNT_SID}:${TWILIO_AUTH_TOKEN}"
- Windows(PowerShell)の場合:
curl.exe -X POST "https://verify.twilio.com/v2/Services/$env:VERIFY_SERVICE_SID/VerificationCheck" --data-urlencode "To=+819012345678" --data-urlencode "Code=123456" -u "$($env:TWILIO_ACCOUNT_SID):$($env:TWILIO_AUTH_TOKEN)"
確認
正しいコードを入力した場合、以下のようなレスポンスが返ってきます。
{
"sid": "VExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"service_sid": "VAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"to": "+819012345678",
"channel": "call",
"status": "approved",
"valid": true,
...
}
"status": "approved"、"valid": true が確認できれば、音声通話認証は成功です。

試しに間違ったコードを入力してみると、"status": "pending" のまま "valid": false が返ってきます。コードが正しくないと認証が通らないことも確認できます。

認証コードの有効期限について SMS認証のときと同様、Twilio Verifyの認証コードは「10分経過」「承認済み」「入力上限到達(デフォルト5回)」のいずれかを満たすと失効します。有効期限が切れた後に検証しようとすると「The requested resource was not found」というエラーが返ってきます。時間が空いてしまった場合は再度コードを送り直してください。
実際の運用では
今回はcurlで手動APIを叩いて動作を確認しましたが、実際のシステムに組み込む際はアプリケーションからAPIを呼び出す形に置き換えて使います。「認証コードを送る」「届いたコードを照合する」という2ステップのAPIはSMSのときとまったく同じ構造なので、Node.jsやPythonなど利用言語のTwilio公式SDKを使えばスムーズに実装できます。
まとめ
今回はTwilioのVerify APIを音声通話チャネルで使い、OTP認証を試してみました。 外部サービスとの連携が一切不要で、Twilioアカウントとcurlコマンドだけで完結するのが音声通話チャネルのシンプルさです。 本ブログが少しでも参考になれば幸いです。
告知
Twilio/SendGridセミナーを毎月開催しています
クラスメソッドではTwilio/SendGridのセミナーを毎月開催しております。いずれもTwilio及びSendGridを良く知らない方向けに基本的な部分から解説する内容となっておりますので、今後Twilio/SendGridの導入を検討している方や、既に導入済で改めて基本的な部分を勉強したいと考える方は、是非お気軽にご参加いただければと思います。






