我知道有很多类似的问题,我查看了以前提出的问题,并没有解决我的问题。目前我正在开发一个简单的身份验证 Node.js 应用程序(前端使用 react-native,数据库是 MongoDB)。我正在使用以下软件包:
- passport-local-mongoose
- express-session
- passport-local
- passport
这是 app.js 的代码:
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require('cors');
var passport = require('passport');
var user = require('./models/user');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var cookieParser = require('cookie-parser')
var app = express();
app.use(cookieParser('keyboard cat'));
var corsOptions = {
origin: '*',
credentials: true };
app.use(cors(corsOptions))
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
//auth settings
app.use(require("express-session")({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false,
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(user.createStrategy());
passport.serializeUser(user.serializeUser());
passport.deserializeUser(user.deserializeUser());
app.use('/', indexRouter);
app.use('/users', usersRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, 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');
});
module.exports = app;
这里是用户模型:
var mongoose=require('mongoose');
var passportLocalMongoose = require('passport-local-mongoose');
var userShema = new mongoose.Schema({
username : String,
password : String
})
userShema.plugin(passportLocalMongoose);
var user= mongoose.model("User",userShema);
module.exports = user;
这是我的路由文件
var express = require('express');
var router = express.Router();
var user= require("../models/user");
const passport = require('passport');
var isLoggedIn =require('../session');
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
router.post('/login', function(req, res, next) {
passport.authenticate('local' ,function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.send("-1"); }
req.logIn(user, function(err) {
if (err) { return next(err); }
req.session.save(() => res.send("Başarılı"));
});
})(req, res, next);
});
router.post('/signUp', async function(req, res, next) {
try{
console.log('registering user');
user.register(new user({username: req.body.username}), req.body.password, function(err) {
if (err) {
console.log('error while user register!', err);
return next(err);
}
console.log('user registered!');
res.redirect('/');
});
}
catch(e){
console.log(e);
res.status(503).send("-1")
}
});
router.get('/logOut', function(req,res,next){
req.logOut();
res.send("1");
})
router.get('/home',isLoggedIn,function(req,res,next){
res.send("Success");
})
module.exports = router;
最后,这是session.js文件。
const passport = require('passport');
var isLoggedIn =(req,res,next) =>{
if(req.isAuthenticated()){
return next();
}
res.status(403).send("Something went wrong")
}
module.exports = isLoggedIn;
问题出在这里,经过身份验证后(运作良好),React Native 转到主页,我想获取一些用户登录信息。为此我使用 isLoggedIn 函数,该函数使用 req.isAuthenticated() 并始终返回 false。
我尝试过的最常见答案并没有起作用:
1. 确保 session-passport.init-passport.session 行按正确顺序(我的应用程序中已经是这样)。
2. 与问题相关的客户端 get-post 调用(在我的 React Native 应用程序中 -> axios.post(BaseURL+url,data,{ withCredentials: true }),也在服务器应用程序中 -> var corsOptions = {origin: '*',credentials: true};app.use(cors(corsOptions)))。
3. 有人说如果你正在使用 https 协议,你必须设置 {secure:true} (但我没有)。
4. 有人说“身份验证后,passport.js 要求您重新路由/重定向,否则会话不会创建,但很多人也遇到重定向问题。我尝试过它没有解决问题。
5. 有一个人说不要使用 express-session,使用 client-sessions(我尝试过了,没有作用)。
6. 有些人建议更改序列化和反序列化函数(我尝试过网上找到的其他代码,但都没有起作用),但问题是我的反序列化函数从未运行(我认为该函数在 isAuthenticated() 之后运行,并检查 req 上的用户信息,但我的 req 没有那些信息。基本上,我可以登录到应用程序,但它不会在请求中保存我的会话)。
7. 有一个人建议说,“ express-session 尝试延迟重定向,但有些浏览器在重定向之前不等待整个响应。因此,您需要在重定向之前手动保存。”这解决了几乎所有人的问题,但没有解决我的问题。(如您所见,在我的代码中 req.session.save(() => res.send("Başarılı"));)
8. 另外,还有一个人说延迟也可以解决问题(我尝试过了,但没有作用)。
如果有人除了这些之外有其他解决方案,请分享。我接受所有建议。