如何使用带有访问密钥的multipartFormData使用alamofire 4.8将文件上传到S3?

Vic*_*ral 10 amazon-s3 pre-signed-url alamofire

我试图使用alamofire直接上传到s3(我的应用程序必须在苹果手表上运行,而aws-ios-sdk在Apple手表上不起作用).我知道我必须在网址上签名,但我不知道如何直接形成网址请求.但是,我目前的做法似乎没有那种做法.我发现了几个类似的问题,似乎没有解决上传与alamofire直接到s3,端到端,包括签署一个带访问密钥和秘密的URL.

码

class UploadUtil 
    public func upload(file: URL, key: String, success: @escaping ()->()) {
        let access_key = "AKIA123453435242"
        let secret = "abcdefghijklmnopqrstuvwxyz"
        Alamofire.upload(
            multipartFormData: { multipartFormData in
                multipartFormData.append(unicornImageURL, withName: "unicorn")
                multipartFormData.append(rainbowImageURL, withName: "rainbow")
            },
            to: "https://mybucket.s3.amazonaws.com",
            encodingCompletion: { encodingResult in
                switch encodingResult {
                    case .success(let upload, _, _):
                        upload.responseJSON { response in
                            debugPrint(response)
                        }
                    case .failure(let encodingError):
                        print(encodingError)
                }
            }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 3

您需要使用您的 AWS 凭证来签署请求。有关签名方案的详细信息如下:https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

也就是说,您可能不希望将 AWS 凭证嵌入到您的手表应用程序中。如果不推出应用程序更新,他们将很难轮换/管理。

您的用户是否登录了您控制的任何类型的 Web 服务?如果是这样,您可以让他们将 blob 上传到该位置(使用经过身份验证的 POST),然后将数据铲入 S3。或者,您可以让您的 Web 服务向用户提供预签名的 URL,供他们用来上传数据。或者,您可以使用 API Gateway 等方式让手表应用程序对服务进行身份验证,然后让 lambda 处理程序将数据放入 S3。

如果您正在进行任何类型的“社交登录”(使用 facebook 登录、使用 google 登录等),您可以对 IAM 进行 OAuth 并获得每个用户的唯一凭据。如果您想直接从应用程序执行此操作而不维护服务,这是另一种方法。

如果您同意将同一组 IAM 凭证嵌入到每个手表应用程序中,请查看 SigV4,但我建议您看看是否有一种方法可以根据个人用户进行身份验证。