【问题标题】:API Gateway Authorizer - IAM policy not cachingAPI Gateway Authorizer - IAM 策略未缓存
【发布时间】:2020-03-02 22:18:25
【问题描述】:

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

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

【问题讨论】:

  • 查看两个请求的 API Gateway 执行日志可能有助于识别授权策略或缓存密钥的任何问题
  • 我检查正确,但在 CloudWatch 日志组中找不到今天日期和时间的 API 网关执行日志。我在 CloudWatch 日志中看到的 Authorizer lambda 函数只是 START RequestIdEND RequestIdREPORT RequestId(没有其他信息)。
  • @nrai 尝试在授权函数中打印事件数据,并比较第一次和后续调用的日志。 docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html

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


【解决方案1】:

我发现我没有正确测试 API Gateway Authorizer 缓存逻辑。我一直在测试各种场景,在这里发现了两种情况:

  • 令牌有效时: 当调用 endpoint 时,请求会发送到验证/无效令牌的 Lambda 授权方。 IAM 策略由函数返回给 API Gateway Authorizer 并被缓存(在这种情况下 - 用于 58 minutes, 20 seconds)。

    Token Source中指定的头部名称成为缓存键,授权者生成的授权策略成为缓存值。 API 网关将检查Token Source 中指定的标头。如果 header 的 value 与 key 匹配,API Gateway 将不会调用 Lambda Authorizer,而是根据配置的 TTL 检查策略是否有效。

    如果在缓存时间范围内生成了新令牌,则会再次调用 Lambda 授权方并缓存此令牌。因此,如果使用这两个令牌调用端点,则不会调用 Lambda 授权方,因为这些令牌的 IAM 策略已在给定的缓存时间范围内缓存,并且会返回响应。

  • 令牌无效时:例如,如果令牌对30 minutes11:00:00AM11:30:00AM有效,并且缓存TTL设置为@987654330 @。客户端使用该令牌发出 2 个 API 请求,一个在 11:29:59AM,另一个在 11:31:3APM - 然后两个请求都将被接受,尽管第二个请求使用了过期的令牌。这基本上意味着JWT token 被缓存TTL 扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2022-08-17
    • 2020-03-17
    • 2016-12-17
    • 1970-01-01
    • 2020-08-21
    • 2015-11-12
    相关资源
    最近更新 更多