我正在尝试缓存授权者lambda首次验证JWT令牌时返回的IAM策略。我已在API Gateway Authorizer中启用并将authorizerResultTtlInSeconds
设置为3500
秒。但是,我仍然看到在缓存时间范围内对Authorizer lambda函数的请求。
我的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);
}
不确定我错过了什么。任何帮助将不胜感激!
答案 0 :(得分:3)
我发现我没有正确测试API Gateway Authorizer缓存逻辑。我一直在测试各种情况,并在这里找到两种情况:
令牌有效时::调用endpoint
时,请求将转到Lambda授权器,该验证器使令牌生效/无效。 IAM策略由函数返回给API网关授权器并被缓存(在这种情况下-为58 minutes, 20 seconds
)。
在Token Source
中指定的标头名称成为缓存键,而授权者生成的授权策略则成为缓存值。 API网关将检查Token Source
中指定的标头。如果标头的值与密钥匹配,则API Gateway不会调用Lambda Authorizer,而是根据配置的TTL
检查策略是否有效。
如果在缓存时间范围内生成了新令牌,则会再次调用Lambda Authorizer,并且将缓存此令牌。因此,如果使用这两个令牌调用了端点,则不会调用Lambda授权器,因为针对这些令牌的IAM策略已经在给定的缓存时间范围内进行了缓存,并且响应已返回。
令牌无效时:例如,如果令牌对于30 minutes
从11:00:00AM
到11:30:00AM
以及缓存{{ 1}}设置为TTL
。客户端使用该令牌发出2个API请求,一个在58 minutes
,另一个在11:29:59AM
-尽管两个请求都使用了过期的令牌,但两个请求都将被接受。这基本上意味着11:31:3APM
被缓存JWT token
扩展。