端点之间不持久的护照身份验证
Passport authentication not persisting between endpoints
我正在编写一个使用 passport.js 进行身份验证的 Express 应用程序,我想利用快速会话,以便在我调用另一个端点时用户保持登录状态。 passport.authenticate 和 req.logIn 都有效,但是当我调用另一个端点时,req.isAuthenticated() returns false 和 req.user 未定义
这是我的护照设置代码:
passport.use(new LocalStrategy(
function(username, password, done) {
db.all("SELECT * from users WHERE username='" + username +"'", function(err, rows) {
if (err != null) {
return done(err);
}
if (rows.length == 0) {
return done(null, false, {message: "No user found"});
}
var row = rows[0]
bcrypt.compare(password, row.password, function(err, res) {
if (err) {
return done(err)
}
if (res) {
return done(null, username)
} else {
return done(null, false, {message: "Incorrect password"})
}
})
})
}
))
passport.serializeUser((username, done) => {
done(null, username);
});
passport.deserializeUser(function(id, done) {
db.all("SELECT * from users WHERE username='" + id + "'", function(err, rows){
if (err != null) {
return done(err)
}
if (rows.length == 0) {
return done(null, false)
}
return done(null, id)
})
})
// add & configure middleware
app.use(session({
store: new SQLiteStore,
secret: my-secret
resave: false,
saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());
这是我的登录端点
app.post('/login', function(req, res) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return res.status(500).json({ err })
}
if (!user) {
return res.status(400).json({
err: info.message
})
}
req.logIn(user, function(err) {
if (err) {
console.log(err)
return res.status(500).json({ err })
}
res.status(200).json({
msg: 'Success'
})
});
})(req, res)
})
那时一切都很好。它输出正确的用户 ID。
然后我调用这个端点:
app.post('/check-log-in', function(req, res, next) {
console.log(req.user)
console.log(req.isAuthenticated())
if (req.user) {
res.status(200).json({
loggedIn: true
})
} else {
res.status(200).json({
loggedIn: false
})
}
})
req.user 未定义且 req.isAuthenicated() returns 错误。
我确定我在某个地方错误地设置了护照,但我查看了示例,甚至查看了另一个项目中的一些代码,这些代码已经运行但似乎没有任何效果。有什么建议吗?
This 回答解决了我的问题。是fetch的问题,所以换成axios
我正在编写一个使用 passport.js 进行身份验证的 Express 应用程序,我想利用快速会话,以便在我调用另一个端点时用户保持登录状态。 passport.authenticate 和 req.logIn 都有效,但是当我调用另一个端点时,req.isAuthenticated() returns false 和 req.user 未定义
这是我的护照设置代码:
passport.use(new LocalStrategy(
function(username, password, done) {
db.all("SELECT * from users WHERE username='" + username +"'", function(err, rows) {
if (err != null) {
return done(err);
}
if (rows.length == 0) {
return done(null, false, {message: "No user found"});
}
var row = rows[0]
bcrypt.compare(password, row.password, function(err, res) {
if (err) {
return done(err)
}
if (res) {
return done(null, username)
} else {
return done(null, false, {message: "Incorrect password"})
}
})
})
}
))
passport.serializeUser((username, done) => {
done(null, username);
});
passport.deserializeUser(function(id, done) {
db.all("SELECT * from users WHERE username='" + id + "'", function(err, rows){
if (err != null) {
return done(err)
}
if (rows.length == 0) {
return done(null, false)
}
return done(null, id)
})
})
// add & configure middleware
app.use(session({
store: new SQLiteStore,
secret: my-secret
resave: false,
saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());
这是我的登录端点
app.post('/login', function(req, res) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return res.status(500).json({ err })
}
if (!user) {
return res.status(400).json({
err: info.message
})
}
req.logIn(user, function(err) {
if (err) {
console.log(err)
return res.status(500).json({ err })
}
res.status(200).json({
msg: 'Success'
})
});
})(req, res)
})
那时一切都很好。它输出正确的用户 ID。
然后我调用这个端点:
app.post('/check-log-in', function(req, res, next) {
console.log(req.user)
console.log(req.isAuthenticated())
if (req.user) {
res.status(200).json({
loggedIn: true
})
} else {
res.status(200).json({
loggedIn: false
})
}
})
req.user 未定义且 req.isAuthenicated() returns 错误。
我确定我在某个地方错误地设置了护照,但我查看了示例,甚至查看了另一个项目中的一些代码,这些代码已经运行但似乎没有任何效果。有什么建议吗?
This 回答解决了我的问题。是fetch的问题,所以换成axios