在DynamoDB中保存AWS Cognito用户

时间:2017-12-18 12:17:02

标签: amazon-web-services amazon-dynamodb amazon-cognito amazon-cognito-facebook aws-appsync

我最近开始尝试使用AWS AppSync,但我对AWS Cognito有一些疑问。

我希望用户能够通过Facebook进行身份验证,但我需要他们的个人资料图片,姓名和电子邮件作为我的应用中公共用户个人资料的数据。到目前为止,我注意到Cognito与Facebook Auth集成,但它不允许访问用户信息,并且此信息不会保存在DynamoDB表中。

我的问题是,当Cognito收到新登录时,如何在DynamoDB中创建新用户,或者当用户已存在于数据库中时,如何返回现有用户/ ID。

3 个答案:

答案 0 :(得分:1)

您可以在用户池中使用custom attributesfederating user from Facebook来实现此目的。以下是高级别的步骤。

  • 您首先必须为要在每个用户配置文件中保存的配置文件信息定义自定义属性。
  • 定义attribute mapping以将自定义属性链接到您要保存的Facebook属性。
  • 使用Cognito hosted pages和联盟构建您的应用程序,以允许您的用户使用Facebook登录。

在此之后,在每个新用户登录您的应用程序时,将在您的用户池中创建一个新用户,其中包含在属性映射中定义的所有属性以及Cognito在Facebook令牌中获取的值。您的应用将在身份验证后发出的IDToken中获取这些属性值,您的应用可以使用这些属性值。

此外,如果要将这些属性值存储在Cognito用户池配置文件之外,例如您自己的DynamoDB表,则可以在池中配置PreSignUp trigger,这将在所有新用户创建中调用。您可以将此触发器中的用户属性导出到您选择的任何数据库。

希望这有帮助。

答案 1 :(得分:1)

AWS AppSync允许您访问GraphQL解析程序中的信息,您可以选择将其存储在DynamoDB表中。对于来自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

答案 2 :(得分:0)

几周前我试图达到同样的目标。

在阅读了几个小时的文档后,我意识到Cognito可能无法帮助我们处理从FB返回的数据或如何保存它。

我最终做了以下事情:

(1)使用FB-SDK,提取用户数据。

(2)调用Lambda函数将此数据(如FB_id等)保存到DynamoDB。

(3)如果用户再次登录,则使用FB_id(或电子邮件)检查DynamoDB条目以检索其数据。

如果Cognito能够帮助我们,我会以某种方式错过它,我很想知道。

快乐的编码!