amazon-web-services - 我想创建一个只能由使用 Cognito 创建的用户在登录时访问的 S3 存储桶
问题描述
我希望通过以下方式访问:
const cognitoUser = userPool.getCurrentUser();
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,
Logins: {
'cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx': result.getIdToken().getJwtToken()
}
});
// このようにアクセスしたい。
window.location.href = "https://nabezokodaikon-private.s3.amazonaws.com/private/index.html";
我创建了以下 S3 存储桶策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::nabezokodaikon-private/*"
},
{
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:user/nabezokodaikon"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::nabezokodaikon-private/index.html"
}
]
}
但这无法访问。我怎样才能做我想做的事?
解决方案
当您的代码从 Cognito 获取凭证时,此行没有提供任何信息来标识请求来自 Cognito 凭证:
window.location.href = "https://nabezokodaikon-private.s3.amazonaws.com/private/index.html";
该 URL 只是一个普通的匿名请求,应该被拒绝(按原样)。
要访问私有内容,您需要创建一个预签名 URL ,该 URL使用 Cognito 提供的凭据对请求进行“签名”。预签名 URL 提供对 Amazon S3 中私有内容的限时访问。
您还需要删除该Deny
语句,因为它会阻止任何不是来自所述用户的访问。默认情况下,Amazon S3 存储桶是私有的,因此Deny
只能在Allow
需要覆盖的情况下使用。
推荐阅读
- couchbase - 将索引和用户从 Couchbase 5.1 移动到 Couchbase 6.0
- symfony - 用于电子邮件的 DomCrawler filterXpath
- javascript - 在浏览器上按下后退按钮时忽略查询参数
- asp.net-core - 将包 System.Data.SqlClient 从 4.6.1 更新到 4.8.0 填满连接池
- c# - Branch.io + Unity:如何设置 Apple Search Ads?
- graph - 使用chartjs的多条形图中每个条形的子类别
- ios - 安装谷歌地图库时出错
- arrays - 3SUM,但允许重复
- angular - Ionic 4+ Angular:离子搜索栏和工具栏中的搜索图标与 onfocus-event 未对齐
- conv-neural-network - Resnets 中的深度残差网络