我正在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
(处于"已身份验证"和"未经身份验证"状态),以及具有公共和专用访问配置文件的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');