1

我最近開始嘗試使用AWS AppSync,但我對AWS Cognito有一些疑問。將AWS Cognito用戶保存到DynamoDB中

我希望用戶能夠通過Facebook進行身份驗證,但我需要他們的個人資料圖片,姓名和電子郵件作爲我公共用戶配置文件的數據。到目前爲止,我注意到Cognito與Facebook Auth集成,但它不允許訪問用戶信息,並且此信息不會保存在DynamoDB表中。

我的問題是,如何在Cognito接收新登錄時在DynamoDB中創建新用戶,或者當用戶已存在於db中時返回現有用戶/標識。

回答

0

幾周前我試圖達到同樣的效果。

在閱讀了幾個小時的文檔之後,我意識到Cognito可能無法幫助我們處理從FB返回的數據或如何保存它。

最後我做了以下內容:

(1)使用FB-SDK,拉用戶數據。

(2)調用將此數據(如FB_id等)保存到DynamoDB的Lambda函數。 (3)如果用戶再次登錄,則會使用其FB_id(或電子郵件)檢查DynamoDB條目以檢索其數據。

如果Cognito能夠幫助我們,我想不知何故,我很想知道。

快樂編碼!

+0

但後來你會怎麼做授權未來API請求? Cognito會返回一個您可以添加爲標題的jwt,但是我認爲很難用發電機來模擬這種行爲? –

+0

據我瞭解,如果提供的令牌是有效的,Cognito仍然會經歷與FB檢查的整個過程。如果Cognito回來並說其有效並給我一個jwt,然後我會提取用戶詳細信息並處理它在DDB中我自己。 – nishkaush

+0

你碰巧有一些我可以查看的代碼片段嗎?這對我非常有幫助。謝謝你的回覆! –

0

您可以在用戶池中使用custom attributesfederating user from Facebook來實現此目的。以下是在高級別執行此操作的步驟。

  • 您將首先必須爲要保存在每個用戶配置文件中的配置文件信息定義自定義屬性。
  • 定義attribute mapping將自定義屬性鏈接到要保存的Facebook屬性。
  • 使用Cognito hosted pages和聯合生成應用程序以允許用戶使用Facebook登錄。

在此之後,每個新用戶登錄在你的應用程序的新用戶在你的用戶羣創建與屬性映射和價值觀Cognito獲取Facebook的令牌中定義的所有屬性。您的應用將在身份驗證後頒發的IDToken中獲得這些屬性值,您的應用可以使用這些屬性值。此外,如果要將這些屬性值存儲在Cognito用戶池配置文件之外(例如您自己的DynamoDB表),則可以在池中配置將在所有新用戶創建中調用的PreSignUp trigger。您可以將此觸發器的用戶屬性導出到您選擇的任何數據庫。

希望這會有所幫助。

0

AWS AppSync允許您訪問您可以選擇存儲在DynamoDB表中的GraphQL解析器中的信息。對於來自Facebook配置文件的數據,您可以將此參數作爲參數傳遞給GraphQL突變或傳遞給AppSync,然後您可以通過$ctx.request.headers.NAME在解析器中訪問,其中NAME是您的標題名稱。然後,您可以簡單地選擇要爲該用戶寫入DynamoDB的屬性作爲突變的一部分。更多信息的參考指南在這裏:https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html

既然你還問,你想先做檢查,看用戶是否已經在DDB第一,你可以只是做一個存在性檢查第一:

{ 
    "version": "2017-02-28", 
    "operation": "PutItem", 
    "key": { 
    "userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username), 
    }, 
    "attributeValues": $util.dynamodb.toMapValuesJson($ctx.args.input), 
    "condition": { 
    "expression": "attribute_not_exists(userId)" 
    }, 
} 

這會根據Cognito用戶池中的用戶名進行檢查。如果您使用的是Cognito Federated Identities功能,它將是ctx.identity.cognitoIdentityId。如果記錄已經存在,返回的響應會告訴你哪個意味着用戶已經存在。您還可以通過使用條件語句查看$ctx.result並通過從頭開始構建JSON響應或使用上述指南中的$util.error()方法之一來在響應映射模板中轉換返回的消息。

最後,正如您所提到的,您將擁有公開的個人資料數據,您可能希望在某些記錄上標記以便進行控制。在AWS AppSync中,您可以過濾像這樣的授權元數據上的GraphQL響應。您只需在DynamoDB記錄上標記「公開」或「私有」的屬性(又名列)即可。然後你的迴應範本看起來像這樣:這這裏

#if($context.result.public == 'yes') 
    $utils.toJson($context.result) 
#else 
    $utils.unauthorized() 
#end 

你可以看到更多的例子:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html#public-and-private-records