Amazon Cognito
# Amazon Cognito
https://d1.awsstatic.com/webinars/jp/pdf/services/20170517_AWS-BlackBelt_AmazonCognito.pdf
## AWS のモバイルサービス
- ユーザー認証、アクセス許可
- Amazon Cognito(Identity)
- データ同期
- Amazon Cognito(Sync)
- ログストリーム
- 行動分析
- ビジネスロジックの実行
- AWS Lambda
- RESTful API サーバー
- メディアの管理
- メディアの配信
- プッシュ通知の送信
- チャットボット
- Amazon Lex
- 共有データの保存
- DynamoDB
- 実機テストの並列実行
- DeviceFarm
## Amazon Cognito とは
## Congnito Identity
### Your User Pools
- マネージドなユーザー管理サービス
- 認証を担当
- MFAオプション、パスワードポリシー、ユーザーのグルーピング、認証フローをサポート
- ユーザーの操作
- ユーザのサインアップとサインイン
- ユーザプロファイル
- パスワード紛失
- トークンベースの認証
- Email or 電話番号による確認
- SMS ベースのMFA
- AWS Lambda を利用した認証のカスタマイズ
- 管理者の操作
- ユーザプールの作成と管理
- 属性の定義
- 必須属性データの要求
- アプリのパーミッション
- パスワードポリシーのセットアップ
- ユーザーの検索
- ユーザーの管理
### Federated Identities
- 概要
- 認可を担当
- 認証は外部Identityy Provider 等に移譲
- 未認証ユーザーにUnauth Identity としてゲスト用権限(IAM Role)を払い出すことも可能
- 1人の人間が持つ複数のIdentity Provider のアカウント情報をIdentity としてまとめる(=Federation)
- AWS リソースへのアクセス権の管理(Temporary Credential はIAM から発行している)
- ロールベースのアクセコントロールでIdentity IDごとに制御することも可能(自分のリソースだけにアクセスさせるようにしたい)
- 概念
- Identity
- 複数IDプロバイダーのアカウント、複数デバイスを持ちうる1人のユーザ
- IdentityID
- Identity に付与されるID
- IdentityPool
- Role等の紐付けを設定するプール。大抵の場合1つのアプリまたはサービスに相当する単位
- 未認証アクセスのON/OFFの設定
- Authenticated Role
- 認証済みIdentity に付与する権限を定義したIAM Role
- 1つのIdentity Poolにつき1つ設定
- Unauthenticated Role
- 未認証Identity に付与する権限を定義したIAM Role
- Authentication Providers
- Identity Pool に紐づける認証プロバイダ
## Coginito Sync
- 概要
- Federated Identities のIdentity が持つ複数デバイス間でデータの同期を担当(データ共有ではない)
- オフラインサポート
- バックエンド不要(シンプルなクライアントSDKの形で提供)
- データ同期実行時にPush Sync、Cognito Streams、Cognito Events などの処理を連動させることも可能
- 同期処理
- Synchronize
- 接続が不安定になるときの処理の実装は自身で行わなければならない
- コールされるとクラウド上の変更がPull され、ローカルの変更がPush される
- Syncronize on Connectivity
- 実行時に接続可能であれば通常のSynchronize メソッドと同様の振る舞いをする
- 接続できなかった時は接続状態を監視し、可能になったときに同期を行う
- 複数回呼び出された時は最後のオペレーションがキープされる
- Amazon Cognito Push Sync
- SNS Mobile Push との連携
- Mobile Push を受け取ったアプリはデータストアの再同期を行うといった処理が可能
- Amazon Cognito Stream
- Amazon Cognito Events
- Amazon Lambda との連携
- データが更新されたタイミングで発火し、サーバーサイドで登録データのバリデーションや加工を行う処理をLambda に行わせることができる
## 雑感
Cognito 自体が今まで認証・認可のサービスという認識で深くは知らなかった。
Identity Pool が認証を担当し、Federated Identity がIAM やIdP プロバイダに問い合わせを行い認可を行うという構図が掴めて理解が深まった。
デバイス間の同期のあたりもCognito を介して行うことができるので複数デバイスで複数のプラットフォームを利用したい場合には絶対に利用することになるサービスになる。モバイルだと電場が不安定になる場合もあるので実装上は注意が必要というのもわかってはいるが、なかなか丁寧にエラーハンドリングしないといけないので難しそう。。。
認証の仕組み自体が、いろいろな場所に問い合わせを行う形になっているので実装を通して理解する感じになると思う。