簡體   English   中英

調用 AWS API - 簽名、身份驗證 Header - 在 android 中使用 OkHTTP

[英]Calling AWS API - Signature, Authentication Header - using OkHTTP in android

我正在嘗試使用 OkHTTP 在 android 中向 AWS API 簽署 HTTP 請求。 我使用了這個問題的代碼。 AWS 的文檔根本沒有幫助。 我很困擾。 這是迄今為止我發現的唯一易於理解和實現的代碼。 但這也不適用於我的問題。 我沒有使用 API 傳遞任何數據,它只是簡單的 API 我必須調用並接收消息。

我的代碼

AWSCredentials credentials =  new BasicAWSCredentials(access_key_id.trim(), secret_access_key.trim());
String API_GATEWAY_SERVICE_NAME = "execute-api";

Request requestAws = new DefaultRequest(API_GATEWAY_SERVICE_NAME);
URI uri = URI.create(url);
requestAws.setEndpoint(uri);
requestAws.setResourcePath(url);
requestAws.setHttpMethod(HttpMethodName.POST);

AWS4Signer signer = new AWS4Signer();
signer.setServiceName(API_GATEWAY_SERVICE_NAME);
signer.setRegionName("us-east-2");
signer.sign(requestAws, credentials);

OkHttpClient httpClient = new OkHttpClient();
Map<String, String> headers = requestAws.getHeaders();
List<String> key = new ArrayList<String>();
List<String> value = new ArrayList<String>();

for (Map.Entry<String, String> entry : headers.entrySet()) {
   key.add(entry.getKey());
   value.add(entry.getValue());
}

okhttp3.Request request = new okhttp3.Request.Builder()
.url(url)
.addHeader(key.get(0), value.get(0))
.addHeader(key.get(1), value.get(1))
.addHeader(key.get(2), value.get(2))
.build();

Response response = httpClient.newCall(request).execute();

我得到的錯誤

{"message":"The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.\n\nThe Canonical String for this request should have been\n'GET\n/**2nd last part of url ***/**last part of url ***/\n\nhost:***.execute-api.us-east-2.amazonaws.com\nx-amz-date:20210306T082609Z\n\nhost;x-amz-date\***signature***'\n\nThe String-to-Sign should have been\n'AWS4-HMAC-SHA256\n20210306T082609Z\n20210306/us-east-2/execute-api/aws4_request\n***signature***'\n"}

它是一個簡單的代碼,但我找不到任何問題。 服務器錯誤也沒有幫助。

從服務器端我沒有使用任何內容類型,這就是為什么我沒有在 header 中通過它。 這可能是個問題嗎? 我也認為我的 requesAws 存在一些問題。

這條線可能有問題。 我不知道這到底是什么意思,所以我已經通過了相同的 API url 在它作為參考代碼。

requestAws.setResourcePath(url);

我不建議您編寫自己的 SigV4 簽名者。 相反,嘗試將其中的一個作為庫依賴項。

試試babbel 的 OkHttp 簽名者

dependencies {
    implementation 'com.github.babbel:okhttp-aws-signer:1.0.1'
}
val signer = OkHttpAwsV4Signer("us-east-1", "execute-api")

val client = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val original = chain.request()
        val signed = signer.sign(original, accessKeyId, accessKey)
        chain.proceed(signed)
    }
    .build()

Ghedeon 的

repositories {
    maven {
        url "http://dl.bintray.com/ghedeon/maven"
    }
}

...

dependencies {
    implementation 'com.ghedeon:aws-interceptor:0.6'
}
val interceptor = AwsInterceptor(credentialsProvider, serviceName, region)
 
val okHttpClient = new OkHttpClient.Builder()
    .addInterceptor(interceptor)
    .build()

后者在引擎蓋下使用 AWS Android SDK 如果您使用的是 Amazon Cognito,您可以為credentialsProvider參數提供AWSMobileClient.getInstance()

val okHttpClient = new OkHttpClient.Builder()
    .addInterceptor(AwsInterceptor(
        AWSMobileClient.getInstance(), "execute-api", "us-east-1"
    ))
    .build()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM