如何在Python Lambda函数中获取API Authorizer返回的principalId
解决API Gateway授权器principalId无法传递到Lambda函数的问题
看起来你遇到的核心问题是API Gateway的自定义授权器返回的principalId没法通过模板映射传递到后端Lambda,或者直接访问时出现KeyError。我来帮你梳理下可能的问题点和解决方案:
一、跳过模板映射,直接从requestContext获取(最可靠的方式)
其实API Gateway会默认把授权器的返回数据放到Lambda事件的requestContext.authorizer路径下,没必要依赖模板映射,直接访问这个路径更稳妥。修改你的Lambda函数代码如下:
import base64 # 假设get_info_ine是你已定义的函数 def get_info_ine(doc_bytes): # 你的业务逻辑 return {"estatus": "SUCCESS", "datos": "示例数据"} def handler(event, context): # 从requestContext中直接获取授权器返回的principalId try: user_id = event['requestContext']['authorizer']['principalId'] print(f"获取到的用户ID: {user_id}") except KeyError as e: print(f"获取principalId失败: {str(e)}") # 可以在这里添加错误处理逻辑,比如返回授权失败的响应 # 原有的业务逻辑 documento = event.get("documento") tipo = event.get("tipo") documento_bytes = base64.decodebytes(documento.encode('utf-8')) if tipo == "ine": return get_info_ine(documento_bytes) else: respuesta = { "estatus" : "ERROR", "mensaje" : f"El tipo de documento <{tipo}> enviado no existe", "claveMensaje" : 2 } return respuesta
二、如果坚持要用模板映射,检查这些配置点
如果你还是想通过模板映射把principalId映射成userId,请逐一确认以下配置:
确认模板是配置在「集成请求」而非「方法请求」
进入你的API方法详情页,选择「集成请求」→「映射模板」,这里才是配置请求体映射的地方,方法请求的模板是用来验证请求的,不是用来传递数据的。确认Content-Type完全匹配
确保前端请求的Content-Type头严格是application/json(没有额外空格、大小写错误),并且你在映射模板里添加的是对应Content-Type的规则。修改后必须重新部署API
API Gateway的任何配置修改(包括映射模板)都需要重新部署到对应的阶段才能生效,这是很多人容易忽略的点!检查授权器的返回格式
在CloudWatch日志里查看你的授权器Lambda的输出,确认返回的JSON确实包含principalId字段,比如你的授权器返回的结构是正确的:return { "principalId": str(id), "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": effect, "Resource": "arn:aws:execute-api:us-west-2:12345678910:xyz/*/POST/*" } ] } }
三、常见错误点排查
- 你尝试用
event["context"]访问是错误的,正确的路径是event["requestContext"]["authorizer"] - 如果模板映射后还是拿不到
userId,可以在Lambda里打印整个event对象,看看实际传递过来的结构是什么,这样能快速定位问题
内容的提问来源于stack exchange,提问作者roccolocko
相关产品推荐
相关产品推荐

