Skip to content

Commit 15e5f0c

Browse files
authored
fix: Ensure Host header is included when signing auth tokens (#1222)
1 parent a4ace35 commit 15e5f0c

File tree

4 files changed

+12
-3
lines changed

4 files changed

+12
-3
lines changed

.github/workflows/continuous-integration.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ jobs:
6868
./gradlew test jvmTest
6969
- name: Save Test Reports
7070
if: failure()
71-
uses: actions/upload-artifact@v3
71+
uses: actions/upload-artifact@v4
7272
with:
7373
name: test-reports-${{ matrix.os }}
7474
path: '**/build/reports'

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
kotlin-version = "2.1.0"
33
dokka-version = "1.9.10"
44

5-
aws-kotlin-repo-tools-version = "0.4.17"
5+
aws-kotlin-repo-tools-version = "0.4.18"
66

77
# libs
88
coroutines-version = "1.9.0"

runtime/auth/aws-signing-common/common/src/aws/smithy/kotlin/runtime/auth/awssigning/AuthTokenGenerator.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package aws.smithy.kotlin.runtime.auth.awssigning
66

77
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProvider
88
import aws.smithy.kotlin.runtime.auth.awssigning.AwsSigningConfig.Companion.invoke
9+
import aws.smithy.kotlin.runtime.http.Headers
910
import aws.smithy.kotlin.runtime.http.HttpMethod
1011
import aws.smithy.kotlin.runtime.http.request.HttpRequest
1112
import aws.smithy.kotlin.runtime.net.url.Url
@@ -28,7 +29,13 @@ public class AuthTokenGenerator(
2829
private fun Url.trimScheme(): String = toString().removePrefix(scheme.protocolName).removePrefix("://")
2930

3031
public suspend fun generateAuthToken(endpoint: Url, region: String, expiration: Duration): String {
31-
val req = HttpRequest(HttpMethod.GET, endpoint)
32+
val req = HttpRequest(
33+
HttpMethod.GET,
34+
endpoint,
35+
headers = Headers {
36+
append("Host", endpoint.hostAndPort)
37+
},
38+
)
3239

3340
val config = AwsSigningConfig {
3441
credentials = credentialsProvider.resolve()

runtime/auth/aws-signing-common/common/test/aws/smithy/kotlin/runtime/auth/awssigning/AuthTokenGeneratorTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class AuthTokenGeneratorTest {
4545
assertContains(token, "X-Amz-Credential=signature") // test custom signer was invoked
4646
assertContains(token, "X-Amz-Expires=333") // expiration
4747
assertContains(token, "X-Amz-SigningDate=0") // clock
48+
assertContains(token, "X-Amz-SignedHeaders=host")
4849

4950
assertTrue(credentialsProvider.credentialsResolved)
5051
}
@@ -60,6 +61,7 @@ private val TEST_SIGNER = object : AwsSigner {
6061
put("X-Amz-Credential", "signature")
6162
put("X-Amz-Expires", (config.expiresAfter?.toLong(DurationUnit.SECONDS) ?: 900).toString())
6263
put("X-Amz-SigningDate", config.signingDate.epochSeconds.toString())
64+
put("X-Amz-SignedHeaders", request.headers.names().map { it.lowercase() }.joinToString())
6365
}
6466

6567
return AwsSigningResult<HttpRequest>(builder.build(), "signature".encodeToByteArray())

0 commit comments

Comments
 (0)