草庐IT

swift - AWS S3 传输管理器 ${cognito-identity.amazonaws.com :sub} Policy Variable Access Denied

coder 2023-09-08 原文

我正在尝试使用传输管理器从特定于用户的文件夹将文件从 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/

有关swift - AWS S3 传输管理器 ${cognito-identity.amazonaws.com :sub} Policy Variable Access Denied的更多相关文章

  1. ruby-on-rails - Ruby on rails + aws cognito 示例 - 2

    我正在构建一个部署在heroku上的rails5应用程序。我想用AWScongnito来实现单点登录,但是没有足够的例子来实现。我正在使用devise进行身份验证。现在我的目标是让我的所有用户都使用AWScognito并通过我的Rails应用程序对他们进行身份验证。这是我在AWScongnitowithrails上找到的唯一资源,我正在寻找一些示例应用程序或指向工具或ruby​​API文档的链接来实现此目的。请帮助。UpdateOnbasisOfBalaAnswerrequire'aws-sdk'ENV['AWS_ACCESS_KEY_ID']='XXXXXXXXXXXXXXXXX'E

  2. ruby - 什么是 'rvm_codesign_identity' 以及如何设置它? - 2

    我正在使用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

  3. javascript - AWS Cognito + 谷歌注册 - 2

    我已经尝试了下面的代码,它工作正常。但是我需要将这些注册详细信息存储在用户池中(另外我还想添加一些自定义属性)。但是我没有找到合适的方法来做到这一点。functionsigninCallback(authResult){ AWS.config.region='us-XXXXXXX-1';//AddtheGoogleaccesstokentotheCognitocredentialsloginmap.AWS.config.credentials=newAWS.CognitoIdentityCredentials({IdentityPoolId:'us-XXXX-1:XXXXXXXXX

  4. javascript - 实用程序.crypto.lib。 randomBytes 不是函数 : aws cognito js throws error on authentication - 2

    我收到以下错误: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

  5. javascript - AWS Cognito - AdminInitiateAuth 与 InitiateAuth - 2

    我们希望利用AWSCognito通过如下所示的架构进行身份验证:客户端(浏览器)->我们的服务器->AWSCognito设置了各种配置后,initiateAuth似乎与AdminInitiateAuth没有什么不同,所以我想了解在这些配置下,是否选择一个配置是否重要.似乎当我创建一个带有clientsecret的应用程序并使用initiateAuth时,它似乎与adminInitiateAuth几乎相同的集成体验>使用ADMIN_NO_SRP_AUTH身份验证流程。后者甚至不需要AWS文档中所述的AWS凭证。我与Cognito的集成如下:initiateAuth:constpayloa

  6. javascript - Chrome 扩展程序 identity.email 为空 - 2

    我正在尝试通过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.

  7. javascript - 在浏览器 (javascript) 中将 Cognito 凭据与 AWS 结合使用时,不断出现 "missing credentials"错误 - 2

    我正在尝试使用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

  8. javascript - 在没有本地存储的情况下保存 Amazon Cognito 用户凭证 - 2

    我使用AmazonCognito通过JavascriptSDK为网站进行用户登录,该SDK使用本地存储来保存用于自动登录等操作的用户凭据。从计算机上的本地文件运行时,这不起作用。在本地运行网站时,是否可以指示JavascriptSDK通过其他方式而不是本地存储来保存用户凭据?我看过更改存储对象的引用资料,但我找不到任何关于如何实际实现自定义存储解决方案的示例。https://github.com/aws/amazon-cognito-identity-js/pull/363 最佳答案 回答你的确切问题如pullrequestyoul

  9. javascript - 如何使用带有 chrome.identity 的 Oauth2 获取 Facebook token - 2

    我在打包的应用程序中使用chrome.identity来获取使用Facebook的用户token。我调用chrome.identity.launchWebAuthFlow,我需要获取访问token,将其发送到服务器,然后使用访问token来验证用户。与Google+配合得很好。但出于某种原因,它不适用于Facebook。出于某种原因,Facebook的OAuth似乎很特别。我已将extensionid.chromiumapp.org添加到API中的重定向URL列表中。添加了"https://extensionid.chromiumapp.org/*","https://facebook

  10. javascript - 是否可以撤销 AWS Cognito IdToken? - 2

    是否可以撤销使用username和password进行用户身份验证后获得的AWSCognitoIdToken?在我的用例中,对APIGateway端点的访问受到CognitoUserPoolAuthorizer的限制,它将IdToken作为中的参数请求.headers.Authorizer。我正在寻找阻止当前用户的IdToken的方法。在AWSJavaScriptSDK中有一个函数globalSignOut({AccessToken})可以撤销accessToken:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Cogni

随机推荐