こんにちは、Twilio事業部のkatsu.tです。 本記事では、二要素認証を素早く自分のプロダクトに組み込めるTwilio Authyについてご紹介いたします。
目次
Twilio Authyとは
Twilio Authyとは、Twilioが提供している二要素認証の仕組みの一つで、Twilio Authy APIを使用することで二要素認証を簡単に追加できます。電話とSMSを介して送信されるOTP(ワンタイムパスワード)やSoft Token TOTP(時間ベースのワンタイムパスワード)、Authyアプリを介したPush Authentication(プッシュ認証)を提供しています。
Twilio AuthyとTwilio Verifyの違い
Twilio Verifyの最大の特長は、「開発の容易性」です。
わずか10 行足らずのコードを追加するだけで、既存のアプリケーションに二要素認証を組み込むことができ、技術者の開発の負荷を大きく減らすことが可能です。しかし、ユーザーの情報については、サービスを提供されている企業にて保持・運用いただく必要があります。
Twilio Authyは、Twilio Verifyでも使用できる「SMS・音声通話・メール」の認証だけでなく、「Push Authentification」や 「Soft Token TOTP」などの多種多様な認証方法を選択して利用できます。
また、ユーザーの情報も含めてTwilioのプラットフォームで管理を行うので、企業はより運用時のメリットを得られやすくなります。
Twilioが提唱しているユースケース
機能名 |
ユーザー情報の保持・運用 |
ユースケース |
Twilio Verify |
サービス提供者 |
ユーザーのサインアップ、電話番号または電子メールの新規または変更の追加 |
Twilio Authy |
Twilio |
ログイン、支払い、設定の変更などの重要なアクションの繰り返し |
Twilio AuthyとTwilio Verifyの推奨の利用方法
Twilio Authyは、二要素認証を行う前にAuthyにユーザーを作成する必要があります。しかし、電話番号やメールアドレスを使ってユーザーを作成する際、実在しない電話番号でもユーザーを作成することが可能です。 そのため、Twilio Verifyを用いて入力された電話番号を認証した後、Authyのユーザー作成を行って二要素認証を運用することをオススメしています。参考ページはこちらをご覧ください。
Twilio Authyの実装方法
本記事では最もシンプルでわかりやすいSMSを用いた認証の方法をご紹介いたします。 Authy APIを介してSMSを用いた認証を行うためには手順が3つあります。
- ユーザー作成
- 認証コード送信
- コードの認証
こちらの手順をREST APIとLaravel(PHP)を用いてご紹介いたします。 Authy APIの詳細についてはこちらをご覧ください。
事前準備
Twilio Account
Twilioアカウントをまだ作成していない方は、こちらの「無料アカウント作成」よりアカウントの作成をお願いします。
Authy api key
Authy api keyを取得するには、まずAuthy Applicationを作成する必要があります。 まず、Authy画面を開きます。
「Create Application」 をクリックし、新しくApplicationを作成します。
FRIENDRY NAMEに適当な名前を入力し、「Create」をクリックします。
※ここで入力したFRIENDRY NAMEがSMS送信した際のアプリケーション名となりますが、後で設定から変更することも可能です。
Applicationが作成できた際に開かれる設定画面のPRODUCTION API KEY が Authy api keyです。
REST API
ユーザー作成
curl "https://api.authy.com/protected/json/users/new" \
-H "X-Authy-API-Key: AUTHY_API_KEY" \
-d user[email]=email address \
-d user[cellphone]=phone number \
-d user[country_code]=country code
パラメーター名 |
概要 |
AUTHY_API_KEY |
事前準備で取得したAuthy api key |
email address |
登録したいユーザーのメールアドレス |
phone number |
登録したいユーザーの電話番号 先頭の 0 をとった番号 例:09012345678→9012345678 |
country code |
国番号 日本の場合は 81 |
認証コード送信
curl https://api.authy.com/protected/json/sms/{userId} \
-H "X-Authy-API-Key: AUTHY_API_KEY"
パラメーター名 |
概要 |
AUTHY_API_KEY |
事前準備で取得したAuthy api key |
userId |
ユーザー作成時に取得できる id コンソールからも確認可能 |
コードの認証
curl https://api.authy.com/protected/json/verify/{smsCode}/{userId} \
-H "X-Authy-API-Key: AUTHY_API_KEY"
パラメーター名 |
概要 |
AUTHY_API_KEY |
事前準備で取得したAuthy api key |
smsCode |
SMSで送られてきた認証コード |
userId |
ユーザー作成時に取得できる id コンソールからも確認可能 |
Laravel(PHP)
SDKインストール
$ composer require twilio/sdk
ユーザー作成
use Authy\AuthyApi;
class Verification {
function create($email,$phone_number,$country_code) {
// authy_apiの初期化
$authy_api = new AuthyApi('authy_api_key');
// ユーザー作成
$user = $authy_api->registerUser($email,$phone_number,$country_code);
if($user->ok()) {
// 作成成功
printf($user->id());
} else {
// 作成失敗
foreach($user->errors() as $field => $message) {
printf("$field = $message\n");
}
}
}
}
認証コード送信
use Authy\AuthyApi;
class Verification {
function sendVerificationCodeVoice($authy_id) {
// authy_apiの初期化
$authy_api = new AuthyApi('authy_api_key');
$response = $authyApi->requestSms($authy_id, ['force' => 'true']);
if ($response->ok()) {
// 送信成功
} else {
// 送信失敗
}
}
}
コードの認証
use Authy\AuthyApi;
class Verification {
function verifyToken($authy_id, $token_entered_by_user) {
// authy_apiの初期化
$authy_api = new AuthyApi('authy_api_key');
$token_entered_by_user = '1234567';
$verification = $authy_api->verifyToken($authy_id, $token_entered_by_user);
if ($verification->ok()) {
// 認証成功
}
}
}