cognitoとsdkでサーバーレスなマルチデバイスアプリを構築する
TRANSCRIPT
Cognito と SDK でサーバーレスなマルチデバイスアプリを構築する
自己紹介宮崎 博旨 (みやざき ひろよし)https://www.facebook.com/hiroyoshi.miyazaki.7
仕事・オンプレミスの業務システム開発が主
好きなもの・登山・ボードゲーム
今日しゃべること懇親会で盛り上がるボードゲーム・カードゲーム便利な Managed Identification サービスであるAWS Cognito について
Cognito って何?
Cognito って何?
Cognito って何?
コレ
Cognito って何?下記機能を提供するサービス
ユーザーごとの ID 発行 AWS サービスの操作権限取得 ユーザー ID ごとのデータストア / 同期
例えばこういうアプリをつくる場合
いちいちサインアップするのは面倒くさい
外部サービスと簡単に連携してサインインしたい
異なるデバイス間でデータを同期したい
こういうトラブルを起こしてしまう…
こういうトラブルを起こしてしまう…アクセスキーを埋め込んだコードを、気付かずにGitHub にソースをアップしてしまう ↓速攻で EC2 インスタンスが不正利用される ↓Amazon から $6000 の請求が来る ↓なんとか、不正利用分は請求なし ということで決着
それ、 Cognito で解決できます
Cognito を使うと何がうれしいのか
外部サービス、または自作アプリのユーザ ID ごとに、一意の ID を発行できる
外部サービスからのサインインが簡単に実現できる
Cognito を使うと何がうれしいのかID の発行状況は Cognito の管理画面で参照可能
Cognito を使うと何がうれしいのか
ユーザ ID ごとに任意のデータを保持できる
デバイス間でのデータ同期もできる!
Cognito を使うと何がうれしいのか一時的な AWS リソースへのアクセストークンを取得できる。コードにアクセスキーを埋め込まなくてもよい ↓こんな感じのコードで取得できる
AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'IDENTITY_POOL_ID',});
AWS.config.credentials.get(function(){ var accessKeyId = AWS.config.credentials.accessKeyId; var secretAccessKey = AWS.config.credentials.secretAccessKey;});
Cognito をはじめるには必要なもの
①Cognito のサービス ID
②Cognito から利用する IAM ロール
④ 外部サービス (Facebook など ) の認証トークン
③ 認証に使う外部サービスの登録
Cognito をはじめるには必要なもの
①Cognito のサービス ID → Cognito の管理画面で発行する
Cognito をはじめるには必要なもの
②Cognito から利用する IAM ロール→Cognito で認証したユーザーに与える権限→ ロールは、 Cognito の ID 作成時に自動的に作成される↓Cognito の管理画面
Cognito をはじめるには必要なもの
②Cognito から利用する IAM ロール→Cognito で認証したユーザーに与える権限→ ロールは、 Cognito の ID 作成時に自動的に作成される↓Cognito の管理画面
ゲストユーザ認証ユーザ
Cognito をはじめるには必要なもの
③ 認証に使う外部サービスの登録→Cognito の管理画面で登録する→ 認証を行う Amazon や Facebook のアプリ ID
Cognito の使い方AWS Sdk を使います。Cognito の ID と、外部サービスの認証トークンを 指定して、AWS.config.credentials.get を呼び出すだけAWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'IDENTITY_POOL_ID', Logins: { "graph.facebook.com" : ‘ACCESS_TOKEN’ }});
AWS.config.credentials.get(function(){ var accessKeyId = AWS.config.credentials.accessKeyId; var secretAccessKey = AWS.config.credentials.secretAccessKey;});
あれ?でも。。。AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'IDENTITY_POOL_ID', Logins: { "graph.facebook.com" : ‘ACCESS_TOKEN’ }});
AWS.config.credentials.get(function(){ var accessKeyId = AWS.config.credentials.accessKeyId; var secretAccessKey = AWS.config.credentials.secretAccessKey;});
クライアント側のコードでCognito の ID を公開しても大丈夫なの?
安心してください
Cognito の仕組み外部サービスの認証プロバイダを使う場合
Cognito の仕組み外部サービスの認証プロバイダを使う場合
ここがポイント
Cognito の仕組み外部サービスの認証プロバイダを使う場合
Cognitoが登録したサービスに問い合わせ
Cognito の仕組み外部サービスの認証プロバイダを使う場合
外部サービスでの認証が確認されたユーザーにのみ、アクセス件付与
Cognito の仕組み自作の認証プロバイダを使う場合
Cognito の仕組み自作の認証プロバイダを使う場合
Cognito はIDを払い出すだけ
認証プロバイダへのチェックなしで大丈夫?
Cognito の仕組み自作の認証プロバイダを使う場合
ここがポイント
Cognito の仕組み自作の認証プロバイダを使う場合
ここがポイント実行するのに権限が必要!
Cognito の使い方( 自作プロバイダで認証 )getOpenIdTokenForDeveloperIdentity を呼び出すには、「 AmazonCognitoDeveloperAuthenticatedIdentities 」の権限を付与する必要がある
Cognito の使い方( 自作プロバイダで認証 )
「 AmazonCognitoDeveloperAuthenticatedIdentities 」の権限が付与された環境(Lambda など ) の上で実行する必要がある
Cognito の使い方( データ同期 )
ユーザー ID ごとに、 Dataset というテーブルにKay-value 形式でデータ保存が可能
Cognito の使い方( データ同期 )
ユーザー ID ごとに、 Dataset というテーブルにKay-value 形式でデータ保存が可能
Identity Identity Identity
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
Cognito の使い方( データ同期 )
DataSet
Key1 Value1Key2 Value2Key3 Value3
DataSet
Key1 Value1Key2 Value2Key3 Value3
PUT GET
クラウド上の DataSet に対して追加 / 取得 / 削除 / 同期 が行える
Cognito の使い方( データ同期 )
認証後、CognitoSyncManager からopenOrCreateDataset を呼び出す
client = new AWS.CognitoSyncManager();
client.openOrCreateDataset("myDatasetName", function(err, dataset) {dataset.get('myData', function(err, value) { }
}
Get,Put,Remove,Syncなどの処理を記載
Cognito の使い方( データ同期 )
SYNC の場合は、成功時、失敗時、コンフリクト時、データ削除時、の動作を指定可能( 例えば、コンフリクト発生時は、クラウド側のデータで更新するか、デバイス側のデータで更新するか )
dataset.synchronize({onSuccess: function(dataset, newRecords) {},onFailure: function(err) {},onConflict: function(dataset, conflicts, callback) {
for (var i=0; i < conflicts.length; i++) {.. コンフリクトデータごとの処理
}}
})
Cognito の使い方( データ同期 )
うーん、微妙なスペックかも。。ID だけ取得して、データベースで管理したほうがよい??
ユーザーごとの Dataset の最大サイズ 20MB1Dataset の最大サイズ 1MBDataset の Key/Value ペアの最大個数 1024 個
データ同期の便利な機能
SNS経由でデータが更新されたら通知する!
DataSet
Key1 Value1Key2 Value2Key3 Value3
SNS更新通知
料金ID 発行、権限付与は無料!データ同期については、データ容量と同期回数によって従量課金
Twilio と一緒に使う例電話
SMS で認証コード送信
認証コードで認証
電話番号
認証コード生成
Cognito を使っていつの日か、完成させる !
ありがとうございました