从临时凭证正确生成 AWS 身份验证 headers

Correctly generating AWS auth headers from temporary credentials

我有一个 API 网关,它有两个端点:

  1. 授权类型是NONE。委托给名为 fooLambda.
  2. 的 lambda
  3. 授权类型为AWS_IAM

客户端应该调用端点 1 以从 fooLambda 获取凭据,以便他们可以成功调用端点 2。

我正在使用 AWS Node.js sdk 和 aws4 npm 模块来签署 aws 请求。这是我的 fooLambda:

的一些伪代码
// get the role using this...
STS.assumeRole({
    RoleArn: 'arn of my role that can call endpoint 2',
    RoleSessionName: 'foobar',
})

// parse the sts creds like this....
const stsCredentials = STS.credentialsFrom(assumeRoleResponse)

// get a collection of signed headers like so
const signedHeaders = aws4.sign({
    service: 'execute-api',
    region: process.env.REGION,
}, {
    secretAccessKey: stsCredentials.secretAccessKey,
    accessKeyId: stsCredentials.accessKeyId,
    sessionToken: stsCredentials.sessionToken,
}).headers;

// return the following headers to the client
return {
    authorizationHeader: signedHeaders['Authorization'],
    stsSecurityToken: signedHeaders['X-Amz-Security-Token'],
}

现在我的意图是客户端可以将这两个 header 附加到他们的请求中,以便他们可以成功调用端点 2,但我收到一条错误消息,指出安全令牌无效,但我没有知道为什么。

更新:当我使用 Postman 的 AWS 签名授权类型并提供我的 accessKey、secretKey、aws 区域、服务名称和 session 令牌参数时 - 它会创建授权 headers 和请求到端点 2 成功!

检查 postman-generated 授权 header 后,似乎授权 header 具有不同的签名。所以现在的问题是:"How is postman generating a correct authorization header but aws4 isn't?"

1. 您必须附加以下策略 AmazonAPIGatewayInvokeFullAccess 您的用户,也许您也可以创建一个用户组并附加该策略.

2. 只是为了丢弃,创建一个没有身份验证的新方法(端点),例如:

    https://uid.execute-api.regionidentifier.amazonaws.com/test/ping

因此,我们将放弃与 apigateway 相关的任何问题。

实现方法 "ping" 后,您可以使用 postman 进行测试。

3. 确认 AWS_IAM_AUTH 在您的方法(端点)中正常工作。

所以,我发现这个 video 对于使用 auth header.

测试您的端点非常有帮助

祝你好运,稍后告诉我进展如何。

使用 aws4.sign 函数时,您必须提供请求的路径。否则签名请求与实际发出的请求不匹配,AWS 将拒绝。