android - 403 禁止。我们计算的请求签名与您提供的签名不匹配。检查从 Android 到 Amazon S3 的 key 和签名方法

标签 android amazon-web-services kotlin amazon-s3

我正在尝试使用 AWS 签名方法调用 get api,但无法获得响应。
下面是我的代码。

val secretkey = "E+t5/nDf6/NKNJBjbsdjv"
val accesskey = "DJKSBDKSBNKFGNBFG"
val credentials: AWSCredentials = BasicAWSCredentials(accesskey, secretkey)
val API_GATEWAY_SERVICE_NAME = "s3"
val requestAws: Request<*> = DefaultRequest<Any?>(API_GATEWAY_SERVICE_NAME)

val uri = URI.create("https://s3.us-west-2.amazonaws.com/..../../sample")
requestAws.endpoint = uri

requestAws.resourcePath = "https://s3.us-west-2.amazonaws.com/..../../sample"
requestAws.httpMethod = HttpMethodName.GET

val signer = AWS4Signer() signer . setServiceName (API_GATEWAY_SERVICE_NAME)
signer.setRegionName("us-west-2")
signer.sign(requestAws, credentials)
val headers = requestAws.headers

val key: MutableList<String> = ArrayList()
val value: MutableList<String> = ArrayList()

for ((key1, value1) in headers)
{
    key.add(key1) value . add (value1)
}

val httpClient = OkHttpClient()
val request: okhttp3.Request = okhttp3.Request.Builder()
        .url("https://s3.us-west-2.amazonaws.com/..../../sample")
        .addHeader(key[0], value[0])
        .addHeader(key[1], value[1])
        .addHeader(key[2], value[2])
        .addHeader("X-Amz-Content-Sha256", 
         "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
        .build()

val response: okhttp3.Response = httpClient.newCall(request).execute()
Log.i("LOG", response.body.toString())
无法弄清楚,我在做什么错误。
请帮我解决这个问题。

最佳答案

如果您想创建一个用 Kotlin 编写的 Android 应用程序并调用 AWS 服务,请使用 适用于 Kotlin 的 AWS 开发工具包 .
此 SDK 具有强类型的服务客户端,您可以在 Android Studio 项目中使用它来调用给定的服务。 (而不是使用 okhttp3.Request 等)
例如,这里的 Kotlin 代码使用名为 的强类型服务客户端调用 SNS。 SnsClient .

    // Get all subscriptions.
     fun getSubs(view: View) = runBlocking {

        val subList = mutableListOf<String>()
        val snsClient: SnsClient = getClient()
        try {

            val request = ListSubscriptionsByTopicRequest {
                topicArn = topicArnVal
            }
            val response = snsClient.listSubscriptionsByTopic(request)
            response.subscriptions?.forEach { sub ->
                subList.add(sub.endpoint.toString())
            }

            val listString = java.lang.String.join(", ", subList)
            showToast(listString)

       } catch (e: SnsException) {
            println(e.message)
            snsClient.close()
        }
       }

 fun getClient() : SnsClient{

        val staticCredentials = StaticCredentialsProvider {
            accessKeyId = "<Enter key>"
            secretAccessKey = "<Enter key>"
        }

        val snsClient = SnsClient{
            region = "us-west-2"
            credentialsProvider = staticCredentials
        }

        return snsClient
    }
要了解如何使用适用于 Kotlin 的 AWS 开发工具包,请参阅
AWS SDK for Kotlin Developer Guide

关于android - 403 禁止。我们计算的请求签名与您提供的签名不匹配。检查从 Android 到 Amazon S3 的 key 和签名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72801424/

相关文章:

android - 在 ListView 中显示图像 url

amazon-web-services - 如何通过 CloudFormation 将 Api Gateway 与 Step Functions 集成

android - 打破或继续跳过类边界 kotlin

Android 表头 View

Android 多个WebView保存实例

android - 如何从android中的开火中检索聊天记录

amazon-web-services - 如何让现有用户成为 AWS Redshift 中的 super 用户

amazon-web-services - PIG 中的 DUMP 命令不起作用

java - 在 JOOQ 中,如果我直接使用底层连接,我的事务状态是否保持?

java - 如何消除Android Root View 中的模糊