我花了很长时间试图弄清楚为什么它不起作用。
我正在使用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生成了令牌并将其保存在令牌中
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);
});
问题是令牌为空,没有设置。
答案 0 :(得分:1)
事物的结合。在您的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