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

使用自定义Lambda授权器时,API Gateway返回内部服务器错误的原因?

问题分析

你的自定义授权器日志显示令牌验证通过,但listUsers函数未执行且返回500错误,核心原因是Lambda请求授权器的返回格式不符合HTTP API的要求。AWS HTTP API要求请求型授权器的返回结果必须包含principalId字段,仅返回isAuthorized: true会导致API Gateway无法完成授权流程,进而抛出内部错误。

解决方案

修改authorizer.js中的返回逻辑,在验证通过/失败的情况下都添加principalId字段,值可以从JWT payload中提取或设置为标识性字符串:

const { CognitoJwtVerifier } = require('aws-jwt-verify');
const Cognito = require('../shared/Cognito');

module.exports.handler = async (event) => {
    const authHeader = event.headers.authorization;
    if (!authHeader) {
        console.log('No auth header');
        return {
            isAuthorized: false,
            principalId: 'unauthorized'
        };
    }
    const token = authHeader.split(' ')[1];
    console.log(token);
    const verifier = CognitoJwtVerifier.create({
        userPoolId: Cognito.UserPoolId,
        tokenUse: 'access',
        clientId: Cognito.ClientId,
    });
    let payload = null;
    try {
        payload = await verifier.verify(token);
        console.log('Token is valid. Payload:', payload);
        return {
            isAuthorized: true,
            principalId: payload.sub // 使用JWT中的用户唯一ID作为principalId
            // 可选:添加context字段传递用户信息到后端函数
            // context: {
            //   username: payload.username,
            //   email: payload.email
            // }
        };
    } catch {
        console.log('Token is invalid.');
        return { 
            isAuthorized: false,
            principalId: 'invalid-token'
        };
    }
};
额外检查点
  • 确认serverless.yml中授权器的identitySource配置(默认值为$request.header.Authorization,符合你的场景无需修改)。
  • 查看API Gateway的CloudWatch日志,搜索500相关错误条目,确认是否为返回格式问题导致的报错。
  • 重新部署授权器和API服务,确保修改生效。

内容的提问来源于stack exchange,提问作者Eb3us

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:30:07