LaravelでSMS認証

どうもこんにちは

先日の投稿で、メール認証をやってみましたが、
今回はTwilioを使ったSMS認証をやってみます。

Twilioのチュートリアルに、しっかりやり方書いてあるので、
そっち見てもらったほうが早いかもしれませんが、
私がやったことたちを備忘録として。

ここを参考にしました。 ⇒ Account Verification with Authy, PHP and Laravel – Twilio


目標

こんな感じで行きます。ボタンの適当な英語はご愛嬌。

流れ

・ユーザ登録画面
⇒ これ、Laravelのmake:authで作られるアレをそのまま
⇒ 登録できたら電話番号入力へ
・電話番号入力画面
⇒ 電話番号を入力して「Send SMS」を押すとSMSを送信
・トークン入力画面
⇒ トークンを入力して「Verify」を押すと認証する
⇒ 「Resend SMS」を押すと電話番号入力に戻る
⇒ 「Verifiing Via Phone」を押すと入力していた電話番号に電話がかかってくる

その他

・SMS認証が終わってないとアクセスできないようにmiddlewareを作る。
⇒リダイレクト先はトークン入力画面

では、行きましょう。


Authy\AuthyApiのインストールおよび設定

なにはなくとも、コレです。

Composer

コマンドを実行します。

composer require authy/php

.envを修正

Twilioで作るAuthy PRODUCTION API KEY が必要です。
作り方は公式ドキュメントにお任せです。

AUTHY_API_KEY=[Your Authy PRODUCTION API KEY]


サービスプロバイダに登録

先ほどインストールと設定したAuthy APIをアプリケーション全体で利用できるように
サービスプロバイダに登録します。

app/Providers/AuthyApiProvider.php

config/app.php


データベースの変更

今回はUsersテーブルを直接まさぐりました。

php artisan make:migration prepare_users_table_for_sms_verify --table=users

migrationファイルはこんな感じです。

忘れずに、migrateします。
php artisan migrate


テンプレートファイルの作成

今回は、国番号を81(日本)を固定しています。
必要に応じて、入力になってもよいですね。

デザインとか、そんなちっさいことは気にするな!
それわかちこわかちこー

resources/views/auth/sms/send.blade.php

resources/views/auth/sms/verify.blade.php

 


コントローラ作成

あまり難しく考えてません。サンプルのコードを見ながら、合うようにちょこちょこ直しただけです。

特筆すべきは、
・各アクションメソッドの引数に、サービスプロバイダに登録したAuthyApiオブジェクトが登場していること
⇒本当は必要なところだけでよいのですが、勢いで。
・71行目「$authyApi->requestSms($user->authy_id);」でSMSを送信している。
・126行目「$authyApi->phoneCall($user->authy_id);」で電話をかけている。
といったところでしょうか。

app/Http/COntrollers/Auth/SmsVerificationController.php

あと、登録時に電話番号入力側に流したいので、RegisterControllerにちょいっと追記。
登録後にリダイレクトするだけです。

 


ルーティング

いつものように、追記です。

routes/web.php

 


ミドルウェア

メール認証の時にお世話になったEnsureEmailIsVerifiedを参考に、こんな感じに仕上げました。
認証していないときで、リダイレクト先を与えられなかった時は、
トークン入力画面にリダイレクトさせます。

app/Http/Middlewares/EnsureSmsIsVerified.php

あとは、Kernel.phpに登録します。
メール認証のかわりに、こちらを使ってみます。

app/Http/Kernel.php

 


結果

SMS、電話とも日本語でちゃんとできました。
スバらしい。

メール認証とSMS認証、どっちもできるようにもがんばったらできます。

それでは、また

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です