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 下载操作设置自定义超时?

在iOS Swift中不使用AWS SDK在Amazon S3存储桶中上传的背景图像(背景模式)

带有中间模型的 ActiveStorage 多次上传

带有多个文件上传控件的asp.net多次上传

django上传图片并且带有预览功能

带有裁剪参数的拇指上传