AWSS3TransferUtility上传Cognito身份验证配置问题



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

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

导致"此身份池不支持未经身份验证的访问",假设这是因为未使用令牌,并且S3 AWS服务未正确初始化。但我看不出有办法设置它吗?我错过了什么?我可以看到一些示例,建议将credentialsProviders的logins属性设置为AWSCognitoLoginProviderKey,但在这一点上似乎已经过时。如有任何帮助,我们将不胜感激。

使用Cognito的S3配置有点神秘。答案在文件中,但并不完全显而易见。实现这一点的核心是使用配置注册AWSMobileClient实例。

无需错误检查的简化代码:

启动您的AWSMobileClient:

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

一旦完成,将sharedInstance传递给AWSServiceConfiguration,因为AWSMobileClientAWSCredentialsProvider

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)
}
}

一旦注册真正完成,您就可以通过公共密钥串访问transfer实用程序。

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

Bucket名称和区域也可以是字符串,但如果使用AWSMobileClient,则可能有plist设置。

最新更新