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

9

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

  1. 授权类型为NONE。委托给名为fooLambda的 Lambda 函数。
  2. 授权类型为AWS_IAM

客户端应该调用端点 1 从 fooLambda 获取凭据,以便他们可以成功调用 endpoint 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'],
}

现在我的意图是让客户端可以附加这两个标头到他们的请求中,以便他们可以成功调用端点2,但我收到一个错误,说安全令牌无效,但我不确定为什么。
更新:当我使用Postman的AWS签名授权类型并提供我的accessKey、secretKey、aws区域、服务名称和会话令牌参数时,它创建了授权标头,对端点2的请求成功了!
检查Postman生成的授权标头后,发现Authorization标头具有不同的签名。所以现在的问题是:“为什么Postman可以生成正确的授权标头,而aws4却不能?”
2个回答

3
使用aws4.sign函数时,必须提供请求将拥有的路径。否则,签名请求与实际请求之间存在不匹配,AWS将无法处理。

1

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

2. 仅用于丢弃,创建一个新的方法(端点)而无需进行身份验证,例如:

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

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

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

3. 验证AWS_IAM_AUTH在您的方法(端点)中是否起作用。

所以,我发现这个video可以非常有帮助地测试您的带有身份验证头的端点。

祝你好运,告诉我后来的情况。


我的用户没有AmazonAPIGatewayInvokeFullAccess策略。我在第二个端点上有一个更精细的execute-api策略,但它仍然无法正常工作。我仍然收到错误消息,指出“我们计算的请求签名与您提供的签名不符”,所以我不知道我的代码出了什么问题。 - Ogen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接