AWS Cognito、Lambda、DynamoDB 中的用户凭证

AWS Cognito, Lambda, User credentials in DynamoDB

我在客户端站点上使用 Facebook 登录和 AWS Cognito 建立了身份验证流程。工作正常。但是现在我需要在 dynambodb table 中引用用户及其 facebook id。当然,我可以只调用通过 AWS API 网关公开的 AWS lambda 函数,但我如何才能验证 API 调用实际上具有有效的 facebook id 以及该 facebook id 是否与 AWS Cognito Id 匹配。也许我在这里遗漏了一些东西,我希望你们能给我指明正确的方向;)谢谢!

如果您可以通过 cognito id 而不是 facebook id 键入您的 ddb table,则可以使用 cognito 凭据调用 api 网关。如果您在调用 lambda 时使用被调用方凭据,则可以通过令牌 $context.identity.cognitoIdentityId 访问 cognito id。这确保调用是由该 ID 的所有者进行的。您可以进一步检查 $context.identity.cognitoAuthenticationProvider 是否为 graph.facebook.com 以确保它们是通过 Facebook 授权的。不幸的是,facebook id 没有在凭据中传递,因此如果您需要它,您将需要查找 table 将 cognito id 映射到 facebook id。有关可用令牌的更多详细信息,请参阅 here.

我建议执行以下操作(我也是 AWS 的新手,如果您有任何建议,请告诉我):

  1. 创建一个 API 网关 /fblogin 端点,您将在其中 POST Facebook 访问令牌(您将在客户端通过 Facebook 进行身份验证以获取此令牌)。该端点链接到 Lambda 函数,例如 fb_login.
  2. fb_login 函数中,您将使用 Amazon Cognito 进行身份验证以获取其凭据。您应该已经在 Cognito 中创建了一个联合身份用户池,并为该用户池分配了适当的角色。如果您想将 API 限制为仅供经过身份验证和授权的人使用,这会有所帮助。因此,Cognito 的结果将有 IdentityIdCredentials。您可以 return 他们作为您对 /fblogin.
  3. 的请求的结果
  4. 使用上述结果,您可以在 API 网关 (Or you can use AWS custom generated SDK for your API to handle the signing) 上签署您发送到 API 的请求。在 API 网关端点上,启用 CORS 和身份验证 AWS_IAM。这样,API 网关通过检查请求中的签名自动验证用户。您可以按照其他人的建议从 $context.identity.cognitoIdentityId 获取用户 ID。这样,您可以确保用户已获得授权和身份验证。

注意:确保在 HTTPS 上实现 /fblogin 端点,然后 FB 访问令牌将是安全的。如果不是,它将在 HTTP 上显示为纯文本。

此外,使用 Dynamo 数据库 table 作为 CognitoID - FacebookID 的日志。您可以将其合并到步骤 2 Lambda 函数中,ifself 或您认为合适的任何内容。