Vonage Verify：2FA API（電話番号で二要素認証）

最近色々なセキュリティー事件があって、2FA（二要素認証）がとても話題になっています。従って、[Vonage Verify API](https://vonage.com/communications-apis/verify/)とコールの仕方を簡単に話したいと思います。PINコードをSMS・TTS（Text To Speech：自動音声）で送信することがとても簡単です。2つのAPIコールだけです。




#Vonage Verifyとは？
[Vonage Verify](https://vonage.com/communications-apis/verify/)は2FAを提供しているAPIです。SMSもTTSも利用できて、便利です。SMSもらえない固定電話でも対応できます。やっぱり自分で同じ2FA機能を開発すると、PINコードの管理、SMS・TTSのフェールーオバー、不正アクセスの監視など作らないといけないから、かなり工数がかかるようです。


###Verify 2FAのフロー
![Verify Workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683316/6f86a05c-6e3f-5d6c-0609-794efc61a58c.png)

下記のフローで認証させます。

1. <b>（APIコール）Verify Requestを作成</b>：認証で使う電話番号をリクエストに入れて、request_idが返される。
2. PINコードが送信される。SMSからTTS、SMSの再送信など自動的にハンドリングされる。
3. エンドユーザーがPINコードをアプリに入力する。
4. <b>（APIコール）Verify Check</b>：さっきもらったrequest_idに対して、エンドユーザーが入力したPINコードを確認する。結果が返される。
5. 成功・失敗によって、エンドユーザーにフィードバックする。


###何でメールでPINコードを送信しないんですか？
確かにメールでも2FAができますが、セキュリティーの面で考えると電話（SMS、音声）の方が個人的には安心だと思います。メールによくハッキングされるし、ユーザー名・パスワードが分かれば、入れてしまう場合が多いです。SMS・TTSになるとその携帯（正しく言うと番号と紐付いているSIMカード）を持たないともらえません。

後は、日本で電話番号を契約する前に身分証明書の提出などの本人確認があります。このように電話番号の配付について各キャリアがちゃんとやっていますが、メールになると誰でもいくらでも作れます。使い捨てのメールサービスも少なくはないです。




#Vonage Verifyをコールします。
話は長くなったので、もう試しましょう。


###事前に準備するもの
・VonageのAPI Key（[ここから作れます](https://dashboard.nexmo.com/)）
・curl、postmanなど


###Verify Requestを作成

<b>APIコール</b>

```bash:Request作成
curl -X GET "https://api.nexmo.com/verify/json?\
api_key=API_KEY\
&api_secret=API_SECRET\
&number=PHONE_NUMBER\
&brand=MyAppName5\
&sender_id=MyCompany5\
&code_length=4"
```
パラメータについて
brand：SMSテキストの中に書いてあるブランド名・アプリ名など
sender_id：SMSの送信元

<b>Response</b>

```json:Response
{
  "request_id":"4f707e22e95d4f5393f883872cee24da",
  "status":"0"
}
```
「status:0」ということはエラーなしで受け取りました。

<b>PINコードが送信された</b>
![PIN Code Received.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683316/36bdcb3e-c3b9-a52e-f821-86d36820b2a1.png)
ちゃんと来ました。入力したパラメータ（brand、sender_id）も反映されました。


###PINコードを確認

<b>APIコール</b>

```bash:PINコードを確認
curl -X GET "https://api.nexmo.com/verify/check/json\
?&api_key=API_KEY\
&api_secret=API_SECRET\
&request_id=4f707e22e95d4f5393f883872cee24da&code=5931"
```

<b>Response</b>

```json:Response
{
  "request_id":"4f707e22e95d4f5393f883872cee24da",
  "status":"0",
  "event_id":"1C0000008BAD4250",
  "price":"0.05000000",
  "currency":"EUR",
  "estimated_price_messages_sent":"0.07000000"
}
```
また「status:0」はエラーなし、成功しました。


###リクエスト検索
作ったリクエストはどうなっているの？と知りたい場合、リクエストの検索もできます。かなりの詳細まで情報が出ます。
<b>APIコール</b>

```bash:リクエスト検索
curl -X GET "https://api.nexmo.com/verify/search/json\
?&api_key=API_KEY\
&api_secret=API_SECRET\
&request_id=4f707e22e95d4f5393f883872cee24da"
```

<b>Response</b>

```json:Response
{
  "request_id":"4f707e22e95d4f5393f883872cee24da",
  "account_id":"API_KEY",
  "number":"PHONE",
  "sender_id":"MyCompany5",
  "date_submitted":"2020-10-14 02:20:11",
  "date_finalized":"2020-10-14 02:21:25",
  "checks":[
    {
      "date_received":"2020-10-14 02:21:25",
      "code":"5931",
      "status":"VALID",
      "ip_address":""
    }
  ],
  "first_event_date":"2020-10-14 02:20:11",
  "last_event_date":"2020-10-14 02:20:11",
  "price":"0.05000000",
  "currency":"EUR",
  "status":"SUCCESS",
  "estimated_price_messages_sent":"0.07000000",
  "events":[
    {
      "id":"1C0000008BAD4250",
      "type":"sms"
    }
  ]
}
```


#参考

* Vonage Verify：https://vonage.com/communications-apis/verify/, https://developer.nexmo.com/verify/overview
* API Documentation：https://developer.nexmo.com/api/verify
* Vonageアカウント作成、管理：https://dashboard.nexmo.com/