Masayan tech blog.

  1. ブログ記事一覧>
  2. Twilio Verify×Laravelで二要素認証を実装する手順

Twilio Verify×Laravelで二要素認証を実装する手順

公開日

環境

  • 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です。

  1. 認証コード(PIN)の送信
  2. コードの認証

認証コード(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")

Email

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で二要素認証を実装する手順について紹介しています。ぜひ試してみてください。