Express,Passportjs 持久登录不起作用
Express, Passportjs persistent login not working
我正在使用 Express 和 Passport 登录,但有一个问题:持久登录会话不起作用。
如果我记录 req.isAuthenticated()
它总是 false
。
我正在使用来自 Passport 的 自定义回调
和 fetch
来拨打电话。从 fetch
收到的数据正在运行:{ success: true, user }
.
当我不使用自定义回调(见下文)时,它可以正常工作。
有效
app.post('/login', passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
不工作
app.js
app.use(morgan('tiny'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(express.static(assetPath))
app.use(cookieParser())
app.use(
session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true },
})
)
app.use(passport.initialize())
app.use(passport.session())
routes.js
router.post('/login', (req, res, next) => {
passport.authenticate('local', ({ user, err, message }) => {
if (err) {
return res.send({ user, err, message })
}
if (!user) {
return res.send({ user, err, message })
}
req.login(user, function(err) {
if (err) {
return next(err)
}
return res.send({ success: true, user })
})
})(req, res, next)
})
客户:
fetch(url, {
method: 'POST',
credentials: 'include',
body: JSON.stringify(values),
headers: { 'Content-Type': 'application/json' },
})
默认情况下,持久登录存储在会话中,它使用签名的 cookie 将未来的请求识别为同一会话的一部分。
默认情况下,fetch doesn't send cookies。
您可以通过包含它们来发送 cookie:
fetch(url, {
credentials: 'include'
});
或者您可以使用更现代的身份验证机制,例如 JWT。由你决定。
更新
此外,您在会话中设置了 secure:true
,这是默认设置,也意味着请求必须通过 https 发生,否则 cookie 将被删除。如果您不使用 https,则设置 secure:false
。为获得最佳结果,请将其作为您可以针对生产或开发更改的配置设置,因为您始终希望在生产中使用 https。
我正在使用 Express 和 Passport 登录,但有一个问题:持久登录会话不起作用。
如果我记录 req.isAuthenticated()
它总是 false
。
我正在使用来自 Passport 的 自定义回调
和 fetch
来拨打电话。从 fetch
收到的数据正在运行:{ success: true, user }
.
当我不使用自定义回调(见下文)时,它可以正常工作。
有效
app.post('/login', passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
不工作
app.js
app.use(morgan('tiny'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(express.static(assetPath))
app.use(cookieParser())
app.use(
session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true },
})
)
app.use(passport.initialize())
app.use(passport.session())
routes.js
router.post('/login', (req, res, next) => {
passport.authenticate('local', ({ user, err, message }) => {
if (err) {
return res.send({ user, err, message })
}
if (!user) {
return res.send({ user, err, message })
}
req.login(user, function(err) {
if (err) {
return next(err)
}
return res.send({ success: true, user })
})
})(req, res, next)
})
客户:
fetch(url, {
method: 'POST',
credentials: 'include',
body: JSON.stringify(values),
headers: { 'Content-Type': 'application/json' },
})
默认情况下,持久登录存储在会话中,它使用签名的 cookie 将未来的请求识别为同一会话的一部分。
默认情况下,fetch doesn't send cookies。
您可以通过包含它们来发送 cookie:
fetch(url, {
credentials: 'include'
});
或者您可以使用更现代的身份验证机制,例如 JWT。由你决定。
更新
此外,您在会话中设置了 secure:true
,这是默认设置,也意味着请求必须通过 https 发生,否则 cookie 将被删除。如果您不使用 https,则设置 secure:false
。为获得最佳结果,请将其作为您可以针对生产或开发更改的配置设置,因为您始终希望在生产中使用 https。