Node.js Lambda中验证解码Cognito JWT遇问题求助
问题诊断与解决方案
错误原因分析
JwtInvalidScopeError: Missing Scope. Expected: read
你传递给Lambda的是Cognito的ID Token而非Access Token。ID Token仅用于前端获取用户身份信息,并不包含scope字段,所以验证器找不到指定的readscope。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
相关产品推荐
相关产品推荐

