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

AWS Lambda授权器使用JsonWebToken遇“Invalid Token”错误排查

解决Lambda Authorizer中JWT验证"invalid token"问题

核心排查方向及修复方案

  1. 修正请求头获取逻辑
    Lambda Authorizer的事件结构中,请求头存放在headers字段下,而非直接挂载在event根节点。原始代码中event["adminToken"]的写法大概率无法正确拿到令牌,导致传递给验证函数的是无效值。
    修正代码:

    const bearer = event.headers?.adminToken; // 从headers中正确提取请求头
    
  2. 显式指定JWT签名算法
    多数JWT库默认会自动猜测算法,容易因算法不匹配触发"invalid token"错误。需确保验证时使用的算法与生成令牌时完全一致(比如HS256/RS256)。
    示例代码:

    // 假设生成令牌用的是HS256算法,显式指定
    const decoded = await jwt.verify(token, secret, { algorithms: ['HS256'] });
    
  3. 校验令牌完整性与格式

    • 用本地工具拆分JWT的Header/Payload/Signature三部分,检查Base64编码是否正确,是否存在多余空格、转义字符;
    • 确认令牌未过期(检查exp字段是否晚于当前时间);
    • 确保生成令牌时使用的secret与Lambda中定义的"sof-admin-token"完全一致,包括大小写、特殊字符。
  4. 补充Lambda Authorizer必填返回结构
    原始代码未返回标准IAM政策文档,即使鉴权逻辑正确,Api Gateway也会判定授权失败。必须返回包含policyDocument的结构:

    return {
      principalId: "authorized-user",
      policyDocument: {
        Version: "2012-10-17",
        Statement: [
          {
            Action: "execute-api:Invoke",
            Effect: auth,
            Resource: event.methodArn
          }
        ]
      }
    };
    

完整修正后的示例代码

import jwt from 'jsonwebtoken';
import { GetCommand } from "@aws-sdk/lib-dynamodb";
import { docClient } from "./your-docclient-config"; // 确保docClient初始化正确

export const handler = async (event) => {
  const secret = "sof-admin-token";
  let auth = "Deny";

  try {
    const bearer = event.headers?.adminToken;
    if (bearer) {
      console.log("Received bearer:", bearer);
      // 兼容带/不带Bearer前缀的情况
      const token = bearer.startsWith("Bearer ") ? bearer.split(" ")[1] : bearer;
      console.log("Extracted token:", token);
      
      const decoded = await jwt.verify(token, secret, { algorithms: ['HS256'] });
      console.log("Decoded token:", decoded);

      const command = new GetCommand({
        TableName: "sof-admin-db",
        Key: {
          email: decoded.data
        }
      });
      const response = await docClient.send(command);
      
      if (response.Item && response.Item.role.includes("admin")) {
        auth = "Allow";
      }
    }
  } catch (error) {
    console.error("Authorization failed:", error.message);
  }

  console.log("Final auth result:", auth);
  return {
    principalId: "user",
    policyDocument: {
      Version: "2012-10-17",
      Statement: [
        {
          Action: "execute-api:Invoke",
          Effect: auth,
          Resource: event.methodArn
        }
      ]
    }
  };
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:45:55