【问题标题】:Sending cookies to client with express not working使用 express 向客户端发送 cookie 不起作用
【发布时间】:2019-06-28 15:59:02
【问题描述】:

我当前的设置是在 Heroku 上设置的 Node.js 应用程序,它应该像这样使用 Express.js 为我的客户端(一个 React 应用程序)设置一些 cookie。

request.post(authOptions, function(error, response, body) {
  if (!error && response.statusCode === 200) {

    const access_token = body.access_token,
        refresh_token = body.refresh_token;



    let options = {
      url: 'https://api.spotify.com/v1/me',
      headers: { 'Authorization': 'Bearer ' + access_token },
      json: true
    };
request.get(options, function(error, response, body) {
             res.cookie('access_token',access_token, { domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
            res.cookie('refresh_token',refresh_token,{ domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
            res.cookie('user',body.display_name,{ domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });

        res.redirect('https://www.example.com/');
     });
} else {...}}

它确实设置了 cookie,但仅限于 Heroku 应用程序。我提供的域被完全忽略,当我尝试在客户端读取 cookie 时,这显然会导致错误。有什么建议吗?

编辑:添加完整功能。

【问题讨论】:

  • cookie 将设置在原始请求的域上,并且不会在您可能重定向到的单独域上可用(出于安全原因)。如果您尝试为不同的域设置 cookie 并希望浏览器配置为允许 3rd 方 cookie,则必须设置 3rd 方 cookie。谷歌 3rd 方 cookie 看看它们是什么。

标签: node.js reactjs express heroku cookies


【解决方案1】:

这里有一些非常简化的工作代码来演示响应网络请求的 cookie 设置:

const express = require('express')
const rp = require('request-promise-native')
const app = express();

app.get("/cookie", function(req, res) {
    rp.get('https://mobilesecurity.win/sample/access_token.json').then(function(body) {
        const domain = 'localhost';
        const parsed = JSON.parse(body);
        const access_token = parsed.access_token;
        const refresh_token = parsed.refresh_token;
        res.cookie('access_token',access_token, { domain: domain, path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
        res.cookie('refresh_token',refresh_token,{ domain: domain, path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
        res.status(200).json({'status':'cookies set!'})
    }).catch(function(error) {
        res.status(500).json({'status':'failure', error:error.message});
    });
});

app.listen(8080);

结果如下:

请注意,我使用localhost 作为域,因为我在本地运行服务器。您必须使用与您的主机名匹配的域,否则浏览器将拒绝设置 cookie(出于安全原因)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多