1

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

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

起初我尝试自己显式获取图像,这使我可以直接放置 S3 凭据,但这似乎并不实用。

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

4

3 回答 3

4

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

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

于 2017-10-23T12:56:13.387 回答
2

感谢@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,并将其放入我的组件中。

于 2017-10-23T13:21:14.233 回答
0

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

在 Authenticated 和 UnAuthenticated 状态下,有一个Auth用于获取用户凭据和建立身份的组件,以及一个Storage具有公共和私有访问配置文件的组件。

通过 npm 安装:

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

如果使用 Cognito 用户池,则需要链接项目:

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');
于 2017-11-19T19:34:02.080 回答