如何纯粹使用Cognito来authentication用户使用S3

我已经阅读了这篇文章和AWS回复如何在API中使用Cognito标记? 这一个如何使用AWSauthentication与自定义身份validation创build临时S3上传安全令牌

我还不清楚是否有一个简单的解决scheme来保护S3访问。

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

我可以做以下(这是基于这个博客文章http://blog.backspace.academy/2015/03/using-cognito-with-nodejs-part-2.html ):

  1. 客户端使用我的自定义node.js后端进行身份validation,并从后端接收自定义accesstoken
  2. 我的node.js后端获取CognitoID AWS临时用户凭证。 然而,AWS的文档说,我们还需要一个会话令牌(大概是通过调用CognitoSync),所以我假设我的退缩需要获得会话令牌。
  3. 我的node.js后端将这些临时凭证和会话令牌传递给客户端
  4. 客户端使用它们通过AWS SDK传递凭证+会话令牌来调用S3。

我错过了什么吗? 有一个更简单的方法来做到这一点? 我假设没有办法简单地让客户机将自己的自定义node.js用户accesstoken传递给AWS / S3 / Cognito,并让S3 / Cognito通过调用我自己的可以validation此令牌的node.js API来validation该令牌。

你几乎得到了它。 您可以从后端获取凭据并将AWS凭据交付给客户端。 使用临时凭证时,您将需要会话密钥,并且您肯定应该使用移动应用程序客户端的临时凭证。

如果您想使用自己的后端对用户进行身份validation(在后端使用用户名/密码),则可以使用Amazon Cognito的“开发者身份validation身份”function 。 如果您的用户将使用Facebook进行身份validation,则可以将Facebook访问令牌传递给Amazon Cognito,如Facebook集成主题中所述 。

无论哪种方式,您在AWS文档中看到的“标准”stream程都是让Amazon Cognito直接将AWS会话凭据传递给移动应用程序(而不是通过后端)。 使用开发者身份validation标识时,移动应用程序会交换OpenID Connect令牌(通过您的后端从Cognito的GetOpenIdTokenForDeveloperIdentity调用中检索,并在响应身份validation请求时交付给移动应用程序)以调用Cognito的GetCredentialsForIdentity 。 在使用Facebook时,您只需传入Facebook访问令牌而不是OpenID令牌。 无论哪种方式,通过使用此stream程,您可以使用“标准”Cognito获取AWS凭证,如获取证书主题中 iOS,Android,JavaScript,Unity和Xamarin所示。

如此一来,您确实可以代表用户从您的后端获取AWS Credentials,并将其推送到客户端,但请记住,所有AWS Mobile SDK示例都将假定您正在使用Cognito,如上面的获取凭证主题 ,所以你必须考虑到这一点。 如果您想查看通过自己的后端路由凭证的示例,请参阅API网关安全宠物商店示例( 后端代码 , 客户端代码 )

我从BackSpace Academy中引用了NodeJS和Cordova Cognito教程。 这些教程是当时devise的,为实施Cognito提供了很多必要的指导。 尽pipe如此,Cognit并不总是最合适的解决scheme(KISS原则)。 我想你可能会过度复杂化你的解决scheme:

  1. 您不需要Cognito从浏览器或服务器安全地访问S3。 联邦用户(oauth / Facebook)可以直接从浏览器或通过您的NodeJS应用程序访问S3。
  2. 如果您不需要Cognito键值数据存储,那么只需在浏览器端使用联合用户。 实际上是否需要NodeJS服务器?
  3. 如果您可以从客户端执行所有操作,则不需要NodeJs服务器。

我build议你考虑在联邦用户的客户端做所有事情。 这在“浏览器中configurationWeb联合身份validation”下的AWS浏览器SDK文档中有详细介绍。

警告! 切勿将AWS证书放在代码中,包括服务器端。 始终在浏览器端和服务器端使用联合用户(oauth)为您的EC2实例创build一个IAMangular色,以连接到VPC上的S3端点。 对于一些愚蠢的原因,AWS S3浏览器示例硬编码凭据。