Push認証(多経路認証)とNotificationサービス(1)

# はじめに
スマートフォンへのPush通知は普段から皆さんが接する機会が多いと思います。
また、Push通知のためのクラウドサービスも昨今充実してきたと感じます。
今回はそのクラウドサービスとPush通知の仕組みを利用して、Push認証(多経路認証)を構成する仕組みの理解や手順の把握を目的とした記事を掲載しようと思います。
Push認証(多経路認証)を実現するソフトウェアとしてOpenAMを利用します。
クラウドサービスについては、AWSのSimple Notification Service(SNS)、GoogleのFirebase Cloud Messaging(FCM)、AppleのApple Push Notification Service(APNs)を利用します。
Android,iOSのスマートフォンで実演します。
第1回としてPush認証(多経路認証)の動作を紹介します。

# (1)デバイス登録
とにもかくにも動きをみてましょう。
はじめにOpenAMへユーザーのデバイス登録をおこないます。

![flow1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/ce719294-c391-27e3-3513-640ed20247e6.png)

ブラウザ上でOpenAMに認証した後にバーコードが表示され、それをスマートフォンのAuthenticatorアプリがカメラ機能で読み取ります。アプリが読み取ったOpenAMのAPI情報やチェレンジコード、共有鍵から、生成したデバイストークンをOpenAMに送信します。OpenAMはAWS SNS上に該当デバイスのエンドポイントを登録します。エンドポイントの登録が成功すればOpenAMが利用するデータストアにも情報を登録します。

実際の画面のスナップショットです。
※開発中の画面です。

①デバイストークン生成
こちらはAuthenticatorアプリをインストールした際に生成しています。

②ID/PWD認証
PC上のブラウザです。
![pushreg1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/387b0ac8-ea27-374a-e4ee-20d27555c142.png)

③バーコード表示
![pushreg4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/ed110750-8b01-fed0-5654-d90304a9d534.png)

④バーコード取込
スマートフォン上の画面です。
![pushreg6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/e4157915-62fc-ec84-9061-f65b8070fe56.png)
![pushreg7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/8442cbf7-0e19-aee4-1a08-a1d0eef979fb.png)

⑤デバイス登録
PC上のブラウザに登録完了された画面が表示されます。
※この画面が表示されたときには既に⑥、⑦も完了しています。
![pushreg8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/a96242f5-dd37-f644-fb20-e7244017d266.png)


⑥エンドポイント登録
AWS SNS上のFCMのプラットフォームにデバイスのエンドポントが表示されます。
![awssns5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/7f340ed1-95ba-78ec-92f7-7721407061ce.png)

⑦Push情報登録
OpenAMのダッシュボードには登録されたPush Deviceが表示れます。
![pushreg10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/e975d0e0-c68e-784b-fcd8-70cd1c3534b9.png)

# (2)Push認証
デバイス登録が出来たら実際に認証してみます。

![flow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/f07c7ca4-e88d-18cb-09e5-26fe34093818.png)

PC上のブラウザで認証が必要なアプリケーションのページにアクセスすると、OpenAMがID入力画面を表示します。
IDを入力してログインすると、Push認証の待受け画面を表示します。
OpenAMからAWS SNS、Google FCM経由でスマートフォンのAuthenticatorアプリに通知が飛びます。
スマートフォン上で認証を許可すると、PC上のブラウザでは待受け画面からアプリケーションのページに遷移します。

①ID入力
![pushauth1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/694a4116-d767-c37b-f55f-49717d2f948f.png)

②Push情報参照
これはOpenAMが先ほどのデータストアに登録された情報をIDを元に取りだします。

③Push認証待受け表示
![pushauth2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/ede68aca-874e-d45a-ef26-efbbba1bcbac.png)

④トピック通知
OpenAMからAWS SNSのトピックというNotificationのポイントに送られます。

⑤プラットフォーム通知
AWS SNSからGoogle FCMのプラットフォームに通知がおこなわれます。

⑥デバイス通知
![pushauth3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/cad7227a-ef34-ed35-9247-7c299b0f1d8c.png)

⑦認証応答
Androidの場合はAcceptかRejectで応答します。
![pushauth6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/e50cd39e-01df-5396-d720-d50e7afb0838.png)

iOSの場合はTouch IDで応答します。
<img width="375" alt="pushauth10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/b4c0513b-d58d-36a6-f2ae-77b97e61a479.png">
実機がiPhone11でTouch IDがないためパスコードが表示されています。
Face IDでも利用できるよう改良予定です。

⑧認証完了
待受け画面が解除されてサンプルアプリケーションの画面が表示されています。
![pushauth9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316107/9a20f281-9d17-2085-49e5-2679e821e2e8.png)

# おわりに
まずはPush認証(多経路認証)がどういうものか理解してもらえたでしょうか。
ワンタイムパスワードの認証と似ているかと思いますが、違いとしてはログイン画面でのパスワードの入力が不要となります。
それからスマートフォンでの認証応答でボタンを押すだけなので、わざわざOTPコードを入力する必要がありません。
また、スマートフォン上のNotificationをタップすればアプリが自動的に表示されるためUXも向上します。
ただし、Push認証の場合は通知をするためのクラウドサービスの準備が必要となります。
次回では、OpenAMやAWS SNS、Google FCMの設定方法について紹介したいと思います。

# 追記
2020/03/04 Push認証を利用する場合におわりにであげたようにパスワードを入力しないケースでは、あるユーザが誰か他のユーザーのIDを推測してログインを実行したときに、他のユーザーが自分のデバイスでそのリクエストを混同して許可してしまうということが想定されます。
通常はID/パスワード認証に加えた多要素認証として利用することが推奨されています。