Javascript Express,Passportjs永久登录不工作
我正在使用Express和Passport登录,但存在一个问题:持续登录会话不起作用 如果我记录Javascript Express,Passportjs永久登录不工作,javascript,node.js,express,passport.js,fetch-api,Javascript,Node.js,Express,Passport.js,Fetch Api,我正在使用Express和Passport登录,但存在一个问题:持续登录会话不起作用 如果我记录req.isAuthenticated()它总是false 我正在使用来自的自定义回调 和fetch进行调用。从fetch接收的数据正在工作:{success:true,user} 当我不使用自定义回调(见下文)时,它工作正常 有效 app.post('/login', passport.authenticate('local', { successRedirect: '/',
req.isAuthenticated()
它总是false
我正在使用来自的自定义回调
和fetch
进行调用。从fetch
接收的数据正在工作:{success:true,user}
当我不使用自定义回调(见下文)时,它工作正常
有效
app.post('/login', passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
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())
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)
})
不工作
app.js
app.post('/login', passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
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())
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)
})
routes.js
app.post('/login', passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
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())
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将未来请求标识为同一会话的一部分 也是默认情况下 您可以通过以下方式发送cookie:
fetch(url, {
credentials: 'include'
});
或者可以使用更现代的身份验证机制,如JWTs。由你决定
更新
此外,您正在会话上设置
secure:true
,这是默认设置,也意味着请求必须通过https进行,否则cookie将被删除。如果您没有使用https,请设置secure:false
。为了获得最佳效果,请设置一个可以为生产或开发更改的配置设置,因为您总是希望在生产中使用https。默认情况下,持久登录存储在会话中,该会话使用签名cookie将未来的请求标识为同一会话的一部分
也是默认情况下
您可以通过以下方式发送cookie:
fetch(url, {
credentials: 'include'
});
或者可以使用更现代的身份验证机制,如JWTs。由你决定
更新
此外,您正在会话上设置
secure:true
,这是默认设置,也意味着请求必须通过https进行,否则cookie将被删除。如果您没有使用https,请设置secure:false
。为了获得最佳效果,请设置一个您可以为生产或开发更改的配置设置,因为您总是希望在生产中使用https。谢谢您,Paul,我添加了您的代码,但仍然存在问题:/更新了关于你当前代码的其他内容。Paul非常感谢你抽出时间。它现在似乎可以工作了,但是为什么没有自定义回调就可以工作呢?我不知道我是否理解。您停止使用自定义回调了吗?或者你的意思是当你按照我的建议更改cookie参数时?谢谢你,Paul,我添加了你的代码,但仍然存在问题:/更新了关于你当前代码的其他内容。Paul非常感谢你抽出时间。它现在似乎可以工作了,但是为什么没有自定义回调就可以工作呢?我不知道我是否理解。您停止使用自定义回调了吗?或者你是说当你按照我的建议更改cookie参数时?