Узел + Экспресс + паспорт: Неопределенный req.user

Мой вопрос подобен этому, но не было никакого понимания его решения.

Я использую паспорт для автора, использующего 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
}

62
задан 23 May 2017 в 15:02

20 ответов

У меня были другой вопрос, что-то с функциями стрелки и 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);
};
-1
ответ дан 31 October 2019 в 13:47

Сервер отправляет заголовку 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();
  }
});
0
ответ дан 31 October 2019 в 13:47

При аутентификации пользователя значение запроса 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' }
0
ответ дан 31 October 2019 в 13:47

Мои два цента: не рабочий код:

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
  }
})
);
0
ответ дан 31 October 2019 в 13:47

При выполнении passport.authenticate можно добавить session: true для решения вопроса:

app.post("/login", passport.authenticate('local', {
    'failureRedirect': '/login',
    'session': true
}), (req, res)=>{ res.redirect("/"); });
0
ответ дан 31 October 2019 в 13:47

У меня были та же проблема, оба с 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(), если не добавляют Ваш маршрут ниже.

0
ответ дан 31 October 2019 в 13:47

Имел точно ту же проблему. Для меня решение состояло в том, чтобы использовать "клиентские сессии" вместо 'специальной сессии". Вероятно, плохая конфигурация сессий?

Не рабочий код:

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,
    }));
0
ответ дан 31 October 2019 в 13:47

Вы попытались вставить в 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());
0
ответ дан 31 October 2019 в 13:47

Мой отличался от всех они. Я ранее разрабатывал на localhost сайт Wordpress и затем переключился на отдельный проект Узла/Реагировать.

cookie от сайта Wordpress все еще присутствовал и отправляемый, так как оба проекта работали на localhost. Это вызывало проблему.

я должен был очистить cookie для localhost, и затем он работал.

1
ответ дан 31 October 2019 в 13:47

После того как у Вас есть своя специальная установка сессии, удостоверяются, что у Вас есть паспорт, сериализируют & десериализуйте, в десериализовывать функции именно тогда сгенерирован req.user. Посмотрите объяснение здесь от другого stackoverflow вопроса.

passport.serializeUser(function(user, done) {
 done(null, user);
});


passport.deserializeUser(function(user, done) {
 done(null, user);
});
1
ответ дан 31 October 2019 в 13:47

Мой был о 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();
}};
1
ответ дан 31 October 2019 в 13:47

Я встречаюсь с той же проблемой из-за просто копии & вставка после кода из документации специальной сессии, но не полностью читает документацию.

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
}))
4
ответ дан 31 October 2019 в 13:47

Ранее я имею, они кодируют (не работал):

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')));

и теперь это работает.

8
ответ дан 31 October 2019 в 13:47

Моя проблема не указывала для отправки cookie при использовании выборки на клиентском. Это работало после включая учетные данные: 'включайте' поле в запрос.

fetch('/api/foo', {credentials: 'include'})
49
ответ дан 31 October 2019 в 13:47

Когда запрос HTTP использования u на стороне клиента, не забудьте присоединять учетные данные. В Angular2 необходимо добавить аргумент опции: {withCredentials: верный}. После этого у Вас будет тот же req.sessionID, пока Вы не сбросите его снова.

this._http.get("endpoint/something", { withCredentials: true })
1
ответ дан 31 October 2019 в 13:47

У меня была эта точно та же самая проблема с помощью специальных 4 и после попытки в значительной степени всего, что я мог найти онлайн, что мне наконец удалось получить ее работающий путем добавления 'сессии cookie'.

var cookieSession = require('cookie-session');

app.use(cookieSession({
  keys: ['key1', 'key2']
}));
3
ответ дан 31 October 2019 в 13:47

Если Ваша стопка промежуточного программного обеспечения неясна, предполагая, что у Вас есть промежуточное программное обеспечение сессии где-нибудь , можно сохранить сессию перед перенаправлением:

if (req.user) {
    req.session.save(function (err) {
        if (err) {
            // ... panic!
        }
        res.redirect("/user/" + req.user._id);
    });
    return;
}
0
ответ дан 31 October 2019 в 13:47

Да включите сессии как @Martin, говорит. Но если Вы используете Экспресс 4.* версия, промежуточное программное обеспечение как сессии не связывается так, необходимо установить его индивидуально.

  1. Добавляют "специальная сессия": "1.4.0" в Вашей установке package.json
  2. npm
  3. использование это

;

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'}))

Для получения дополнительной информации проверяют специальная документация сессии.

4
ответ дан 31 October 2019 в 13:47

В маршрутах попытайтесь добавить: {session: true}

app.get('/auto-login', passport.authenticate('cross', {session: true}))
3
ответ дан 31 October 2019 в 13:47

Я супер плохо знаком с Узлом, но это была проблема промежуточного программного обеспечения для меня. Добавленный 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 это помогает

15
ответ дан 31 October 2019 в 13:47

Другие вопросы по тегам:

Похожие вопросы: