情况:
我试图检查我的用户向服务器发出请求时是否经过身份验证。
我用谷歌搜索了一下,发现了这个:
所以这是我使用这个库实现这个解决方案的尝试:
https://github.com/js-cookie/js-cookie/blob/latest/src/js.cookie.js
代码:
服务器端
var cookies = require("cookie-parser");
router.get("/", function(req, res, next){
const { token } = req.cookies;
console.log('Verifying token', token);
});
客户端
<script src="/public/js/cookieScript.js"> </script>
<a href="/upload" class = "authIn uploadButton btn btn-success pull-right">UPLOAD</a>
<script>
const setAppCookie = () => firebase.auth().currentUser &&
firebase.auth().currentUser.getToken().then(token => {
Cookies.set('token', token, {
domain: window.location.hostname,
expire: 1 / 24, // One hour
path: '/',
secure: true // If served over HTTPS
});
});
</script>
除了需要 cookie-parser 之外,您还应该配置您的 Express 应用程序来使用它:
var express = require('express');
var app = express();
var cookies = require("cookie-parser");
app.use(cookies());
我认为你应该粘贴一些更多的服务器端代码。
需要在app.router之前使用express.cookieParser();中间件按顺序运行,这意味着在执行路由之前它永远不会到达 cookieParser()。
显然,您的代码在服务器上是正确的。因此,不能在客户端正确设置 cookie。
复制/粘贴您找到的关于在不使用 SSL 时禁用安全 cookie 的解决方案:
const setAppCookie = () => firebase.auth().currentUser &&
firebase.auth().currentUser.getToken().then(token => {
Cookies.set('token', token, {
domain: window.location.hostname,
expire: 1 / 24, // One hour
path: '/',
secure: false // <-- false here when served over HTTP
});
});
我发现问题了!
我的 cookie 尚未通过 https 提供。
const setAppCookie = () => firebase.auth().currentUser &&
firebase.auth().currentUser.getToken().then(token => {
Cookies.set('token', token, {
domain: window.location.hostname,
expire: 1 / 24, // One hour
path: '/',
secure: true // If served over HTTPS
});
});
secure
需要设置为 false
。
您启用了cookie解析器中间件吗? (https://www.npmjs.com/package/cookie-parser)
尝试添加凭据:'include'到您的提取调用中,如下所示:
fetch(`${process.env.SERVER_URL}/`, {
method: "POST",
credentials: "include",
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
})
.then(res => res.json()).then(data => console.log(data))
手动访问地址时它起作用的原因是浏览器发出的HTTP请求默认在标头中发送cookie。获取没有。
您需要按照上述注释并使用浏览器的开发者工具检查网络查询。检查请求标头以确保 cookie 是否随请求一起发送到“/your-route”。确认cookie接收成功。有时由于某些原因它会显示错误。
我也被这个问题困扰了,有一个简单的方法可以解决这个问题,那就是安装cookie-parser,然后:
const express = require("express")
const app = express()
const cookie Parser = require("cookie-parser")
app.use(cookie Parser ())
这样就解决了。如果您发现同样的错误再次出现,只需等待一个小时,关闭您的电脑或笔记本电脑,然后一段时间后,当您尝试从前端获取后端的 cookie 时,就有可能了。
注意:不要一次又一次地尝试,因为也会发生此错误。