AWS Lambda Authorizer如何让缓存TTL适配Token实际过期时间
有原生支持的实现方式,不需要额外搭建缓存层或者修改网关核心逻辑,直接利用Lambda Authorizer的返回字段能力就能解决Token过期后仍被缓存放行的问题。
核心实现逻辑
Lambda Authorizer 支持通过返回结果中的ttlOverride字段,覆盖单条授权结果的默认缓存TTL,优先级高于你在控制台/OpenAPI配置里设置的全局TTL值。你只需要在授权校验逻辑里增加TTL动态计算步骤即可:
- 校验Token合法性的同时,解析Token自带的过期时间(比如JWT的
exp声明、自定义Token的过期字段) - 计算当前时间到Token过期点的剩余有效秒数
- 取「全局配置的默认缓存TTL」和「Token实际剩余有效秒数」的较小值,作为
ttlOverride的值返回给API Gateway - 如果Token剩余有效期小于等于0,直接返回Deny拒绝策略即可
代码示例(Python)
import time import jwt def lambda_handler(event, context): token = event["authorizationToken"].replace("Bearer ", "") try: # 替换为你实际使用的Token校验逻辑 payload = jwt.decode(token, "your_sign_key", algorithms=["HS256"]) # 计算Token剩余有效时长 remaining_valid_sec = payload["exp"] - int(time.time()) # Token已过期直接拒绝 if remaining_valid_sec <= 0: return generate_policy("user", "Deny", event["methodArn"]) # 动态计算缓存TTL:默认300秒,最长不超过Token实际剩余有效期 cache_ttl = min(300, remaining_valid_sec) # 构造返回结果,带上ttlOverride覆盖默认缓存时长 policy = generate_policy(payload["user_id"], "Allow", event["methodArn"]) policy["ttlOverride"] = cache_ttl policy["context"] = {"user_id": payload["user_id"]} return policy except Exception as e: return generate_policy("user", "Deny", event["methodArn"]) def generate_policy(principal_id, effect, resource): return { "principalId": principal_id, "policyDocument": { "Version": "2012-10-17", "Statement": [{ "Action": "execute-api:Invoke", "Effect": effect, "Resource": resource }] } }
注意事项
ttlOverride的取值不能超过你配置的全局缓存TTL,就算传入更大的值,API Gateway也会自动截断为全局TTL值,直接取两者最小值即可- 不建议把
ttlOverride设为0,该值为0时API Gateway不会缓存本次授权结果,所有请求都会透传到Lambda校验,高并发场景下容易触发Lambda限流,除非你有明确的全量实时校验需求,否则建议给剩余有效期极短的场景留1~5秒的最小缓存兜底 - 该方案不需要调整API Gateway侧的任何Authorizer配置,仅修改Lambda校验代码即可生效,配置完成后缓存失效时间会和Token过期时间完全对齐,不会再出现过期Token被缓存放行的问题
内容的提问来源于stack exchange,提问作者jack_sparrow
相关产品推荐
相关产品推荐

