【发布时间】: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