node.js - API 网关授权者 - IAM 策略不缓存

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

我尝试缓存授权者 lambda 首次验证 JWT token 时返回的 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 Authorizer 缓存逻辑。我一直在测试各种场景,发现了两种情况:

  • token 有效时:调用端点时,请求将发送至 Lambda Authorizer,由 Lambda Authorizer 验证/无效 token 。该函数将 IAM 策略返回给 API Gateway 授权方并进行缓存(在本例中 - 58 分 20 秒)。

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

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

  • token 无效时:例如,如果 token 在 11:00:00AM11:30:00AM30 分钟内有效,并且缓存 TTL 设置为 58 分钟。客户端使用该 token 发出 2 个 API 请求,一个在 11:29:59AM ,另一个在 11:31:3APM - 那么这两个请求都将被接受,尽管第二个请求使用了过期的 token 。这基本上意味着 JWT token 通过缓存 TTL 进行扩展。

关于node.js - API 网关授权者 - IAM 策略不缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60434412/

相关文章:

php - 缓存来自远程 URL 的 XML 提要

jquery - AWS API Gateway 不存在 'Access-Control-Allow-Origin' header

reactjs - 在 ReactJS 中使用 Lambda/API 网关

javascript - DynamoDB batchWriteItem 在 node.js 中崩溃

javascript - Node.JS module.exports 用于在两个函数之间传递参数?

javascript - 如何在html页面或jade页面中显示mongoose结果

amazon-web-services - 无服务器框架不是通过配置在 AWS 上部署 API 网关

javascript - 无法识别快速路线。响应 'Cannot GET'

php - 通过 PHP 缓存图像请求 - If-Modified-Since 未发送

javascript - 即使工具箱打开,Firefox 和 RequireJS 仍然从缓存中提取