こんにちは、Twilioマーケティング部のkatsu.tです。
昨今、セキュリティ向上のために二要素認証の導入が非常に増えてきています。弊社でも多くのお客様より、二要素認証導入時の認証コードの送信方法として「SMSや電話を使いたい」とお問合せいただいております。
本記事では二要素認証の重要性をはじめ、二要素認証チャネルの多様化、複数のチャネルに跨った認証コードの送信方法などについて詳しくご紹介いたします。
Twilio Verifyのデモ動画はこちらから視聴できます。
目次
二要素認証の重要性
そもそも、なぜ近年ではこんなにも二要素認証の導入が進んでいるのでしょうか。
一昔前は数えられるくらいのサービスにしか登録していなかったものの、今ではウェブサービスの多様化・利便化に伴い、数十のサービスに登録している……という方が増えてきています。
そうなるとID(メールアドレス)とパスワードの管理が煩雑になるため、同じものを使いまわしてしまうケースも少なくありません。
昨今ではサイバー犯罪も高度化されており、どこかのサービスで流出した情報をもとに他のサービスでもログインを試みる手法がよく見られます。つまり同じIDとパスワードを複数のサービスで利用している場合、さまざまなサービスで不正にログインされ、アカウントの乗っ取りや不正利用をされる可能性が高くなるのです。
二要素認証とは
そこで登場したのが「二要素認証」という考え方です。
二要素認証は、以下の要素を2つ以上組み合わせた認証のことをいいます。
- 知識要素(ID、パスワードなどの記憶)
- 所持要素(スマートフォンなどを持っていること)
- 生体要素(指紋や顔)
例えば、知識要素の情報が漏れてしまっても、他の要素で情報を保護できると考えられています。
そのため最近では多くのウェブサービスで、知識要素と所持要素を利用した二要素認証が導入されています。
二要素認証の詳細については「二要素認証とは?基礎知識やメリット、二段階認証との違いを解説」の記事をご覧ください。
二要素認証の多様化
多くのウェブサービスで知識要素と所持要素を組み合わせた認証がおこなわれていますが、その際に問題になるのが「所持要素の多様化」です。
所持要素はユーザーによって使い勝手が異なります。
例えば、弊社では以下のようなケースをよく耳にします。
- 法人利用するため、個人の電話番号は紐づけられない。メールで認証コードを送ってほしい
- 重複登録を減らしたいので、電話番号で認証コードを送りたい
- ユーザビリティ向上のため、プッシュ通知認証をしたい
上記はすべて2要素目の認証をおこなう手段ですが、メール・電話番号(SMS・電話)・アプリと、チャネルが多様化していることがわかります。
サービス提供者の中には、顧客満足度やユーザビリティを考えて、すべてのチャネルを使った手段を検討される方も多いでしょう。しかしチャネルごとにサービスを契約したり、処理の流れを変えたりすることには多大なコストがかかります。結果としてチャネルを絞らざるを得ない、というお悩みをお持ちの方もいらっしゃるのではないでしょうか。
Twilio Verifyについて
Twilio Verifyは、Twilioが提供している二要素認証の仕組みの1つで、認証コードの送信とコードの認証機能を提供しています。
Twilio Verifyを使うことで、自身のプロダクトに素早く二要素認証の機能を組み込めます。
Twilio Verifyの強み
Twilio Verifyの強みは、まずシンプルなAPI構成であることです。
Twilio Verifyは前述の通り、2つのAPI(認証コードを生成・送信するAPI、コードを認証するAPI)で構成されています。
APIの構成が非常に理解しやすく、容易にシステムに組み込むことができます。
またもう一つの強みとして、対応チャネルの多さも挙げられます。
Twilio Verifyは時代に合わせて進化を続けており、最初はSMSと電話でスタートしました。その後メール、プッシュ通知にも対応し、最近ではGoogle Authenticatorなどの認証アプリにも対応しました。
Twilio Verifyで利用できるチャネル
- 電話
- SMS
- WhatsApp
- メール
- プッシュ通知
- 認証アプリ
Twilio Verifyの実装方法
ここからは、Twilio Verifyがどれほど簡単に実装できるか、もっともシンプルに実装できるSMS送信を例にご紹介いたします。
※他のチャネルの実装方法についてはこちらのドキュメントをご確認ください。
TwilioではNode.js、C#、PHP、Python、Java、RubyのSDKを用意しています。
本記事ではもっともシンプルでわかりやすいREST APIの利用方法とLaravel(PHP)を用いた利用方法、Laravel(PHP)を用いたクイックスタートをご紹介いたします。
事前準備
Account SIDとAuth Tokenの取得
Twilioのコンソールにログインして、Account SIDとAuth Tokenを確認します。
Service SIDの取得
Verify Serviceを作成します。
まず、Verify画面を開きます。
続いてServices画面を開き、「+」をクリックします。
Friendly nameを入力して「Create」をクリックします。
このときのFriendly nameが認証コードを送信する際の「Verify service名」になります。
必要に応じてCode Lengthを修正します。
設定ができたら「Save」をクリックします。
最後にService一覧に戻り、Service SIDを確認します。
REST API
Twilio Verifyは2つのAPIで構成されており、非常にシンプルに利用することが可能です。
認証コードの送信
認証コードを送信する手段は、電話・SMS・Eメールから選べます。
※Eメールを利用する際は、別途SendGridの設定が必要となります。詳しくはこちらをご覧ください。
以下APIを用いて認証コードの送信を行います。
curl -X POST https://verify.twilio.com/v2/Services/{Service SID}/Verifications \
--data-urlencode "To=+81xxxxxxxxx" \
--data-urlencode "Channel=sms" \
-u your_account_sid:your_auth_token
パラメータの設定値はこちらを参考に入力してください。
項目名 |
概要 |
{Service SID} |
事前準備で取得したVerifyのサービスID |
your_account_sid |
事前準備で取得したAccount_SID |
your_auth_token |
事前準備で取得したAuth Token |
To |
認証コードを送りたい連絡先 電話番号 or メールアドレス |
Channel |
call(電話) or sms(SMS) or email(Eメール) |
認証コードを送信すると、Toに設定した連絡先に以下のような認証コードが届きます。
※本文は「あなたの{Verify service名}認証コード:」という形で送信します。
コードの認証
ユーザーに送信されたコードを認証するには以下APIを利用します。
curl -X POST https://verify.twilio.com/v2/Services/{Service SID}/VerificationCheck \
--data-urlencode "To=+81xxxxxxxxx" \
--data-urlencode "Code=123456" \
-u your_account_sid:your_auth_token
パラメータの設定値はこちらを参考に入力してください。
項目名 |
概要 |
{Service SID} |
事前準備で取得したVerifyのサービスID |
your_account_sid |
事前準備で取得したAccount_SID |
your_auth_token |
事前準備で取得したAuth Token |
To |
認証コードを送った連絡先 電話番号 or メールアドレス |
Code |
ユーザーに送信されたコード |
PHP(Laravel)
続いて、Lavavelを用いたSDKのインストール方法と利用方法についてご紹介いたします。
SDKのインストール
$ composer require twilio/sdk
認証コードの送信
以下メソッドを用いて認証コードを送信します。
use Twilio\Rest\Client;
class Verification {
function sendCode($phone_number, $channel) {
// clientの初期化
$client = new Client($account_sid, $auth_token);
// コードの送信
$verification = $this->client->verify->v2->services($this->verification_sid)
->verifications
->create($phone_number,$channel);
}
}
変数の設定値はこちらを参考に入力してください。
項目名 |
概要 |
$service_sid |
事前準備で取得したVerifyのサービスID |
$account_sid |
事前準備で取得したAccount_SID |
$auth_token |
事前準備で取得したAuth Token |
$phone_number |
認証コードを送りたい連絡先 電話番号 or メールアドレス |
$channel |
call(電話) or sms(SMS) or email(Eメール) |
コードの認証
use Twilio\Rest\Client;
class Verification {
function checkVerification($phone_number, $code) {
// clientの初期化
$client = new Client($account_sid, $auth_token);
// コードの認証
$verification_check = $this->client->verify->v2->services($this->verification_sid)
->verificationChecks
->create($code, ['to' => $phone_number]);
if($verification_check->status === 'approved') {
// 認証成功
} else {
// 認証失敗
}
}
}
変数の設定値はこちらを参考に入力してください。
項目名 |
概要 |
$service_sid |
事前準備で取得したVerifyのサービスID |
$account_sid |
事前準備で取得したAccount_SID |
$auth_token |
事前準備で取得したAuth Token |
$phone_number |
認証コードを送った連絡先 電話番号 or メールアドレス |
$code |
ユーザーに送信されたコード |
クイックスタート
構築
最後にLaravelを使ったクイックスタートをご紹介いたします。
1. ソースコードのダウンロード
gitを利用して、ソースコードをダウンロードします。
gitを利用していない方は、こちらよりソースコードをダウンロードしてください。
$ git clone git@github.com:TwilioDevEd/verify-v2-quickstart-php.git
2. composer installコマンドを使用します。
$ composer install
3. .env.sampleをコピーして、.envを作成します
$ cp .env.example .env
4. アプリケーションキーを作成します。
$ php artisan key:generate
5. .envに事前準備で取得した値を入力します。
TWILIO_ACCOUNT_SID=ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TWILIO_AUTH_TOKEN=7axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_VERIFICATION_SID=VAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
6. databaseファイルを作成しマイグレーションを行います。
$ touch database/twilio_verify_quickstart.sqlite
$ php artisan migrate
7. アプリケーションを起動します。
php artisan serve
8. http://localhost:8000上で動作を確認します。
動作確認
それでは、http://localhost:8000にアクセスして動作確認してみましょう。
「Register」をクリックして、新規ユーザー作成をおこないます。
続いてUsername、Password、Phone numberを入力します。Phone numberは国を選択し、電話番号を入力してください。
SMSが届いたら、認証コードを入力して、「Verify」をクリックします。
認証ができてログインできるのが確認できます。