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

Node.js Lambda中验证解码Cognito JWT遇问题求助

问题诊断与解决方案

错误原因分析

  1. JwtInvalidScopeError: Missing Scope. Expected: read
    你传递给Lambda的是Cognito的ID Token而非Access Token。ID Token仅用于前端获取用户身份信息,并不包含scope字段,所以验证器找不到指定的read scope。

  2. CognitoJwtInvalidTokenUseError: Token use not allowed: id. Expected: access
    你的验证器配置为验证Access Token(默认或显式指定tokenUse: "access"),但实际传入的是ID Token,两者的token_use字段不匹配,导致验证失败。


解决步骤

1. 确保UI端传递Access Token到API

Cognito认证后会返回两种Token:

  • ID Token:仅用于前端渲染用户信息(如用户名、邮箱)
  • Access Token:用于调用受保护的API接口

修改UI端代码,将请求API时携带的Token替换为Access Token,请求头格式保持Authorization: Bearer <Access Token>。

2. 正确配置aws-jwt-verify验证器

确保验证器明确指定验证Access Token,并按需配置scope验证。

示例Lambda代码

const { CognitoJwtVerifier } = require("aws-jwt-verify");

// 初始化Cognito JWT验证器
const verifier = CognitoJwtVerifier.create({
  userPoolId: "us-east-1_xxxxxxx", // 替换为你的用户池ID
  tokenUse: "access", // 强制验证Access Token
  clientId: "xxxxxxxxx", // 替换为你的App Client ID
  scope: "read" // 若需验证scope,确保Access Token包含该值
});

exports.handler = async (event) => {
  try {
    // 从请求头提取Token
    const authHeader = event.headers.Authorization || event.headers.authorization;
    if (!authHeader) {
      return {
        statusCode: 401,
        body: JSON.stringify({ message: "缺少Authorization请求头" })
      };
    }
    const token = authHeader.split(" ")[1]; // 移除Bearer前缀

    // 验证Token并解析用户信息
    const decodedToken = await verifier.verify(token);

    // 使用解析后的用户信息处理业务逻辑
    return {
      statusCode: 200,
      body: JSON.stringify({
        message: "Token验证成功",
        user: {
          userId: decodedToken.sub,
          username: decodedToken.username
        }
      })
    };
  } catch (error) {
    console.error("Token验证失败:", error);
    return {
      statusCode: 403,
      body: JSON.stringify({ message: error.message })
    };
  }
};

3. 确保Cognito配置包含所需Scope

如果需要验证read scope,需完成以下配置:

  • 登录AWS控制台,进入Cognito用户池 -> 应用客户端 -> 编辑你的App Client
  • 在OAuth 2.0设置中,添加自定义scope(如read)或选择内置scope
  • UI端请求Token时,确保授权请求的scope参数包含openid read(openid是获取ID Token的必需项,read是自定义scope)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:15:32