【发布时间】:2021-10-10 21:07:08
【问题描述】:
经过大量研究,我仍然无法找出问题所在。所以也许你们中的一些人可以提供帮助。 我正在使用 React 和 node(express) 开发应用程序并尝试使用 jwt 进行身份验证
你应该知道的事情:
1- 我的 API 在 localhost:3000 上,React 应用程序在 localhost:3001 上运行
2- 我将 jwt 存储在 httpOnly cookie 中并将其发送到前端
//express api
const app = express()
app.use(express.json());
app.use(cookieParser());
app.use(cors({
origin: 'http://localhost:3001',
credentials: true
}));
//in login route
db.get('users').findOne({email: email})
.then(user => {
const token = jsonwebtoken.sign({id: user._id}, 'privateKey', { expiresIn: 300});
res.cookie('token', token, { httpOnly: true });
res.json({user: user})
3- 在 React 中,我在 package.json 中将代理设置为 API 地址:
//package.json
"proxy": "http://localhost:3000"
我在登录时收到此响应标头
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:3001
Connection: keep-alive
Content-Length: 185
Content-Type: application/json; charset=utf-8
Date: Thu, 05 Aug 2021 21:10:51 GMT
ETag: W/"b9-zncj/54sydwZElLyuciFm6QMQEQ"
Keep-Alive: timeout=5
Set-Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYwMzQwM2IyMzJiYjVhMDNjODE1ZWQ3MyIsImlhdCI6MTYyODE5Nzg1MSwiZXhwIjoxNjI4MTk4MTUxfQ.8SJ3u9HWFdPyJctxGGToNPu52OPkmYMd_kGIRbUKOdQ; Path=/; HttpOnly
Vary: Origin
X-Powered-By: Express
4- 我想在用户尝试发布某些内容时检查 jwt(博客文章)
来自 REact 的请求如下所示:
fetch("/post", {
method: "post",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({userId: userId, username:username, title: title, body: body, tags: tags }),
credentials: 'include'
})
5- 我在后端检查它是这样的:
const jsonwebtoken = require('jsonwebtoken');
jsonwebtoken.verify(req.cookies.token, 'privateKey', function(err, decoded) {
if(err){
res.json(err)
}else{
next();
}
作为对浏览器请求的响应,我得到了这个:
{"name":"JsonWebTokenError","message":"jwt must be provided"}
我觉得我错过了一些小东西,但我不知道。这是我第一次使用cookies。任何帮助将不胜感激。
【问题讨论】:
-
如果您在验证码之前控制台出 req 对象,您是否看到列出的令牌?
-
@proxim0 我在请求中得到
cookies: [Object: null prototype] {}
标签: node.js reactjs express cookies jwt