如何解决如何使用 Passport 在 Node/Express 服务器重启后自动登录开发用户
我正在使用 Node/Express 开发一个个人项目,我相信您明白每次我在进行更改后重新启动服务器时都必须重新登录是很烦人的。
我使用 passport-local-mongoose
进行身份验证,所有这些都运行良好。我只是在寻找一种方法来让启动过程包括自动登录具有管理员角色的用户“bob”,这样我就可以尝试我正在处理的路线,而不必每 5 分钟重新登录一次。
我已经试过了:
//set local variables middleware
app.use(function (req,res,next) {
// req.user = {
// '_id':'6011d61a04abe04708edfb5f',// 'username':'bob'
// }
// req.user = User.findOne({username: 'bob'});
req.user = User.authenticate()('bob','password');
console.log(req.user);
res.locals.currentUser = req.user;
//set success flash message
res.locals.success = req.session.success || "";
//delete flash message after sending it to the page so it doesn't show again
delete req.session.success;
//set error flash message
res.locals.error = req.session.error || "";
//delete flash message after sending it to the page so it doesn't show again
delete req.session.error;
//continue on to the next function in the middlware/route chain
next();
})
(请注意,我已经尝试了 3 种不同的方式将用户分配给 req.user)并且我将它立即放在 app.use(passport.session())
之后以及我的 app.js
文件中的其他几个位置,它似乎完全忽略了整个 app.use
函数。 console.log
没有运行,我无法在任何路由中访问 currentUser
。
笑一笑,这是我的全部app.js
:
var createError = require('http-errors');
var express = require('express');
const bodyParser = require('body-parser');
var path = require('path');
const jwt = require('jsonwebtoken');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const mongoose = require('mongoose');
const User = require('./models/user');
const passport = require('passport');
// CHANGE: USE "createStrategy" INSTEAD OF "authenticate"
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
require('mongoose-type-url');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var booksRouter = require('./routes/books');
const app = express();
//connect to database
mongoose.connect(process.env.DATABASE_URL,{
useNewUrlParser:true,useUnifiedTopology:true,useFindAndModify: false,useCreateIndex:true
}).then(() => {
console.log('Connected to Mongo DB');
}).catch(err => {
console.log('Mongoose error: ',err);
});
// view engine setup
app.set('views',path.join(__dirname,'views'));
app.set('view engine','ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(require('express-session')({
secret:"more things in the world",resave: false,saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname,'public')));
//set local variables middleware
app.use(function (req,// 'username':'bob'
// }
// req.user = User.findOne({username: 'bob'});
req.user = User.authenticate()('bob','password');
console.log(req.user);
res.locals.currentUser = req.user;
//set success flash message
res.locals.success = req.session.success || "";
//delete flash message after sending it to the page so it doesn't show again
delete req.session.success;
//set error flash message
res.locals.error = req.session.error || "";
//delete flash message after sending it to the page so it doesn't show again
delete req.session.error;
//continue on to the next function in the middlware/route chain
next();
})
app.use('/',indexRouter);
app.use('/users',usersRouter);
app.use('/books',booksRouter);
if (app.get('env') == 'development'){
require('dotenv').config();
};
app.use(async (req,next) => {
if (req.headers["x-access-token"]) {
const accesstoken = req.headers["x-access-token"];
const { userId,exp } = await jwt.verify(accesstoken,process.env.JWT_SECRET);
// Check if token has expired
if (exp < Date.Now().valueOf() / 1000) {
return res.status(401).json({ error: "JWT token has expired,please login to obtain a new one" });
}
res.locals.loggedInUser = await User.findById(userId); next();
} else {
next();
}
});
// catch 404 and forward to error handler
app.use(function(req,next) {
next(createError(404));
});
// error handler
app.use(function(err,req,next) {
// set locals,only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
let port = process.env.PORT;
if (port == null || port == "") {
port = 8080;
}
app.listen(port,() => {
console.log("server has started,listening on port "+port);
});
module.exports = app;
编辑:免责声明:我在发布此内容时添加了最后一次 User.authenticate
尝试,并假设它不起作用,因为它在文件的其他地方没有起作用。但显然它现在起作用了?然而,无法访问其他路由中的 currentUser
的问题仍然存在,但我至少可以解决这个问题。
解决方法
结果我忘记了 app.use
是中间件(当我在课堂上的一个旧项目中使用它时,它甚至在评论中包含它)。它不会运行,直到实际调用路线(任何路线)。它不像我在发布这篇文章时最初想的那样在服务器启动时运行。
因此,我能够在我需要的路径中很好地访问 req.user
。 res.locals.currentUser
仍然不可用,但我会暂时接受这个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。