環境
- windows10
- DockerDesktop for Win 3.5.x
- Laravel 8.x
- PHP 7.4
Twilio SDKの利用にはPHPバージョン5.3以降が必要 - VsCode
- gitbash 2.32.0.1
事前準備
Dockerを用いたLaravelプロジェクトの作成
Dockerを用いたlaravelプロジェクトの作成まではこちら記事で済ませておいてください
Docker・Laravel8・PHP8・Nginx・MySQLを用いて開発環境を爆速で構築する
Twilioのアカウントを作成する
twilioにサインアップしアカウントを作成する
APIの利用に必要な情報を取得する
アカウント作成出来たら、APIの利用に最低限必要な情報は以下と電話番号(これは、Twilio上の電話番号)を取得する
項目名 | 内容 |
---|---|
Account_SID | ACから始まるアカウントごとのID |
Auth Token | 認証用のトークン |
Service SID | VerifyのサービスID(VAから始まる) |
アカウントIDとAuthTokenはコンソールにログインしDevelopタブを選択すると画面下部に表示されているのでこちらを控える
電話番号に関しては、使用できる電話番号がない場合、コンソール上に電話番号を登録するようメッセージが表示されているはずなのでその内容に従って電話番号を登録する
Service SIDに関しては、コンソールでサービス(これは、実際にTwilio Verifyの機能を使用するアプリケーションといって差し支えない)を作成するとサービスごとに割り振られるので、サービスを作成する
サービスは、DevelopタグからVerify→Servicesを選択し、+をクリックすると作成できる
ここまでで、APIの利用に最低限必要な情報がそろいました
Lavavelでサンプルプログラムを実装する
基本的にはこちらの公式ドキュメントのLaravelの手順に従って実装していきます
sdkのインストール
composer require Twilio/sdk
認証情報を.envに設定
.env
# Twilio API credentials
TWILIO_ACCOUNT_SID=ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TWILIO_AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Verification Service SID
TWILIO_VERIFICATION_SID=VAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TWILIO_FROM=Twilioで取得した電話番号。+から。
Controller作成
※詳細なコードは割愛しますが、以下のエンドポイントが構成できればOKです。
- 認証コード(PIN)の送信
- コードの認証
認証コード(PIN)の送信
Account_SIDとAuth Tokenを引数にTwilioのオブジェクトを作成。そこからverificationsのcreateメソッドを呼び出し、どのチャンネルでPINを取得したいかによって引数を切り替える
public function verify()
{
$sid = env('TWILIO_ACCOUNT_SID');
$token = env('TWILIO_AUTH_TOKEN');
$client = new Client($sid, $token);
// ユーザーからの入力値を受け取る
$phoneNumber = XXXXXXXXX;
$client->verify->v2->services(env('TWILIO_VERIFICATION_SID'))
->verifications
->create($phoneNumber, "sms");
}
チャンネルごとのパラメータは以下の通り
チャンネル名 | パラメータ |
sms(再送含む) | create(認証コードを送りたい電話番号, "sms") |
音声 | create(認証コードを送りたい電話番号, "call") |
create(認証コードを送りたいメールアドレス, "email") |
コードの認証
ユーザーから送信されたPINを電話番号あるいはメールアドレスで照合でき、それぞれcreteメソッドをのパラメータが異なる
public function verifyCheck()
{
$sid = env('TWILIO_ACCOUNT_SID');
$token = env('TWILIO_AUTH_TOKEN');
$client = new Client($sid, $token);
// ユーザーからの入力値を受け取る
$phoneNumber = XXXXXXXXX;
$emailAddress = YYYYYYYYY;
$pin = ZZZZZZ;
// 電話番号で照合
$client->verify->v2->services(env('TWILIO_VERIFICATION_SID'))
->verificationChecks
->create($pin, ["to" => $phoneNumber]);
// Emailアドレスで照合
$client->verify->v2->services(env('TWILIO_VERIFICATION_SID'))
->verificationChecks
->create($pin, ["to" => $emailAddress]);
}
ルーティング
web.phpにルーティング追加。上記のコントローラーのメソッドがPOSTで実行できるルートを設定できればOK
デモ
いずれのAPIも、成功時はTwilio\Rest\Verify\V2\Service\VerificationInstanceが返却される
認証コード(PIN)の送信
TwilioのAPIを叩くと、以下のようなレスポンスが返ってくる。特に重要な情報はpropertiesの中にあるstatus
Twilio\Rest\Verify\V2\Service\VerificationInstance {#310 ▼
#properties: array:14 [▼
"status" => "pending"
]
コードが認証されるまでは、このインスタンスのステータスはpendingとなります
コードの認証
認証が完了すると、インスタンスのステータスがapprovedで返却されます
なので、ステータスに応じて次の処理を分岐する
$verification = ・・・・->verificationChecks->create()
if ($verification->status === ""approved) {
// approvedの場合の処理
}else {
// pendingの場合の処理
}
まとめ
いかがでしたでしょうか。本記事では、Twilio Verify×Laravelで二要素認証を実装する手順について紹介しています。ぜひ試してみてください。