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 更新,会话就不会被存储。
我在使用由 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 更新,会话就不会被存储。