[英]API Gateway Authorizer - IAM policy not caching
我正在尝试缓存授权方 lambda 首次验证 JWT 令牌时返回的 IAM 策略。 我已在 API 网关授权器中启用并将authorizerResultTtlInSeconds
设置为3500
秒。 但是,我仍然看到在缓存时间范围内向授权方 lambda function 发送请求。
我的 node.js 脚本如下:
const jwt = require('jsonwebtoken');
const jwksClient = require('jwks-rsa');
const keyClient = jwksClient({
jwksUri: process.env.JWKS_URI
})
const allow = {
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": process.env.RESOURCE // RESOURCE = *
}
]
}
}
const unauthorized = {
"error": "Unauthorized",
}
//excluded verificationJWTOptions object and getSigningKey function for simplicity
function validateJWTToken(token, callback) {
jwt.verify(token, getSigningKey, verificationJWTOptions, (error) => {
if (error) {
callback(unauthorized)
} else {
callback(null, allow)
}
})
}
exports.handler = (event, context, callback) => {
const token = extractTokenFromHeader(event);
validateJWTToken(token, callback);
}
不知道我错过了什么。 任何帮助将非常感激!
我发现我没有正确测试 API Gateway Authorizer 缓存逻辑。 我一直在测试各种场景,在这里发现了两种情况:
当令牌有效时:当调用endpoint
,请求会转到验证/使令牌无效的 Lambda 授权方。 IAM 策略由函数返回给 API Gateway Authorizer 并被缓存(在这种情况下 - 58 minutes, 20 seconds
)。
Token Source
指定的头部名称成为缓存键,授权方生成的授权策略成为缓存值。 API 网关将检查Token Source
指定的标头。 如果 header 的值与 key 匹配,API Gateway 将不会调用 Lambda Authorizer 而是根据配置的TTL
检查策略是否有效。
如果在缓存时间范围内生成了新令牌,则会再次调用 Lambda 授权程序并缓存此令牌。 因此,如果使用这两个令牌调用终端节点,则不会调用 Lambda 授权程序,因为这些令牌的 IAM 策略已经在给定的缓存时间范围内缓存,并且响应会被返回。
当令牌无效时:例如,如果令牌在11:00:00AM
到11:30:00AM
30 minutes
有效,并且缓存TTL
设置为58 minutes
。 客户端使用该令牌发出 2 个 API 请求,一个在11:29:59AM
和另一个在11:31:3APM
- 然后这两个请求都将被接受,尽管第二个请求使用了过期的令牌。 这基本上意味着JWT token
被缓存TTL
扩展。
我使用 AWS CDK 遇到了同样的问题。 我相信这是 CDK、CloudFormation 或 API 网关本身的错误。
解决方法是手动重新部署 API 网关阶段。 否则缓存选项无效。
可以从“资源”部分的“操作”菜单中找到部署操作:
我认为这是一个错误,因为 AWS CDK 应该默认自动执行此操作,因为deploy: true
是RestApi
构造中的默认值:
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.RestApi.html#deploy
指示是否应为此 API 自动创建 Deployment,并在 API model(资源、方法)更改时重新创建。
在 CDK 代码中,我能够通过重命名RequestAuthorizer
id 来强制重新部署:
api.root
.addResource("things")
.addMethod("POST", new LambdaIntegration(nextHandler, {}), {
apiKeyRequired: true,
authorizer: new RequestAuthorizer(
this,
"Authorizer3", // 👈 Update this if you change resultsCacheTtl
{
// WARNING: resultsCacheTtl change requires manual
// deployment from the AWS console. Or update the
// RequestAuthorizer id
resultsCacheTtl: Duration.minutes(5),
handler: authorizer,
identitySources: [IdentitySource.queryString("jwt")],
},
),
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.