API Gateway授权器配置问题:如何在foo或bar头存在时触发并启用缓存?
API Gateway 授权器多请求头“或”触发+缓存实现方案
问题背景
要配置授权器,要求请求携带foo或bar头时触发,但直接设置两个身份源会要求两者同时存在;不设身份源又无法启用缓存。以下是两种可行的解决办法:
方法一:Lambda授权器自定义逻辑+固定身份源占位
- 选一个所有请求必然携带的头(比如
Host)作为身份源,这样就能正常开启缓存,缓存键基于该头生成。 - 在Lambda授权器代码里自定义判断逻辑:检查请求中是否存在
foo或bar头,任意一个存在就执行授权验证。 - 优化缓存精度:如果需要根据实际的
foo/bar值缓存授权结果,可在Lambda返回的context中传入对应的凭证值,然后在授权器配置里开启「缓存键包含上下文」,让API Gateway把context内容也纳入缓存键计算。
示例Python Lambda代码:
def lambda_handler(event, context): headers = event.get('headers', {}) # 检查foo或bar是否存在 auth_token = headers.get('foo') or headers.get('bar') if auth_token: # 这里替换成你的实际授权验证逻辑 is_valid = validate_token(auth_token) if is_valid: return { 'principalId': 'authorized_user', 'policyDocument': { 'Version': '2012-10-17', 'Statement': [{ 'Action': 'execute-api:Invoke', 'Effect': 'Allow', 'Resource': event['methodArn'] }] }, 'context': {'auth_token': auth_token} } # 无有效头或验证失败,拒绝访问 return { 'principalId': 'unauthorized', 'policyDocument': { 'Version': '2012-10-17', 'Statement': [{ 'Action': 'execute-api:Invoke', 'Effect': 'Deny', 'Resource': event['methodArn'] }] } } def validate_token(token): # 实现你的token验证逻辑 return token is not None
方法二:请求参数映射生成自定义身份源
- 在API Gateway的集成请求配置中,添加请求参数映射,创建自定义头(比如
auth-source),映射规则为:若foo存在则取其值,否则取bar的值,两者都不存在则为空。 - 将
auth-source设为授权器的身份源,这样只要foo或bar有一个存在,auth-source就有值,满足授权器触发条件,同时可基于该自定义头启用缓存。 - 授权器中直接验证
auth-source的值即可,无需再单独处理foo和bar。
注意事项
- 缓存键准确性:方法一中要开启「缓存键包含上下文」,确保不同的
foo/bar值对应不同的缓存条目;方法二中直接用auth-source的值作为缓存键,天然具备准确性。 - 授权器触发可靠性:方法一中选的身份源必须是所有请求都携带的,否则API Gateway会跳过授权器;方法二中的自定义头只要
foo或bar存在就会有值,能保证授权器触发。
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

