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