【发布时间】:2020-03-20 20:46:00
【问题描述】:
我最后一直在使用 MERN 堆栈,我知道如何验证用户身份(检查他是否正确登录),但我真的不知道并且在角色/权限方面感到有点困惑。
我现在正在使用 JWT,想知道这个堆栈是如何处理访问控制的。
例如对于博客,管理员应该能够从 API 获取所有注册用户,但普通用户或版主不应该。
哪些工具可以帮助我解决这个问题?
【问题讨论】:
标签: node.js authentication jwt authorization mern
我最后一直在使用 MERN 堆栈,我知道如何验证用户身份(检查他是否正确登录),但我真的不知道并且在角色/权限方面感到有点困惑。
我现在正在使用 JWT,想知道这个堆栈是如何处理访问控制的。
例如对于博客,管理员应该能够从 API 获取所有注册用户,但普通用户或版主不应该。
哪些工具可以帮助我解决这个问题?
【问题讨论】:
标签: node.js authentication jwt authorization mern
我的建议是在用户帐户上设置权限级别并仅通过 JWT 令牌中的电子邮件,在 express 中创建一个中间件,检查 jwt 令牌是否有效,如果不是,则返回 401 状态(未经授权)
如果通过则解码 jwt 并将电子邮件作为 res.locals.email 传递给 express 的 res.locals
创建另一个使用第一个中间件的中间件,使用您保存在 express 的 res.local 中的电子邮件找到您想要的用户。
根据email搜索找到一个用户(假设email是唯一值),如果用户是高级别则执行next()函数,否则抛出错误401
验证中间件:
import { NextFunction, Request, Response } from 'express';
import jwt from 'jsonwebtoken';
export default async (req: Request, res: Response, next: NextFunction) => {
const token = req.headers['x-access-token'] || req.headers.authorization;
if (!token) {
return res.status(401).send('Access denied.');
}
try {
const tokenPart = (token as string).split(' ')[1];
const decode = jwt.verify(tokenPart, String(process.env.JWT_SECRET));
const userMail = Object(decode).email;
res.locals.email = userMail;
next();
} catch (err) {
res.status(400).json({ message: 'Invalid token' });
}
};
授权中间件:
import { NextFunction, Request, Response } from 'express';
import user from '../models/modelFunctions/userModelFunction';
export default async (req: Request, res: Response, next: NextFunction) => {
const userData = await user.findOne({ email: res.locals.email });
if (userData.level === 'admin') {
next();
} else {
res.status(401).send('Unauthorized, you cannot perform this action');
}
};
我以前用 typescript 写过这个,但你可以在 javascript 中做同样的事情,只需删除我添加的类型
而我的 jwt 将只有电子邮件地址而已
【讨论】: