【发布时间】:2016-11-20 01:36:31
【问题描述】:
我使用带本地护照的护照进行 mongoDB 登录。
passport.use('local-login', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback : true
},
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
console.log(user);
console.log(req.session);
console.log(req.session.passport);
return done(null, user);
});
}
));
还有 POST 调用
router.post('/login', passport.authenticate('local-login'), function(req, res) {
res.json(req.user);
});
当我从 Angular 会话进行 POST 调用时,没有得到保存。这是我在有角度的 POST 请求后来自服务器的 console.log:
-------user---------
{ _id: 5782f005917d7fa01b27adba,
username: 'asd',
password: 'asd',
__v: 0,
roles: [ 'user' ] }
-------req.session---------
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: false } }
-------req.session.passport---------
undefined
----------------
serializeUser: 5782f005917d7fa01b27adba
我也用邮递员对其进行了测试,它似乎正在工作。登录后的用户出现在会话中:
-------req.session---------
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: false },
passport: { user: '5782f005917d7fa01b27adba' } }
-------req.session.passport---------
{ user: '5782f005917d7fa01b27adba' }
我的配置是:
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(session({
secret: 'brucespringsteinmegaboss',
resave: true,
saveUninitialized: true,
cookie: {
secure: false
} }));
app.use(passport.initialize());
app.use(passport.session());
包装:
"body-parser": "^1.15.2",
"express": "^4.14.0",
"express-session": "^1.14.0",
"mongoose": "^4.5.3",
"passport": "^0.3.2",
"passport-local": "^1.0.0"
npm:3.9.6 节点:6.2.2
角度调用:
$scope.login = function(form, user) {
if (form.$valid) {
$http.post('http://localhost:3000/api/auth/local/login', user)
.success(function(resp){
$rootScope.currentUser = user;
console.log($rootScope.currentUser);
});
}
};
如果有人解释这个问题,我将不胜感激。
【问题讨论】:
-
我怀疑
req.session.passport在您记录它的位置是否可用于新会话。我认为它被显示为 Postman 调用的原因是因为它是为 previous 调用设置的。我的猜测是您正在尝试调试另一个问题,即在登录后进行 Angular $http 调用时会话似乎不存在。 -
如果我在路由中分配一个类似 isAuth 的响应,使用邮递员我可以接收例如 true 或 false 如果用户是否经过身份验证(如果用户存在于会话中或不存在)。当我使用 Angular 时,每个请求都会返回 false,因为会话没有被存储。如果我使用不同的用户,那么角度不起作用而邮递员起作用。
-
这个问题很可能是因为您的 cookie 是
httpOnly,这意味着当您进行 AJAX 调用时(默认情况下)不会发送 cookie。查看$http的文档,特别是withCredentials选项。 -
我尝试添加一条新路线,只是为了检查用户是否在会话中,并且仍然是邮递员工作并且没有角度。 {username: 'xxx', password: 'xxx'}的简单帖子
-
@robertklep 我修改会话:
app.use(session({ secret: 'iloveponys', resave: true, saveUninitialized: true, cookie: { secure: false, httpOnly: false } }));
标签: session express passport-local