没有使用 express 和 passport 设置 Cookie
Posted
技术标签:
【中文标题】没有使用 express 和 passport 设置 Cookie【英文标题】:Cookie is not set using express and passport 【发布时间】:2019-10-29 09:49:44 【问题描述】:我花了很长时间试图弄清楚为什么它不起作用。
我正在使用 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);
);
问题是令牌是空的,它没有被设置。
【问题讨论】:
您是否在邮递员或类似工具中验证未设置 cookie 标头? 我现在检查一下,邮递员正在设置它 所以在浏览器中检查,可能是 cookie 的域问题。 【参考方案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'));
之后您可以通过
发送您的 cookieres.cookie('cookie_token', token, maxAge: 900000 )
这样 cookie 将到达,一旦 cookie 到达客户端,您可以使用 document.cookie 或任何其他包(如“js-cookie”)检索 cookie
【讨论】:
究竟哪一部分没用?因为我用chrome在angular和nodejs中测试了这段代码,它可以工作。你能在 chrome 开发控制台中看到 cookie 吗? 我解决了,我按照你的建议做了,我只修改了这段代码:credentials: 'include',
以上是关于没有使用 express 和 passport 设置 Cookie的主要内容,如果未能解决你的问题,请参考以下文章
如何读取通过服务器端 (node-express) 上的 Passport 设置的客户端 (react) cookie?
Express + Passport.js:req.user 未定义
使用 passport.js 和 express.js (node.js) 制作安全的 oauth API
Express、Passport 和 JSON Web 令牌 (jwt) 身份验证
使用 Passport.js、express-session 和 express-mysql-session 进行用户身份验证