cognitoとsdkでサーバーレスなマルチデバイスアプリを構築する

46
Cognito と SDK と ととととととと ととととととととととととととと

Upload: hiroyoshi-miyazaki

Post on 14-Apr-2017

339 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito と SDK でサーバーレスなマルチデバイスアプリを構築する

Page 2: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

自己紹介宮崎 博旨 (みやざき ひろよし)https://www.facebook.com/hiroyoshi.miyazaki.7

仕事・オンプレミスの業務システム開発が主

好きなもの・登山・ボードゲーム

Page 3: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

今日しゃべること懇親会で盛り上がるボードゲーム・カードゲーム便利な Managed Identification サービスであるAWS Cognito について

Page 4: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito って何?

Page 5: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito って何?

Page 6: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito って何?

コレ

Page 7: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito って何?下記機能を提供するサービス

ユーザーごとの ID 発行 AWS サービスの操作権限取得 ユーザー ID ごとのデータストア / 同期

Page 8: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

例えばこういうアプリをつくる場合

Page 9: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

いちいちサインアップするのは面倒くさい

外部サービスと簡単に連携してサインインしたい

Page 10: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

異なるデバイス間でデータを同期したい

Page 11: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

こういうトラブルを起こしてしまう…

Page 12: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

こういうトラブルを起こしてしまう…アクセスキーを埋め込んだコードを、気付かずにGitHub にソースをアップしてしまう ↓速攻で EC2 インスタンスが不正利用される ↓Amazon から $6000 の請求が来る ↓なんとか、不正利用分は請求なし ということで決着

Page 13: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

それ、 Cognito で解決できます

Page 14: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito を使うと何がうれしいのか

外部サービス、または自作アプリのユーザ ID ごとに、一意の ID を発行できる

外部サービスからのサインインが簡単に実現できる

Page 15: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito を使うと何がうれしいのかID の発行状況は Cognito の管理画面で参照可能

Page 16: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito を使うと何がうれしいのか

ユーザ ID ごとに任意のデータを保持できる

デバイス間でのデータ同期もできる!

Page 17: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

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;});

Page 18: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito をはじめるには必要なもの

①Cognito のサービス ID

②Cognito から利用する IAM ロール

④ 外部サービス (Facebook など ) の認証トークン

③ 認証に使う外部サービスの登録

Page 19: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito をはじめるには必要なもの

①Cognito のサービス ID → Cognito の管理画面で発行する

Page 20: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito をはじめるには必要なもの

②Cognito から利用する IAM ロール→Cognito で認証したユーザーに与える権限→ ロールは、 Cognito の ID 作成時に自動的に作成される↓Cognito の管理画面

Page 21: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito をはじめるには必要なもの

②Cognito から利用する IAM ロール→Cognito で認証したユーザーに与える権限→ ロールは、 Cognito の ID 作成時に自動的に作成される↓Cognito の管理画面

ゲストユーザ認証ユーザ

Page 22: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito をはじめるには必要なもの

③ 認証に使う外部サービスの登録→Cognito の管理画面で登録する→ 認証を行う Amazon や Facebook のアプリ ID

Page 23: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

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;});

Page 24: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

あれ?でも。。。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 を公開しても大丈夫なの?

Page 25: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

安心してください

Page 26: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み外部サービスの認証プロバイダを使う場合

Page 27: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み外部サービスの認証プロバイダを使う場合

ここがポイント

Page 28: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み外部サービスの認証プロバイダを使う場合

Cognitoが登録したサービスに問い合わせ

Page 29: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み外部サービスの認証プロバイダを使う場合

外部サービスでの認証が確認されたユーザーにのみ、アクセス件付与

Page 30: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み自作の認証プロバイダを使う場合

Page 31: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み自作の認証プロバイダを使う場合

Cognito はIDを払い出すだけ

認証プロバイダへのチェックなしで大丈夫?

Page 32: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み自作の認証プロバイダを使う場合

ここがポイント

Page 33: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の仕組み自作の認証プロバイダを使う場合

ここがポイント実行するのに権限が必要!

Page 34: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の使い方( 自作プロバイダで認証 )getOpenIdTokenForDeveloperIdentity を呼び出すには、「 AmazonCognitoDeveloperAuthenticatedIdentities 」の権限を付与する必要がある

Page 35: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の使い方( 自作プロバイダで認証 )

「 AmazonCognitoDeveloperAuthenticatedIdentities 」の権限が付与された環境(Lambda など ) の上で実行する必要がある

Page 36: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の使い方( データ同期 )

ユーザー ID ごとに、 Dataset というテーブルにKay-value 形式でデータ保存が可能

Page 37: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

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

Page 38: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の使い方( データ同期 )

DataSet

Key1 Value1Key2 Value2Key3 Value3

DataSet

Key1 Value1Key2 Value2Key3 Value3

PUT GET

クラウド上の DataSet に対して追加 / 取得 / 削除 / 同期 が行える

Page 39: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の使い方( データ同期 )

認証後、CognitoSyncManager からopenOrCreateDataset を呼び出す

client = new AWS.CognitoSyncManager();

client.openOrCreateDataset("myDatasetName", function(err, dataset) {dataset.get('myData', function(err, value) { }

}

Get,Put,Remove,Syncなどの処理を記載

Page 40: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の使い方( データ同期 )

SYNC の場合は、成功時、失敗時、コンフリクト時、データ削除時、の動作を指定可能( 例えば、コンフリクト発生時は、クラウド側のデータで更新するか、デバイス側のデータで更新するか )

dataset.synchronize({onSuccess: function(dataset, newRecords) {},onFailure: function(err) {},onConflict: function(dataset, conflicts, callback) {

for (var i=0; i < conflicts.length; i++) {.. コンフリクトデータごとの処理

}}

})

Page 41: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito の使い方( データ同期 )

うーん、微妙なスペックかも。。ID だけ取得して、データベースで管理したほうがよい??

ユーザーごとの Dataset の最大サイズ    20MB1Dataset の最大サイズ          1MBDataset の Key/Value ペアの最大個数    1024 個

Page 42: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

データ同期の便利な機能

SNS経由でデータが更新されたら通知する!

DataSet

Key1 Value1Key2 Value2Key3 Value3

SNS更新通知

Page 43: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

料金ID 発行、権限付与は無料!データ同期については、データ容量と同期回数によって従量課金

Page 44: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Twilio と一緒に使う例電話

SMS で認証コード送信

認証コードで認証

電話番号

認証コード生成

Page 45: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

Cognito を使っていつの日か、完成させる !

Page 46: CognitoとSDKでサーバーレスなマルチデバイスアプリを構築する

ありがとうございました