从临时凭证正确生成 AWS 身份验证 headers
Correctly generating AWS auth headers from temporary credentials
我有一个 API 网关,它有两个端点:
- 授权类型是
NONE
。委托给名为 fooLambda
. 的 lambda
- 授权类型为
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 将拒绝。
我有一个 API 网关,它有两个端点:
- 授权类型是
NONE
。委托给名为fooLambda
. 的 lambda
- 授权类型为
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 将拒绝。