Amazon S3 仅向本机应用程序用户提供文件服务

Amazon S3 serving file only to app user in react-native

我正在用 react-native / nodejs 构建一个社交网络,并使用 S3 amazon 服务来处理用户的个人照片(上传、服务)

但我似乎无法理解如何提供这些图像,我的问题是如何将这些上传的图像仅提供给应用程序用户而不是全世界?

起初我尝试自己显式获取图像,这允许我直接放入 S3 凭据,但它似乎不实用。

有没有办法让授权从我的存储桶中获取的应用发出的每个 GET 调用?

您需要的是 S3 签名 URL http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html

不是获取图像,而是为该图像创建唯一的签名 URL(具有自定义到期时间,比如 1 周)并将其传递给您的应用程序。这样您就可以关闭您的 S3 存储桶,但您的应用程序将能够使用这些私有链接获取图像。

感谢@sergey,我用 'getSignedUrl' 方法满足了我的需求。

这是对我有用的代码:

import AWS from 'aws-sdk/dist/aws-sdk-react-native';
const credentials = new AWS.Crendentials({ accessKeyId: '', secretAccessKey: ''})
const s3 = new AWS.S3({ credentials, signatureVersion: 'v4', region: ''});
// and there it is.
const url = s3.getSignedUrl('getObject', { Bucket: 'your bucket name', Key: 'the filename'}).

现在,每次我循环遍历一个包含对我照片的多个引用的数组时,在每个循环中,我都会为一个项目创建一个我放入组件中的预签名 url。

您可以使用新的 AWS Amplify 库来完成此操作:https://github.com/aws/aws-amplify

有一个 Auth 用于获取用户凭据和建立身份,无论是在 Authenticated 还是 UnAuthenticated 状态,还有一个 Storage 组件具有 public 和私有访问配置文件.

通过 npm 安装:

npm install --save aws-amplify-react-native

如果使用 Cognito 用户池,您将需要 link 项目:

react-native link amazon-cognito-identity-js

更多信息在这里:https://github.com/aws/aws-amplify/blob/master/media/quick_start.md#react-native-development

然后拉入模块:

import Amplify, {Auth, Storage} from 'aws-amplify-react-native'
Amplify.configure('your_config_file');
Storage.configure({level: 'private'});
Storage.get('myfile');