我正在使用MongoDB express和passport.js在Node.js中实现基于用户令牌的访问
我通过/ usuarios / auth / login获取用户令牌,我将它放在localStorage中,并在以后的请求中发送私有路由的头文件 . Passport创建了req.user对象(我知道因为在后来的Postman请求中我能够发送添加req.user对象的响应,我也可以在VSCode Debugger中看到它) . 这意味着Passport serializeUser和deserializeUser函数及其策略在我的createToken()函数中正常工作
但是现在我想在用户成功登录时重定向到Handlebarstemplate,我希望能够访问Handlebars中的req.user对象 . 我只是试图将用户obj传递给把手,但它没有用,在成功登录后没有尝试重定向,这是我想知道的第二件事 .
这是我的一段代码:
快速配置:
module.exports.initMiddlewares = (app) => {
app.engine('.hbs', hbs({
defaultLayout: 'default',
extname: 'hbs'
}));
app.set('view engine', '.hbs');
app.use(express.static("views"));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(session({
secret:config.secretSession,
store:mongoStore
}));
app.use(auth.initialize());
app.use(passport.session());
app.use(expressValidator());
routes(app);//
}
车把路线:
router.get("/login", (req, res) => {//Login view
res.render('login')
});
router.get("/registro", (req, res) => {//register view
res.render('registro')
});
router.get("/dashboard", (req, res) => {//Dashboard
res.render('dashboard', { usuario: req.user })//here req.user is undefined and in hbs template user attributes are blank
});
用户控制器中的登录功能 . 返回令牌和消息,然后通过护照创建req.user
login: (req, res, next) => {
req.sanitize('email').trim();
req.sanitize('password').trim();
auth.login(req, res, next);
req.getValidationResult()
.then(result => {
if (!result.isEmpty()) {
return res.status(422).send({errores: result.useFirstErrorOnly().array()});
}
Usuario.findOne({email: req.body.email}, (err, usuario) => {
if (err) return res.status(500).send({error: `Error del servidor ${err}`});
if (!usuario) return res.status(404).send({error: "El usuario no existe"});
if (Usuario.isPassword(req.body.password, usuario.password)) {
res.status(200).send({
message: "Te has logueado correctamente",
token: auth.createToken(usuario) //This works fine
})
} else {
return res.status(404).send({error: "Contraseña incorrecta"})
}
});
})
},
用户路线:
router.get("/", auth.authenticate(),(req, res,next) => {//This is route for authenticated users. In postman works fine when I set the token in headers
controladorUsuario.getUsuarios(req, res);
});
router.post("/auth/signup", (req, res) => {//new user (register)
controladorUsuario.signup(req, res);
});
router.post("/auth/login", (req, res) => {//Login
controladorUsuario.login(req, res);
});
验证护照中间件,导出名为auth.js的文件:
module.exports = {
authenticate: () => { //Función de autenticación
return passport.authenticate("jwt", config.jwtSession);//session is set to false in config
}
}
controladorUsuario.getUsuarios(req,res)函数,由GET / usuarios /调用:
getUsuarios: (req, res) => {
Usuario.find({}, (err, usuarios) => {
if (err) return res.status(500).send({error: `Error del servidor ${err}`});
if (!usuarios) return res.status(404).send({error: `No existen usuarios`});
res.status(200).send({usuarios, usuario:req.user})//This works fine and send back the req.user
});
},
登录后,我可以在我的API中的响应中发送req.user对象(如果创建了req.user,只需执行此操作):我必须做什么才能将其传递给Handlebars?我需要做什么才能重定向到特定的路径?
AJAX请求适用于标头中的标记 .
非常感谢!