Twilio Authyを用いた二要素認証(二段階認証)の実装方法

こんにちは、Twilio事業部のkatsu.tです。

本記事では、二要素認証を素早く自分のプロダクトに組み込めるTwilio Authyについてご紹介いたします。

目次

Twilio Authyとは

Twilio Auhty

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つあります。

  1. ユーザー作成
  2. 認証コード送信
  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 KEYAuthy 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()) {
            // 認証成功
        }
    }
}

まとめ

Authyでユーザーを作成する際は、実在しない電話番号でもユーザーを登録することが可能です。
そのため、Twilioが提唱しているように、ユーザー登録の際は電話番号が実在するかをVerifyを用いて確認を行い、電話番号の実在が確認できた後、Authyでユーザーを作成して二要素認証の運用を行うのをオススメします。

アプリケーションエンジニア 葛 智紀

前職でiOS、Androidのネイティブアプリケーション開発、AngularやLaravelを用いたウェブアプリケーション開発に従事。
KDDIウェブコミュニケーションズではTwilioの最新情報の発信やTwilioを用いた地域課題解決を担当。
個人では、Google Developer Group Tokyoのオーガナイザーを務める。

この記事をシェア

すべての記事へ

Blog

Twilioビジネスセミナー Vol.62 Genesys Cloud × Twilioで実現する”クラウドファースト”コンタクトセンター

Blog

【Insightsシリーズ第3弾】Twilio Messaging Insightsがリリース!

Blog

Media Streamが双方向に対応し、スムーズな音声ボットが作れるようになりました!

Blog

クラウドコンタクトセンターリリース後に起きた失敗と改善について

Blog

二段階認証とは|メリット、種類、導入方法、二要素認証との違いは?

Blog

Twilio Authyを用いた二要素認証(二段階認証)の実装方法