我使用 Express 和 Passport 登录,但出现问题:持久登录 session 不起作用。
如果我记录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' },
})
最佳答案
默认情况下,持久登录存储在 session 中, session 使用签名的 cookie 来识别 future 请求作为同一 session 的一部分。
默认情况下,fetch doesn't send cookies .
您可以通过包含它们来发送 cookie:
fetch(url, {
credentials: 'include'
});
或者您可以使用更现代的身份验证机制,例如 JWT。由你决定。
更新
此外,您正在 session 中设置 secure:true
,这是默认设置,也意味着请求必须通过 https 进行,否则 cookie 将被删除。如果您不使用 https,请设置 secure:false
。为了获得最佳结果,请将其设置为可以针对生产或开发进行更改的配置设置,因为您始终希望在生产中使用 https。
关于javascript - Express、Passportjs 持久登录不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44355255/