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