如何纯粹使用Cognito对用户进行S3身份验证

时间:2015-10-12 15:16:32

标签: node.js amazon-web-services amazon-s3 jwt amazon-cognito

我已阅读此帖和AWS回复 How do I use a Cognito token with API? 这一个how to use AWS cognito with custom authentication to create temporary s3 upload security token

目前尚不清楚是否有更简单的解决方案来保护S3访问权限。

我有一个移动客户端和一个node.js后端。客户端使用后端进行身份验证,并接收jwt accessstoken以进一步调用我的后端。除了与我自己的后端进行通信之外,用户还应该可以上传和下载S3的文件。我正在寻找最简单的解决方案,以确保只有对我的后端有有效accessstoken的用户才能上传到S3。

我可以执行以下操作(这是基于此博文http://blog.backspace.academy/2015/03/using-cognito-with-nodejs-part-2.html):

  1. 客户端使用我的自定义node.js后端进行身份验证,并从我的后端接收自定义accessstoken
  2. 我的node.js后端获取CognitoID AWS临时用户凭据。但是,AWS文档说我们还需要一个会话令牌(大概是通过调用CognitoSync),所以我假设我的后备需要获取会话令牌。
  3. 我的node.js后端将这些临时凭证加会话令牌传递给客户端
  4. 客户端使用它们通过AWS SDK传递凭证+会话令牌来调用S3。
  5. 我错过了什么吗?有更简单的方法吗?我假设没有办法让客户端通过我自己的自定义node.js用户访问AWS / S3 / Cognito并让S3 / Cognito通过调用我自己的node.js API验证令牌,该API可以验证此令牌。

2 个答案:

答案 0 :(得分:4)

你已经得到了它。您可以从后端获取凭据并将AWS凭据提供给客户端。在使用即将到期的临时凭证时,您将需要会话密钥 - 并且您肯定使用移动应用客户端的临时凭证。

如果您想使用自己的后端对用户进行身份验证(使用后端的用户名/密码),可以使用Amazon Cognito's Developer Authenticated Identities feature。如果您的用户将使用Facebook进行身份验证,您可以按照the Facebook Integration topic中的说明将Facebook访问令牌传递给Amazon Cognito。

无论哪种方式,您在AWS文档中看到的“标准”流程都是让您让Amazon Cognito直接向移动应用程序(而不是通过您的后端)提供AWS会话凭据。使用开发人员身份验证身份时,移动应用程序会交换OpenID Connect令牌(由后端从Cognito的GetOpenIdTokenForDeveloperIdentity call检索并在响应身份验证请求时传送到移动应用程序)以调用Cognito的GetCredentialsForIdentity。使用Facebook时,您只需传入Facebook访问令牌而不是OpenID令牌。无论哪种方式,通过使用此流程,您将能够使用“标准”Cognito将AWS凭据提供给应用程序,如Getting Credentials topic中针对iOS,Android,JavaScript,Unity和Xamarin所示。

话虽如此,您确实可以代表用户从后端获取AWS凭证并将其推送到客户端,但请记住,所有AWS Mobile SDK示例都假设您正在使用Cognito如上面的Getting Credentials topic所示,因此您必须考虑到这一点。如果您想通过自己的后端查看路由凭据的示例,请参阅API Gateway Secure Pet Store示例(backend codeclient code

答案 1 :(得分:2)

我在您引用的BackSpace Academy中编写了NodeJSCordova Cognito教程。这些教程是在当时设计的,为实施Cognito提供了急需的指导。尽管如此,Cognito并不总是最合适的解决方案(KISS原则)。 我想你可能会使你的解决方案变得复杂:

  1. 您不需要Cognito从浏览器或服务器安全地访问S3。 联合用户(oauth / Facebook)可以直接从中访问S3 浏览器或通过NodeJS应用程序。
  2. 如果您不需要Cognito键值数据存储,则只需使用 浏览器端的联合用户。实际需要NodeJS服务器吗?
  3. 如果您可以从客户端执行所有操作,则不需要NodeJ 服务器
  4. 我建议您考虑使用联合用户在客户端执行所有操作。这在AWS浏览器SDK文档“在浏览器中配置Web标识联合”下详细说明。

    <强>小心!切勿在您的代码中包含您的AWS证书,包括服务器端。始终在浏览器端和服务器端使用联合用户(oauth)为您的EC2实例创建IAM角色以连接到VPC上的S3端点。出于某些愚蠢的原因,AWS S3浏览器示例硬编码凭证。