Для подсказок посмотрите на имя имени класса, которое выдает ошибку и номер строки, например: Ошибка компиляции [ERROR] \ applications \ xxxxx.java: [44,30] ошибка: не удается найти символ
Еще одна причина - неподдерживаемый метод для java-версии: jdk7 vs 8. Проверьте свой% JAVA_HOME%
У меня была аналогичная проблема. Возможно, это связано с промежуточным программным обеспечением экспресс-сессии, необходимым для паспорта. Исправлено с помощью промежуточных устройств в следующем порядке: (Экспресс 4)
var session = require('express-session');
// required for passport session
app.use(session({
secret: 'secrettexthere',
saveUninitialized: true,
resave: true,
// using store session on MongoDB using express-session + connect
store: new MongoStore({
url: config.urlMongo,
collection: 'sessions'
})
}));
// Init passport authentication
app.use(passport.initialize());
// persistent login sessions
app.use(passport.session());
У меня была та же проблема, забыв добавить
request.login()
в
app.post('/login',
function(request, response, next) {
console.log(request.session)
passport.authenticate('login',
function(err, user, info) {
if(!user){ response.send(info.message);}
else{
request.login(user, function(error) {
if (error) return next(error);
console.log("Request Login supossedly successful.");
return response.send('Login successful');
});
//response.send('Login successful');
}
})(request, response, next);
}
);
. Надеюсь, это может помочь другим, которые оказались здесь той же самой причиной, что и я.
Это также может быть проблемой при вызове POST / GET вашего клиента. У меня была такая же проблема, но оказалось, что я должен был дать fetch
(это то, что я использовал) вариант credentials:'include'
следующим образом:
fetch('/...', {
method: 'POST',
headers: myHeaders,
credentials: 'include',
body: ...
...})
Причина в том, что fetch doesn 't поддерживать передачу файлов cookie, что необходимо в этом случае.
Если вы завершаете свои маршруты следующим образом:
module.exports = function(){
router.get('/',(req,res)=>{
res.send('stuff');
}
}
Вам необходимо передать «приложение и паспорт» на ваши маршруты следующим образом:
module.exports = function(app,passport){
//routes n stuff
}
Я исправил эту проблему, установив мой passport.deserializeUser . Я использую mongo native, и поскольку большинство примеров используют Mongoose, я снова попал в ловушку _id.
Поэтому не забудьте сделать _id Mongo ObjectID при чтении пользователя в deserializeUser
passport.deserializeUser(function(user, done) {
const collection = db.get().collection('users')
const userId = new mongo.ObjectID(user);
collection.findOne({_id : userId}, function(err, user) {
if (err) done(err, null);
done(null, user);
});
});
Мой запрос не нашел пользователя, так как я не сделал идентификатор ObjectID, и никаких ошибок не было указано.
FOR NEWBIES
Я столкнулся с аналогичной проблемой, где моя функция isAuthenticated () вернет false. Я потерял много времени, надеюсь, что этот ответ сохранит ваши.
Some Общие проблемы, которые следует соблюдать,
У меня также была такая же проблема, но @PVThomas дает мне решение, как здесь, в ответах. Моя проблема заключалась в методе findById()
в deserialize()
. Я использовал findOne()
в findById()
, а затем я заменил его на find()
, и теперь req.isAuthenticated()
работает нормально. Мое приложение не сохраняло req.session.passport.user
, оно возвращалось undefined, а затем после замены findOne()
на find()
оно сохраняло идентификатор пользователя в req.session.passport.user
.
Моя проблема заключалась в том, что я установил cookie.secure в true, даже если данные не были превышены https.
app.use(require('express-session')({
secret: process.env.sessionSecret,
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
},
store: store,
resave: false,
saveUninitialized: false,
cookie: { secure: false } // Remember to set this
}));
Не забудьте установить файлы cookie на false, если вы не используете https
cookie: { secure: false } // Set to false
Также, если вы считаете, что https не помните, чтобы доверять прокси
app.set('trust proxy', 1) // trust first proxy
Использовать аутентификацию в приведенном ниже порядке, это будет работать так же, как паспорт хочет экспресс-сессии для isAuthenticated для работы
//======================================installation of utilities======================================//
var express = require("express"),
app = express(),
bodyParser = require("body-parser"),
mongoose = require("mongoose"),
Campsite = require("./models/campsite"),
override = require("method-override"),
Comments = require("./models/comments"),
seedDB = require("./seed"),
User = require("./models/user.js"),
passport = require("passport"),
passportlocal = require("passport-local"),
passportmongoose = require("passport-local-mongoose")
//======================================uitilities setup ==============================================//
app.use(override("_method"))
app.use(bodyParser.urlencoded({ extended: true }))
app.set("view engine","ejs")
seedDB()
app.use(require("express-session")({
secret:"random text input",
resave:false,
saveUninitialized:false
}))
app.use(passport.initialize())
app.use(passport.session())
passport.use(new passportlocal(User.authenticate()))
passport.serializeUser(User.serializeUser())
passport.deserializeUser(User.deserializeUser())
mongoose.connect("mongodb://localhost/yelpCamp")
app.use(function(req, res, next){
res.locals.currentUser = req.user;
next();
});