【问题标题】:node-express-passport(LocalStrategy)节点快递护照(LocalStrategy)
【发布时间】: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


【解决方案1】:

我用 withCredentials: true, 在角度侧解决它 app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', 'http://localhost:9000'); res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header("Access-Control-Allow-Headers", "Origin, Authorization, X-Requested-With, Content-Type, Accept"); }); 在 app.js 上

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 2014-07-17
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多