我有一个API网关,有两个端点:
- 授权类型为
NONE
。委托给名为fooLambda
的 Lambda 函数。 - 授权类型为
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却不能?”
AmazonAPIGatewayInvokeFullAccess
策略。我在第二个端点上有一个更精细的execute-api
策略,但它仍然无法正常工作。我仍然收到错误消息,指出“我们计算的请求签名与您提供的签名不符”,所以我不知道我的代码出了什么问题。 - Ogen