【问题标题】:Passport.js is not storing/sending passport user infoPassport.js 不存储/发送护照用户信息
【发布时间】:2017-07-15 20:36:48
【问题描述】:

所以我正在尝试使用 node.js、passport.js 和 angular2 构建一个简单的登录/授权工具。我当前的问题是,虽然用户可以登录,但会话信息似乎没有传递给前端服务器,或者前端服务器没有将护照信息传递回来。

登录时,用户似乎一直到达调用 res.send 的部分,此时已调用 serialize 并设置了 req.sessions.passport.user;但是,当用户尝试访问授权页面时,当 cookie 存在时,护照就会丢失。虽然 Deserialized 也从未被调用,但中间件被调用/似乎被调用。当中间件到达反序列化器时,没有附加护照/用户,因此永远不会调用反序列化。

此时我想知道这是否可能是 CORS 问题或 angular2 的问题,但我已经为此工作了几天,并且似乎正在按照建议的方式进行操作。我也尝试过重建它并以多种方式设置 CORS 以及中间件,但我的想法已经不多了。我也在使用快速会话,但这似乎可以正常工作,因为我在其中创建的 cookie 存在。

身份验证结束但响应站点之前的会话数据 会议 { 曲奇饼: { 小路: '/', _expires:空, 原始最大年龄:空, httpOnly:是的, 安全:假}, 护照: {用户: 匿名的 { 用户名:'测试', 哈希:'4024ca40c4372e029459a1d2d52a25b2fc4642f980f6cc948cc4b35f6350adde', } } }

发出进一步请求后的会话数据 会议 { 曲奇饼: { 小路: '/', _expires:空, 原始最大年龄:空, httpOnly:是的, 安全:假} }

相关代码: Passport.js

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

passport.deserializeUser((users, done) => {
  var id=users.username;
  db.one('select * from users where username = $1', id)
  .then((user) => {
    done(null, user);
  })
  .catch((err) => { done(err,null); });

});

local.js

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const init = require('./passport');
var promise = require('bluebird'); 
var options = {
 // Initialization Options
 promiseLib: promise
};

var hashclient = require('hashapi-lib-node');
const crypto = require('crypto');
var hash = crypto.createHash('sha256');
var pgp = require('pg-promise')(options);
var connectionString = 'postgresql://...';
var db = pgp(connectionString);
const optionsPassport = {};
init();

passport.use(new LocalStrategy(optionsPassport, (username, password, done) => {
 db.one('select * from users where username = $1', username)
 .then((user) => {
   hash.update(password);
   var encryptedPassword=hash.digest('hex');
   hash = crypto.createHash('sha256');
  if (!user) return done(null, false, { message: 'Incorrect username.' });
  if (encryptedPassword!=user.password) {
   return done(null, false, { message: 'Incorrect information.' });
  } else { 
     return done(null, user);
    }
 })
.catch((err) => { return done(err); });
}));

helpers.js

function loginRequired(req, res, next) {
  if (!req.user) return res.status(401).json({status: 'Please log in'});
  return next();
}

Router.js 示例

const users = require('express').Router();
const auth = require('./auth');
const update = require('./update');
const password = require('./password');
const authHelpers = require('./helpers');
const passport = require('./local');

users.post('/update',  authHelpers.loginRequired, update);
users.get('/:userId',  authHelpers.loginRequired, single);
users.post('/create',   create);
users.post('/auth', passport.authenticate('local'), auth);

app.js

var passport = require('passport');
app.use(cookieParser())
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
  secret: 'X+a1+TKXwd26mkiUUwqzqQ==',
  resave:true,
  saveUninitialized:true,
  cookie:{secure:false}
}));
app.use(passport.initialize());
app.use(passport.session());


app.use(function (req, res, next) {
    var allowedOrigins = ['http://localhost:3000']
    res.header('Access-Control-Allow-Origin', allowedOrigins);
    res.header( 'Access-Control-Allow-Headers', 'withCredentials, Access-Control-Allow-Headers, Origin, X-Requested-With, X-AUTHENTICATION, X-IP, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers');
    res.header( 'Access-Control-Allow-Methods', 'GET, OPTIONS, HEAD, POST, PUT, DELETE');
    res.header( 'Access-Control-Allow-Credentials', true);

    next();
  });

var routes = require('./routes');
app.use('/', routes);

前端http服务

getData (url:string, data:any): Observable<any>  {
 var headers = new Headers({ 'Content-Type': 'application/json', withCredentials: true  });
 var options = new RequestOptions({ headers: headers });
 return this.http.get(url,options)
                 .map((res: Response): data => res.json())
                 .catch(this.handleError);
}

【问题讨论】:

  • promiseLib:promise 属于错误的类别。
  • 我加倍检查,但根据github.com/vitaly-t/pg-promise#initialization-options 它似乎是 postgres 的正确类别?
  • 是否有强制执行该规则的完整性约束?全部发布。
  • 如果我回答您的问题有误,请告诉我,我会在上面发布。但是对 postgres 数据库没有特定的限制。它是一个基本表,主要由少量 VARCHAR、两个布尔值和一个 Date 对象组成。并且会话应该使用内存存储?
  • 会话非常糟糕,您可能在某处发生内存泄漏和被盗会话,并且永远不要使用 VARCHAR,只能使用 VARCHAR2 或 NVARCHAR。

标签: node.js angular session cors passport.js


【解决方案1】:

问题出在前端,我没有在正确的位置将 withCredentials 设置为 true

    var options = new RequestOptions({ headers: headers, withCredentials: true   });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 2012-05-26
    • 2018-10-20
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多