Passport 在我的数据库中创建多个 session

Passport create multi session in my database

我在使用由 sailsJS 制作的 API 时遇到了一个奇怪的情况。

所以当我使用 postman 登录时,passport 在数据库中创建一个 session,一切正常。

但是当我使用 Angular2 制作的应用程序并对我的 API 执行相同的请求时,护照在我的数据库中生成许多 sessions …

这是我的代码: 登录-SailsJS

  login: (req, res) => {
    passport.authenticate('local', (err, user, info) => {
      if ((err) || (!user)) {
        return res.send({
          message: info.message,
          user: user
        });
      }
      req.logIn(user, function(err) {
        if (err) res.send(err);
        return res.send({
          message: info.message,
          user: user
        });
      });

    })(req, res);
  },

PassPort 会议 - SailsJS

function findById(id, fn) {
  User.findOne(id).then(function (user) {
    if (!user) return fn("User Not Found", null) ;
    return fn(null, user);
  }).catch(function(err) {
    console.log("err",err) ;
    return fn(err, null);
  });
}

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

passport.deserializeUser( (id, done) => {
  findById(id, function (err, user) {
    if (err)
      user = null;
    return done(err, user);
  });
});

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
  },
  function (email, password, done) {

    User.findOne({email: email}, (err, user) => {
      if (err) {
        return done(err);
      }
      if (!user) {
        return done(null, false, {message: 'Incorrect email.'});
      }

      bcrypt.compare(password, user.password, (err, res) => {
        if (!res)
          return done(null, false, {
            message: 'Invalid Password'
          });
        let returnUser = {
          id: user.id,
          email: user.email
        };
        return done(null, returnUser, {
          message: 'Logged In Successfully'
        });
      });
    });
  }

调用 api - Angular2

private _headers = new Headers();
private _options = new RequestOptions({
  headers: this._headers,
  withCredentials: true
});
login(email, password): Observable < any > {
  return this._http
    .post(this._url + 'login', {
      email: email,
      password: password
    }, this._options)
    .map(
      (res: any) => {
        let user = JSON.parse(res._body).user;
        if (user) {
          this.isLogged = true;
          localStorage.setItem('User', JSON.stringify(user));
          return true;
        } else {
          return false;
        }
      }
    )
}

我最终在我的快速会话配置中将 "saveUninitialized" 添加为 false。

此参数设置为 true 会强制将 "uninitialized" 的会话保存到商店。 Documentation

所以现在,只要 req.session 没有被 passport 更新,会话就不会被存储。