我正在尝试使用传输管理器从特定于用户的文件夹将文件从 AWS S3 下载到我的 iOS 移动应用程序,如下所示:
@IBAction func download() {
let transferManager = AWSS3TransferManager.default()!
let downloadingFileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("disney1.jpg")
let downloadRequest = AWSS3TransferManagerDownloadRequest()!
downloadRequest.bucket = "sidestreamx"
// user's UUID/disney1
downloadRequest.key = "631d121f-b294-4318-b3cd-36b3b74ebdff/disney1"
downloadRequest.downloadingFileURL = downloadingFileURL
transferManager.download(downloadRequest).continue(with: AWSExecutor.mainThread(), with: {
(task: AWSTask<AnyObject>) -> Any? in
if let error = task.error as? NSError {
// handle error
return nil
}
self.imageView.image = UIImage(contentsOfFile: downloadingFileURL.path)
return nil
})
}
我的 IAM 角色权限策略如下,来自 this AWS doc :
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetBucketListIfRequestIsForUser",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::sidestreamx"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"${cognito-identity.amazonaws.com:sub}/*"
]
}
}
},
{
"Sid": "S3GetObjects",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::sidestreamx/${cognito-identity.amazonaws.com:sub}/*"
]
}
]
}
我得到的响应是
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>E1F205B58EF4A670</RequestId>
<HostId>dUWI8PfVZL3mJmykjhXRqvFd1yt/CqDFNlwgwD3kmLk2vrMBP6JvVgezMYSROt3KyE3dx0+3eDE=</HostId>
</Error>
用户通过 AWS Cognito 用户池和 Cognito 联合身份进行身份验证。我调试并提取了 JWT token ,发现 sub = "631d121f-b294-4318-b3cd-36b3b74ebdff"。我什至用过 Charles查看请求/响应。
如果我将最后一条语句 S3GetObjects 中的 ${cognito-identity.amazonaws.com:sub} 替换为 ,它会工作>631d121f-b294-4318-b3cd-36b3b74ebdff 获取 arn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/*。第一条语句可以继续使用策略变量并且它仍然有效。如果我完全删除第一个语句,它将起作用!当我将策略变量添加到它开始崩溃的最后一个语句时。
我已经检查过这个 Stack Overflow问题和this one ,无济于事。所以是的,我不知道。我已经为此工作了将近 9 个多小时,因此我们将不胜感激任何帮助。
最佳答案
问题解决了。事实证明,${cognito-identity.amazonaws.com:sub} 并没有真正引用 JWT token 中的 sub。它指的是来自 credentialsProvider 的 IdentityID:
(AWSServiceManager.default().defaultServiceConfiguration.credentialsProvider
as! AWSCognitoCredentialsProvider).getIdentityId()
.continue({task -> Any? in
print("Credentials ID is \(task.result!)")
return nil
})
我在我的存储桶中手动创建了一个名为 task.result! 的文件夹(格式为 us-east-1:XXXXXXXXXXXXXXXXXX 供引用) ,它奏效了。
关于swift - AWS S3 传输管理器 ${cognito-identity.amazonaws.com :sub} Policy Variable Access Denied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42605419/
我正在构建一个部署在heroku上的rails5应用程序。我想用AWScongnito来实现单点登录,但是没有足够的例子来实现。我正在使用devise进行身份验证。现在我的目标是让我的所有用户都使用AWScognito并通过我的Rails应用程序对他们进行身份验证。这是我在AWScongnitowithrails上找到的唯一资源,我正在寻找一些示例应用程序或指向工具或rubyAPI文档的链接来实现此目的。请帮助。UpdateOnbasisOfBalaAnswerrequire'aws-sdk'ENV['AWS_ACCESS_KEY_ID']='XXXXXXXXXXXXXXXXX'E
我正在使用rvm1.16.10(稳定版)在我执行rvminstall1.9.3--with-gcc=clang之后安装1.9.3后显示:'rvm_codesign_identity'未设置,请在~/.rvmrc中设置但是..什么是“rvm_codesign_identity”以及如何设置它?提前致谢。 最佳答案 https://github.com/wayneeseguin/rvm/issues/820https://github.com/wayneeseguin/rvm/issues/1210#issuecomment-92722
我已经尝试了下面的代码,它工作正常。但是我需要将这些注册详细信息存储在用户池中(另外我还想添加一些自定义属性)。但是我没有找到合适的方法来做到这一点。functionsigninCallback(authResult){ AWS.config.region='us-XXXXXXX-1';//AddtheGoogleaccesstokentotheCognitocredentialsloginmap.AWS.config.credentials=newAWS.CognitoIdentityCredentials({IdentityPoolId:'us-XXXX-1:XXXXXXXXX
我收到以下错误:TypeError:__WEBPACK_IMPORTED_MODULE_0_aws_sdk_global__.util.crypto.lib.randomBytesisnotafunction当我尝试使用我编写的以下代码对用户进行身份验证时:import{CognitoUserPool,CognitoUserAttribute,CognitoUser,AuthenticationDetails}from'amazon-cognito-identity-js';letauthenticationDetails=newAuthenticationDetails({Usern
我们希望利用AWSCognito通过如下所示的架构进行身份验证:客户端(浏览器)->我们的服务器->AWSCognito设置了各种配置后,initiateAuth似乎与AdminInitiateAuth没有什么不同,所以我想了解在这些配置下,是否选择一个配置是否重要.似乎当我创建一个带有clientsecret的应用程序并使用initiateAuth时,它似乎与adminInitiateAuth几乎相同的集成体验>使用ADMIN_NO_SRP_AUTH身份验证流程。后者甚至不需要AWS文档中所述的AWS凭证。我与Cognito的集成如下:initiateAuth:constpayloa
我正在尝试通过chromeidentityapi获取用户的电子邮件和ID。我在做这个chrome.identity.getProfileUserInfo(function(userinfo){console.log("userinfo",userinfo);email=userinfo.email;uniqueId=userinfo.id;});我已指定identity权限并在范围内添加了https://www.googleapis.com/auth/userinfo.email。用户通过chrome.identity.getAuthToken登录,我有访问token。console.
我正在尝试使用AWS的JavaScriptSDK从Web浏览器将文件上传到我的S3存储桶。我的代码如下所示:AWS.config.credentials=newAWS.CognitoIdentityCredentials({AccountId:'dfhgdh',IdentityPoolId:'fdagsd',RoleArn:'fdafds'});varbucket=newAWS.S3({params:{Bucket:'test-bucket'}});varpdfUpload=document.getElementById('pdf-uploads').files[0];varparam
我使用AmazonCognito通过JavascriptSDK为网站进行用户登录,该SDK使用本地存储来保存用于自动登录等操作的用户凭据。从计算机上的本地文件运行时,这不起作用。在本地运行网站时,是否可以指示JavascriptSDK通过其他方式而不是本地存储来保存用户凭据?我看过更改存储对象的引用资料,但我找不到任何关于如何实际实现自定义存储解决方案的示例。https://github.com/aws/amazon-cognito-identity-js/pull/363 最佳答案 回答你的确切问题如pullrequestyoul
我在打包的应用程序中使用chrome.identity来获取使用Facebook的用户token。我调用chrome.identity.launchWebAuthFlow,我需要获取访问token,将其发送到服务器,然后使用访问token来验证用户。与Google+配合得很好。但出于某种原因,它不适用于Facebook。出于某种原因,Facebook的OAuth似乎很特别。我已将extensionid.chromiumapp.org添加到API中的重定向URL列表中。添加了"https://extensionid.chromiumapp.org/*","https://facebook
是否可以撤销使用username和password进行用户身份验证后获得的AWSCognitoIdToken?在我的用例中,对APIGateway端点的访问受到CognitoUserPoolAuthorizer的限制,它将IdToken作为中的参数请求.headers.Authorizer。我正在寻找阻止当前用户的IdToken的方法。在AWSJavaScriptSDK中有一个函数globalSignOut({AccessToken})可以撤销accessToken:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Cogni