我已阅读此帖和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):
我错过了什么吗?有更简单的方法吗?我假设没有办法让客户端通过我自己的自定义node.js用户访问AWS / S3 / Cognito并让S3 / Cognito通过调用我自己的node.js API验证令牌,该API可以验证此令牌。
答案 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 code,client code)
答案 1 :(得分:2)
我在您引用的BackSpace Academy中编写了NodeJS和Cordova Cognito教程。这些教程是在当时设计的,为实施Cognito提供了急需的指导。尽管如此,Cognito并不总是最合适的解决方案(KISS原则)。 我想你可能会使你的解决方案变得复杂:
我建议您考虑使用联合用户在客户端执行所有操作。这在AWS浏览器SDK文档“在浏览器中配置Web标识联合”下详细说明。
<强>小心!切勿在您的代码中包含您的AWS证书,包括服务器端。始终在浏览器端和服务器端使用联合用户(oauth)为您的EC2实例创建IAM角色以连接到VPC上的S3端点。出于某些愚蠢的原因,AWS S3浏览器示例硬编码凭证。