我如何纯粹使用 Cognito 来验证用户以使用 S3

How do I use Cognito purely to authenticate users for S3 use

我已阅读此 post 和 AWS 回复 How do I use a Cognito token with API? 还有这个

我还不清楚是否有更简单的解决方案来保护 S3 访问。

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

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

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

我错过了什么吗?有更简单的方法吗?我假设没有办法简单地让客户端将我自己的自定义 node.js 用户访问令牌传递给 AWS/S3/Cognito 并让 S3/Cognito 通过调用我自己的 node.js [=41] 来验证令牌=] 可以验证此令牌。

你已经差不多明白了。您可以从后端获取凭证并将 AWS 凭证提供给客户端。使用将过期的临时凭据时,您将需要会话密钥 - 您绝对应该对移动应用程序客户端使用临时凭据。

如果您想使用自己的后端验证用户身份(使用 username/password 与您的后端),您可以使用 Amazon Cognito's Developer Authenticated Identities feature. If your users will be authenticating with Facebook, you can just pass the Facebook access token to Amazon Cognito as described in the Facebook Integration topic.

无论哪种方式,您将在 AWS 文档中看到的 "standard" 流程是您让 Amazon Cognito 将 AWS 会话凭证直接传送到移动应用程序(而不是通过您的后端)。使用开发人员身份验证时,移动应用程序会交换 OpenID Connect 令牌(从 Cognito 的 GetOpenIdTokenForDeveloperIdentity call by your backend and delivered to the mobile app in the response to the authentication request) to call Cognito's GetCredentialsForIdentity. When using Facebook, you can just pass in the Facebook access token instead of the OpenID Token. Either way, by using this flow, you'll be able to use the "standard" Cognito to get AWS credentials to the app as shown for iOS, Android, JavaScript, Unity, and Xamarin in the Getting Credentials topic.

中检索)

话虽如此,您确实可以代表用户从您的后端获取 AWS 凭证并将它们向下推送到客户端,但请记住,所有 AWS Mobile SDK 示例都假设您是使用 Cognito,如 Getting Credentials topic above, so you'll have to take that into account. If you want to see an example of routing credentials through your own backend, see the API Gateway Secure Pet Store sample (backend code, client code)

中所示

我写了您引用的 BackSpace Academy 的 NodeJS and Cordova Cognito 教程。这些教程当时旨在为实施 Cognito 提供急需的指导。尽管如此,Cognito 并不总是最合适的解决方案(KISS 原则)。 我认为您的解决方案可能过于复杂:

  1. 您不需要 Cognito 即可从浏览器或服务器安全访问 S3。 联合用户 (oauth/Facebook) 可以直接从 浏览器或通过您的 NodeJS 应用程序。
  2. 如果您不需要 Cognito 键值数据存储,那么只需使用 浏览器端的联合用户。真的需要 NodeJS 服务器吗?
  3. 如果您可以从客户端完成所有操作,那么您就不需要 NodeJs 服务器。

我建议您考虑使用联合用户在客户端完成所有操作。 "Configuring Web Identity Federation in the Browser".

下的 AWS 浏览器 SDK 文档对此进行了详细说明

注意!切勿将您的 AWS 凭据放入您的代码中,包括服务器端。 始终在浏览器端和服务器端使用联合用户 (oauth),为您的 EC2 实例创建 IAM 角色以连接到您的 S3 端点专有网络。出于某些愚蠢的原因,AWS S3 浏览器示例硬编码凭证。