API网关授权者-IAM策略未缓存

时间:2020-02-27 13:30:32

标签: node.js caching aws-api-gateway lambda-authorizer

我正在尝试缓存授权者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);
}

不确定我错过了什么。任何帮助将不胜感激!

1 个答案:

答案 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 minutes11:00:00AM11:30:00AM以及缓存{{ 1}}设置为TTL。客户端使用该令牌发出2个API请求,一个在58 minutes,另一个在11:29:59AM-尽管两个请求都使用了过期的令牌,但两个请求都将被接受。这基本上意味着11:31:3APM被缓存JWT token扩展。