Cookie 未使用快递和护照设置
Cookie is not set using express and passport
我花了很长时间试图弄清楚为什么它不起作用。
我正在使用 React 实现登录页面。
此页面使用 axios 发送用户并传递到后端(nodejs + express):
const login = useCallback(e => {
e.preventDefault()
fetch(process.env.REACT_APP_HOST + '/login', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: e.target.elements.username.value,
password: e.target.elements.password.value
})
})
.then(response => {
if (response.ok) {
return response.json()
} else if (response.status === 401) {
throw new Error('Invalid user or pass.')
} else {
throw new Error('An error ocurred')
}
...
})
}, [])
在后端,我有一个接收这些数据并检查 ldap 系统的路由。所以我使用 JWT 生成一个令牌并将其保存在 token
const express = require('express'),
passport = require('passport'),
bodyParser = require('body-parser'),
jwt = require('jsonwebtoken'),
cors = require('cors')
cookieParser = require('cookie-parser')
LdapStrategy = require('passport-ldapauth');
let app = express();
app.use(cookieParser())
app.use(cors());
....
app.post('/login', function (req, res, next) {
passport.authenticate('ldapauth', { session: false }, function (err, user, info) {
const token = jwt.sign(user, env.authSecret)
res.cookie('cookie_token', token) //it doesn't set the cookie
if (err) {
return next(err)
}
if (!user) {
res.sendStatus(401)
} else {
return res.status(200).send({ firstName: user.givenName});
}
})(req, res, next);
});
问题是令牌是空的,没有被设置。
几件事。在你的 react fetch post 方法中你需要添加
withCredentials: true,
在 httpheader 旁边。
fetch(process.env.REACT_APP_HOST + '/login', {
method: 'POST',
withCredentials: true,
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: e.target.elements.username.value,
password: e.target.elements.password.value
})
})
在那之后,在你的 nodejs 部分你使用 cors 但验证所有来源。那不适用于凭据。您需要像这样使用 cors 来验证特定来源并将凭据转换为 true-
app.use(cors({credentials: true, origin: 'http://localhost:4200'}));
之后您可以通过
发送您的 cookie
res.cookie('cookie_token', token, { maxAge: 900000 })
这样 cookie 就会到达,一旦 cookie 到达客户端,您就可以使用 document.cookie 或任何其他包(如 "js-cookie"
检索 cookie
我花了很长时间试图弄清楚为什么它不起作用。
我正在使用 React 实现登录页面。 此页面使用 axios 发送用户并传递到后端(nodejs + express):
const login = useCallback(e => {
e.preventDefault()
fetch(process.env.REACT_APP_HOST + '/login', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: e.target.elements.username.value,
password: e.target.elements.password.value
})
})
.then(response => {
if (response.ok) {
return response.json()
} else if (response.status === 401) {
throw new Error('Invalid user or pass.')
} else {
throw new Error('An error ocurred')
}
...
})
}, [])
在后端,我有一个接收这些数据并检查 ldap 系统的路由。所以我使用 JWT 生成一个令牌并将其保存在 token
const express = require('express'),
passport = require('passport'),
bodyParser = require('body-parser'),
jwt = require('jsonwebtoken'),
cors = require('cors')
cookieParser = require('cookie-parser')
LdapStrategy = require('passport-ldapauth');
let app = express();
app.use(cookieParser())
app.use(cors());
....
app.post('/login', function (req, res, next) {
passport.authenticate('ldapauth', { session: false }, function (err, user, info) {
const token = jwt.sign(user, env.authSecret)
res.cookie('cookie_token', token) //it doesn't set the cookie
if (err) {
return next(err)
}
if (!user) {
res.sendStatus(401)
} else {
return res.status(200).send({ firstName: user.givenName});
}
})(req, res, next);
});
问题是令牌是空的,没有被设置。
几件事。在你的 react fetch post 方法中你需要添加
withCredentials: true,
在 httpheader 旁边。
fetch(process.env.REACT_APP_HOST + '/login', {
method: 'POST',
withCredentials: true,
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: e.target.elements.username.value,
password: e.target.elements.password.value
})
})
在那之后,在你的 nodejs 部分你使用 cors 但验证所有来源。那不适用于凭据。您需要像这样使用 cors 来验证特定来源并将凭据转换为 true-
app.use(cors({credentials: true, origin: 'http://localhost:4200'}));
之后您可以通过
发送您的 cookieres.cookie('cookie_token', token, { maxAge: 900000 })
这样 cookie 就会到达,一旦 cookie 到达客户端,您就可以使用 document.cookie 或任何其他包(如 "js-cookie"
检索 cookie