0

我有一个通过 Cognito 进行身份验证的应用程序,并且运行良好。现在我需要重用身份验证和返回的令牌来将文件上传到 S3。我的理解是 AWSS3TransferUtility 是目前要走的路。只是不清楚需要做什么以及如何将令牌传递给 S3?谁能举个例子?仅使用可用的示例建议这样做:

let credentialsProvider = 
CredentialsProvider(regionType:region, identityPoolId:poolId)
let serviceS3Configuration = AWSServiceConfiguration(region:region, credentialsProvider: credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = serviceS3Configuration

假设这是因为未使用令牌且未正确初始化 S3 AWS 服务,则会导致“此身份池不支持未经身份验证的访问”。但是我没有看到设置的方法吗?我错过了什么?我可以看到一些示例,建议将 credentialsProvider 的 logins 属性设置为 AWSCognitoLoginProviderKey,但此时似乎已过时。任何和所有的帮助将不胜感激。

4

1 回答 1

0

带有 Cognito 的 S3 配置有点神秘。答案在文档中,但并不完全明显。让它工作的核心是AWSMobileClient使用配置注册您的实例。

没有错误检查的简化代码:

启动你的AWSMobileClient

AWSMobileClient.sharedInstance().initialize({ { userstate, error in
    if userstate != nil {
        registerAuthentication(credentialsProvider: AWSMobileClient.sharedInstance())
    }
})

一旦完成传递到sharedInstanceAWSServiceConfiguration因为AWSMobileClientis-aAWSCredentialsProvider

let DefaultTransferUtilityKey = "DEFAULT_AUTH_KEY"
func registerAuthentication(credentialsProvider: AWSCredentialsProvider) {
    /// only do this once per app launch 

    /// assumes you're using the plist config method
    guard let s3tranferInfo = AWSInfo.default().defaultServiceInfo("S3TransferUtility"),
        let bucketName = s3tranferInfo.infoDictionary["Bucket"] as? String else {
            assertionFailure("failed to load /S3TransferUtility/Bucket key  - is awsconfiguration.json correct ?")
            return
    }

    let transferConfig = AWSS3TransferUtilityConfiguration()
    transferConfig.bucket = bucketName
    if let serviceconfiguration = AWSServiceConfiguration(region: s3tranferInfo.region, credentialsProvider: credentialsProvider) {
        AWSS3TransferUtility.register(with: serviceconfiguration, transferUtilityConfiguration: transferConfig, forKey: DefaultTransferUtilityKey)
    }
}

一旦注册实际完成,您就可以通过公共密钥字符串访问传输实用程序。

lazy var transferUtility: AWSS3TransferUtility = {
    let utility = AWSS3TransferUtility.s3TransferUtility(forKey: DefaultTransferUtilityKey)
    return utility
}()

存储桶名称和区域也可以是字符串,但如果您正在使用AWSMobileClient,您可能已经设置了 plist。

于 2020-03-15T19:00:15.947 回答