Мой вопрос подобен этому, но не было никакого понимания его решения.
Я использую паспорт для автора, использующего Instagram. После успешного автора пользователи направлены к "/". На данном этапе запрос имеет пользовательский объект (иначе, он работает). Однако, после того как я перенаправляю, req.user не определен.:'(
Нечетная часть - то, что passport.deserializeUser называют с каждым запросом. Это успешно получает пользовательский объект, но где-нибудь вдоль дороги промежуточного программного обеспечения, req.user не устанавливается (или сброшенной).
// on successful auth, goto "/"
app.get('/', function(req, res) {
// if the request has the user object, go to the user page
if (req.user) {
res.redirect("/user/" + req.user._id);
}
res.render("index");
}
app.get('/user/:uid', function(req, res) {
console.log(req.user) // undefined
}
У меня были другой вопрос, что-то с функциями стрелки и bcrpt-узлом.
Код, который работает:
userSchema.methods.generateHash = function (password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
userSchema.methods.isValidPassword = function (password) {
return bcrypt.compareSync(password, this.password);
};
Код, который не работает:
userSchema.methods.generateHash = (password) => {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
userSchema.methods.isValidPassword = (password) => {
return bcrypt.compareSync(password, this.password);
};
Сервер отправляет заголовку SetCookie затем дескриптор браузера для хранения его, и затем cookie отправляется с запросами, выполненными к тому же серверу в HTTP-заголовке Cookie.
я должен был установить withCredentials: верный в моем клиенте. (axios.js)
const config = {
withCredentials: true,
headers: {
'Content-Type': 'application/json',
},
};
axios.put(url, { page: '123' }, config)
.then(res => console.log('axios', res))
.catch(err => console.log('axios', err));
Затем проблемы CORS происходят.
, Таким образом, я добавил это к своему специальному серверу:
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
if ('OPTIONS' == req.method) {
res.send(200);
} else {
next();
}
});
При аутентификации пользователя значение запроса req.user
заполнено. Знать, используется ли идентифицирование пользователя и заливки, которые оценивают, cookie. Как я, при конфигурировании сессии с защищенными cookie cookie будут доступны только более чем HTTPS
, который не является стандартной конфигурацией для, скажем, локальный сервер разработки. Чтобы иметь работу cookie более чем HTTP
, прокомментируйте cookie: { secure: true }
и req.user
, значение будет правильно настроено:
this.app.use(session({
resave: true,
saveUninitialized: true,
secret: process.env.SESSION_SECRET || "a secret",
// cookie: { secure: true },
}));
, Если, обоснованно, Вы хотите cookie более чем HTTPS
только в производстве, можно сделать что-то как:
cookie: { secure: process.env.ENV === 'PRODUCTION' }
Мои два цента: не рабочий код:
server.use(
session({
secret: "secretsssss",
rolling: false,
resave: false,
saveUninitialized: false,
cookie: {
sameSite: true, //this line
maxAge: 60 * 60 * 1000
}
})
);
рабочий код:
server.use(
session({
secret: "secretsssss",
rolling: false,
resave: false,
saveUninitialized: false,
cookie: {
sameSite: false, // i think this is default to false
maxAge: 60 * 60 * 1000
}
})
);
При выполнении passport.authenticate
можно добавить session: true
для решения вопроса:
app.post("/login", passport.authenticate('local', {
'failureRedirect': '/login',
'session': true
}), (req, res)=>{ res.redirect("/"); });
У меня были та же проблема, оба с req.isAuthenticated () и req.user, вот то, как я решил
req.isAuthenticated () разрешенный путем замены findOne () с находкой () в findById (), метод внутри десериализовывает (), затем я мог сохранить аутентифицируемый req, еще это ничего не возвращало.
req.user, разрешенный путем корректировки порядка, первая специальная сессия, должен быть сохранен затем, паспорт должен быть инициализирован затем следующее хранилище сессии в passport.session (), и после этого мы можем получить доступ к req.user, после сохранения сессии в passport.session ()
app.use(session(...));
app.use(passport.initialize());
app.use(passport.session());
// Now we can access req.user so after we will call req.user, if we write it above these, it will always return underfined
app.use(function(req, res, next){
res.locals.user = req.user || null
next();
})
Видят, если Вы получаете доступ к req.user после passport.session()
, если не добавляют Ваш маршрут ниже.
Имел точно ту же проблему. Для меня решение состояло в том, чтобы использовать "клиентские сессии" вместо 'специальной сессии". Вероятно, плохая конфигурация сессий?
Не рабочий код:
var session = require('express-session');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(session({
secret: 'random string',
resave: true,
saveUninitialized: true,
cookie: { secure: true }
}));
Рабочий код:
var session = require('client-sessions');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(session({
cookieName: 'session',
secret: 'random string',
duration: 30 * 60 * 1000,
activeDuration: 5 * 60 * 1000,
}));
Вы попытались вставить в cookieParser свой secretKey?
var passport = require('passport');
var expressSession = require('express-session');
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('mySecretKey'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressSession({
secret: 'mySecretKey',
resave: false,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
Мой отличался от всех они. Я ранее разрабатывал на localhost сайт Wordpress и затем переключился на отдельный проект Узла/Реагировать.
cookie от сайта Wordpress все еще присутствовал и отправляемый, так как оба проекта работали на localhost. Это вызывало проблему.
я должен был очистить cookie для localhost, и затем он работал.
После того как у Вас есть своя специальная установка сессии, удостоверяются, что у Вас есть паспорт, сериализируют & десериализуйте, в десериализовывать функции именно тогда сгенерирован req.user. Посмотрите объяснение здесь от другого stackoverflow вопроса.
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
Мой был о cookie & труп. Я решил путем добавления после кода к моему серверу:
allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', 'http://localhost:3000'); // your website
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
if ('OPTIONS' === req.method) {
res.send(200);
} else {
next();
}};
Я встречаюсь с той же проблемой из-за просто копии & вставка после кода из документации специальной сессии, но не полностью читает документацию.
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}))
В документации, это упомянуло:
Однако это требует https-поддерживающего веб-сайта, т.е. HTTPS необходим для защищенных cookie. Если безопасный установлен, и Вы получаете доступ к своему сайту по HTTP, cookie не будет установлен.
поэтому, если у Вас просто есть HTTP-соединение, удалите безопасную опцию, и ниже кода должен работать:
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
//cookie: { secure: true } remove this line for HTTP connection
}))
Ранее я имею, они кодируют (не работал):
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('abcdefg'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret: 'abcdefg',
resave: true,
saveUninitialized: false,
cookie: { secure: true } // this line
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
Затем я удаляю опцию cookie из инициализатора сессии:
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('abcdefg'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret: 'abcdefg',
resave: true,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
и теперь это работает.
Моя проблема не указывала для отправки cookie при использовании выборки на клиентском. Это работало после включая учетные данные: 'включайте' поле в запрос.
fetch('/api/foo', {credentials: 'include'})
Когда запрос HTTP использования u на стороне клиента, не забудьте присоединять учетные данные. В Angular2 необходимо добавить аргумент опции: {withCredentials: верный}. После этого у Вас будет тот же req.sessionID, пока Вы не сбросите его снова.
this._http.get("endpoint/something", { withCredentials: true })
У меня была эта точно та же самая проблема с помощью специальных 4 и после попытки в значительной степени всего, что я мог найти онлайн, что мне наконец удалось получить ее работающий путем добавления 'сессии cookie'.
var cookieSession = require('cookie-session');
app.use(cookieSession({
keys: ['key1', 'key2']
}));
Если Ваша стопка промежуточного программного обеспечения неясна, предполагая, что у Вас есть промежуточное программное обеспечение сессии где-нибудь , можно сохранить сессию перед перенаправлением:
if (req.user) {
req.session.save(function (err) {
if (err) {
// ... panic!
}
res.redirect("/user/" + req.user._id);
});
return;
}
Да включите сессии как @Martin, говорит. Но если Вы используете Экспресс 4.* версия, промежуточное программное обеспечение как сессии не связывается так, необходимо установить его индивидуально.
;
var express = require('express');
var cookieParser = require('cookie-parser')
var session = require('express-session')
var app = express()
app.use(cookieParser()) // required before session.
app.use(session({secret: 'keyboard cat'}))
Для получения дополнительной информации проверяют специальная документация сессии.
В маршрутах попытайтесь добавить: {session: true}
app.get('/auto-login', passport.authenticate('cross', {session: true}))
Я супер плохо знаком с Узлом, но это была проблема промежуточного программного обеспечения для меня. Добавленный bodyParser и перестроенный для фиксации.
Взломанный код:
app.use(express.cookieParser('secret'));
app.use(express.cookieSession());
app.use(express.session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
Рабочий Код:
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
Hope это помогает