为什么 req.cookies 未定义?

问题描述 投票:0回答:8

情况:

我试图检查我的用户向服务器发出请求时是否经过身份验证。

我用谷歌搜索了一下,发现了这个:

如果用户通过firebase登录,如何显示不同的页面

所以这是我使用这个库实现这个解决方案的尝试:

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>
javascript node.js cookies firebase firebase-authentication
8个回答
27
投票

除了需要 cookie-parser 之外,您还应该配置您的 Express 应用程序来使用它:

var express = require('express');
var app = express();
var cookies = require("cookie-parser");

app.use(cookies());

17
投票

我认为你应该粘贴一些更多的服务器端代码。

需要在app.router之前使用express.cookieParser();中间件按顺序运行,这意味着在执行路由之前它永远不会到达 cookieParser()。


8
投票

显然,您的代码在服务器上是正确的。因此,不能在客户端正确设置 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
                 });
            });

2
投票

我发现问题了!

我的 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


1
投票

您启用了cookie解析器中间件吗? (https://www.npmjs.com/package/cookie-parser


0
投票

尝试添加凭据:'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。获取没有。


0
投票

您需要按照上述注释并使用浏览器的开发者工具检查网络查询。检查请求标头以确保 cookie 是否随请求一起发送到“/your-route”。确认cookie接收成功。有时由于某些原因它会显示错误。


-2
投票

我也被这个问题困扰了,有一个简单的方法可以解决这个问题,那就是安装cookie-parser,然后:

const express = require("express")
const app = express()
const cookie Parser  = require("cookie-parser")
app.use(cookie Parser ())

这样就解决了。如果您发现同样的错误再次出现,只需等待一个小时,关闭您的电脑或笔记本电脑,然后一段时间后,当您尝试从前端获取后端的 cookie 时,就有可能了。

注意:不要一次又一次地尝试,因为也会发生此错误。

© www.soinside.com 2019 - 2024. All rights reserved.