如何在NodeJS中验证AWS Cognito用户身份认证
在Node.js后端验证AWS Cognito令牌的实现步骤
1. 安装依赖
使用AWS官方推荐的aws-jwt-verify库处理令牌验证,避免手动解析JWT的复杂逻辑:
npm install aws-jwt-verify
2. 初始化Cognito令牌验证器
根据你的AWS Cognito配置信息创建验证实例,指定用户池ID、客户端ID和令牌类型(access用于权限校验,id用于获取用户身份信息):
const { CognitoJwtVerifier } = require("aws-jwt-verify"); const cognitoVerifier = CognitoJwtVerifier.create({ userPoolId: "us-east-1_XXXXXXXXX", // 替换为你的用户池ID tokenUse: "access", clientId: "XXXXXXXXXXXXXXXXXXXXXXXX", // 替换为你的Cognito客户端ID });
3. 从请求中提取令牌
前端会将令牌放在Authorization请求头中,格式为Bearer <token>,编写工具函数提取令牌:
function getAuthToken(req) { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith("Bearer ")) { return null; } return authHeader.split(" ")[1]; }
4. 编写身份验证中间件(以Express为例)
创建Express中间件,实现令牌验证逻辑,验证通过后将用户信息挂载到请求对象上:
async function validateCognitoToken(req, res, next) { const token = getAuthToken(req); if (!token) { return res.status(401).json({ error: "未提供有效认证令牌" }); } try { // 验证令牌并解析 payload const userPayload = await cognitoVerifier.verify(token); req.user = userPayload; next(); } catch (error) { // 令牌过期、签名无效等情况都会触发错误 return res.status(401).json({ error: "认证令牌无效或已过期" }); } }
5. 在受保护路由中使用中间件
将验证中间件添加到需要身份验证的路由上,只有验证通过的请求才能访问:
const express = require("express"); const app = express(); // 受保护路由示例 app.get("/api/user/profile", validateCognitoToken, (req, res) => { res.json({ message: "成功访问受保护资源", userInfo: { username: req.user.username, userId: req.user.sub } }); }); app.listen(3000, () => console.log("后端服务启动在3000端口"));
关键注意事项
- 令牌类型选择:如果只需验证用户身份,可使用
id令牌;如果需要校验用户权限,优先使用access令牌。 - 区域一致性:确保后端配置的AWS区域与Cognito用户池所在区域完全一致。
- 自动验证逻辑:
aws-jwt-verify会自动处理令牌的签名验证、过期检查、受众(aud)校验,无需手动实现这些安全逻辑。
内容的提问来源于stack exchange,提问作者iEmad00
相关产品推荐
相关产品推荐

