【发布时间】:2020-12-31 21:18:35
【问题描述】:
我正在尝试通过在 Node.js 服务器上使用 jsonwebtoken 来制作 安全路由器。
我正在使用passport.js 使用 JWT 对用户进行身份验证。
一开始,我把所有的逻辑都放在控制器里。
但是所有安全路由器都需要检查认证,所以我尝试将认证部分划分为中间件
之前
user.controller.js
/**
* GET /user
* Get user data
*/
exports.getUser = (req, res, next) => {
passport.authenticate("jwt", { session: false }, (err, payload, info) => {
if (err) return next(err);
if (!payload) return next(info);
User.findOne({ email: payload.email }, (err, user) => {
if (err) return next(err);
if (!user) return next("no matching user found");
res.status(200).send({ email: user.email });
});
})(req, res, next);
};
app.js
const userController = require('user.controller.js');
app.get('/user', userController.getUser);
之后
passport.js
/**
* Check authentication
*/
exports.checkAuth = (req, res, next) => {
passport.authenticate("jwt", { session: false }, (err, payload, info) => {
if (err) return next(err);
if (!payload) return next(info);
req.user = payload;
next();
})(req, res, next);
};
user.controller.js
/**
* GET /user
* Get user data
*/
exports.getUser = (req, res, next) => {
User.findOne({ email: req.user.email }, (err, user) => {
if (err) return next(err);
if (!user) return next("no matching user found");
res.status(200).send({ email: user.email });
});
};
app.js
const passportConfig = require('passport.js');
const userController = require('user.controller.js');
app.get('/user', passportConfig.checkAuth, userController.getUser);
在原来的user.controller.js 中,我可以从payload.email 得到email。
但是分割原始文件后,我无法访问user.controller.js 处的email 值。
所以我搜索了一些如何将数据从一个中间件传递到另一个中间件的方法,并使用了req.user。
问题
- 使用 jwt、passport.js 进行身份验证的结构是否正确?
- 这是在中间件之间传递数据的正确方法吗?还是有更好的方法?
【问题讨论】:
标签: javascript node.js express authentication passport.js