节点+快速+护照:req.user未定义

问题描述 投票:56回答:21

我的问题是与此类似one,但没有深入了解他的解决方案。

我使用的护照使用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
}
node.js express passport.js
21个回答
38
投票

你有你的应用程序建立的会话状态?你需要像这样...

app.use(session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());

1
投票

一旦你有你的快递会话建立确保你有护照连载和反序列化,在反序列化功能时被产生req.user那。从另一个计算器问题见解释here

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


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

1
投票

当U在客户端使用的HTTP请求,记得附上证书。在Angular2您需要添加选项参数:{withCredentials:真}。在此之后,你将有相同req.sessionID,直到你再次重置。

this._http.get("endpoint/something", { withCredentials: true })

0
投票

如果你的中间件堆栈还不清楚,假设你有会话中间件的地方,你可以保存重定向前会议:

if (req.user) {
    req.session.save(function (err) {
        if (err) {
            // ... panic!
        }
        res.redirect("/user/" + req.user._id);
    });
    return;
}

0
投票

您是否尝试过在你的cookieParser到秘密密钥插入?

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
投票

有完全相同的问题。对我来说,解决方案是使用的,而不是“表达会话”。也许坏会话配置“客户端会话”?

不工作的代码:

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
投票

我有同样的问题,都与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();
})

见,如果你passport.session()后访问req.user,如果不低于添加您的路线。


0
投票

虽然这样做passport.authenticate您可以添加session: true来解决此问题:

app.post("/login", passport.authenticate('local', {
    'failureRedirect': '/login',
    'session': true
}), (req, res)=>{ res.redirect("/"); });

0
投票

我的是从所有这些不同的。我之前已经开发localhost上一个WordPress站点,然后切换到一个单独的节点/项目作出反应。

从WordPress本站的cookie仍然存在,并因为这两个项目在本地主机上运行被发送。这是导致该问题。

我不得不清除localhost上的cookie,然后它的工作。


0
投票

我的两分钱:不工作的代码:

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
投票

当您验证用户,请求值req.user被填满。要知道,如果识别用户和填充值,则使用一个Cookie。如果你像我一样配置与安全cookie的会话,饼干将只提供了HTTPS,这是不是标准配置,让我们说,一个本地开发服务器。有超过HTTP Cookie的工作,注释掉cookie: { secure: true }req.user值将被正确配置:

this.app.use(session({
    resave: true,
    saveUninitialized: true,
    secret: process.env.SESSION_SECRET || "a secret",
    // cookie: { secure: true },
}));

如果合理,你只能在生产想跟HTTPS饼干,你可以这样做:

cookie: { secure: process.env.ENV === 'PRODUCTION' }

48
投票

我的问题尚未指定使用获取的客户端时发送的cookie。它包含证书后的工作:“包括”字段的请求。

fetch('/api/foo', {credentials: 'include'})

0
投票

服务器发送的setcookie头然后在浏览器手柄来存储它,然后该cookie与对Cookie的HTTP头内同一服务器发出的请求发送。

我必须设置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问题。

所以我说这我Express服务器:

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();
  }
});

-1
投票

我有一个不同的问题,一些与bcrypt节点和箭头的功能。

该工作代码:

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

15
投票

我是超级新节点,但它是一个中间件的问题对我来说。新增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);

希望这可以帮助


8
投票

以前我有这些代码(没有工作):

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

现在它的工作原理。


4
投票

没错使会话像@马丁说。但是,如果你使用的是快递4. *版本,中间件像会话没有被绑定,所以你需要单独安装它。

  1. 添加"express-session": "1.4.0"在你的package.json
  2. 翔升安装
  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'}))

欲了解更多信息,请检查express session documentation.


4
投票

我遇到的,因为同样的问题,只是复制和粘贴以下从快车会期文件的代码,但没有完全阅读文档。

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

3
投票

在路线,尝试添加:{session: true}

app.get('/auto-login', passport.authenticate('cross', {session: true}))

3
投票

我只好用快车4此完全相同的问题,并试图几乎一切后,我能找到在线我终于设法得到它的工作,加入“Cookie的会话”。

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

app.use(cookieSession({
  keys: ['key1', 'key2']
}));

1
投票

我的是关于cookies和CORS。我解决了通过添加如下代码到我的服务器:

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();
}};
© www.soinside.com 2019 - 2024. All rights reserved.