AWSS3TransferUtility 上传带有 Cognito 身份验证配置问题?
Posted
技术标签:
【中文标题】AWSS3TransferUtility 上传带有 Cognito 身份验证配置问题?【英文标题】:AWSS3TransferUtility uploading with Cognito authentication configuration issues? 【发布时间】:2020-06-26 23:26:22 【问题描述】:我有一个通过 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 但此时似乎已过时。 任何和所有的帮助将不胜感激。
【问题讨论】:
完整的例子可以在这里找到:https://aws-amplify.github.io/docs/sdk/ios/storage 使用 AWSMobileClient 是否已经过时,并且不适用于 AWSCognito 您可以手动添加 TransferUtility(说明在上面的链接中)或切换到 AWSMobileClient(只需按照身份验证和存储的说明进行操作)。它并没有过时,并且与 Cognito 配合得很好。你可能会想到他们的 MobileHub,它已经过时了。 看来我可能误解了 AWSMobileClient 和 AWSCognito 之间的冲突,试图删除 AWSCognito 并使用 AWSMobileClient 看看是否可行。虽然在 cognito 登录后我仍然看不到令牌的令牌设置 没有完全返工我不确定是否有简单的切换方法。有没有办法使用 AWSCognito 并通过 AWSS3 返回会话令牌? 【参考方案1】:使用 Cognito 的 S3 配置有点神秘。答案在文档中,但并不完全明显。让它工作的核心是使用配置注册你的 AWSMobileClient
实例。
没有错误检查的简化代码:
启动你的AWSMobileClient
:
AWSMobileClient.sharedInstance().initialize( userstate, error in
if userstate != nil
registerAuthentication(credentialsProvider: AWSMobileClient.sharedInstance())
)
一旦完成,将sharedInstance
传递给AWSServiceConfiguration
,因为AWSMobileClient
is-a AWSCredentialsProvider
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。
【讨论】:
如上所述,我的理解是 AWSCognito 不适用于 AWSMobileClient,还是我错了?添加 AWSMobileClient 会导致构建问题 好吧,我错了。我假设您使用的是 AWSMobileClient。在我第一次尝试 S3 上传时,我确实尝试使用独立的 AWSCognito,就像您为 auth 工作一样,但放弃并更改为 AWSMobileClient 顺便说一句,对答案投反对票的不是我。不过,我很感谢你的回应。我正在使用自定义 UI 登录 AWSMobileClient 是否允许这样做?我没有看到它,或者我看起来不够努力。我现在真的不想更改身份验证,但听起来我没有太多选择? 周末 SO 总是有点脾气暴躁。您可以使用 AWSMC 轻松实现自定义 UI。有非常简单的登录 API,您可以将现有的 UI 插入其中。如果您需要 JWT 令牌用于其他用途,该令牌仍然可用。 这是最适合我的文档集 aws-amplify.github.io/docs/ios/authentication 。您不需要自定义 ui 的所有 pod以上是关于AWSS3TransferUtility 上传带有 Cognito 身份验证配置问题?的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Amazon iOS SDK 的 swift iOS 应用程序中,如何为 AWSS3TransferUtility 下载操作设置自定义超时?