You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,请逐一确认以下配置:

  1. 确认模板是配置在「集成请求」而非「方法请求」
    进入你的API方法详情页,选择「集成请求」→「映射模板」,这里才是配置请求体映射的地方,方法请求的模板是用来验证请求的,不是用来传递数据的。

  2. 确认Content-Type完全匹配
    确保前端请求的Content-Type头严格是application/json(没有额外空格、大小写错误),并且你在映射模板里添加的是对应Content-Type的规则。

  3. 修改后必须重新部署API
    API Gateway的任何配置修改(包括映射模板)都需要重新部署到对应的阶段才能生效,这是很多人容易忽略的点!

  4. 检查授权器的返回格式
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:57:46