0

我正在使用 React-Redux 开发一个 Webapp,向不同域中的 nodejs 中的 API 发出请求。

为了登录用户,我将凭据发送到我的 API,它会验证它们并将我作为 JWT 发回。我试图通过使用 ExpressJS 来做到这一点,所以在我的 API 的登录路径中,我有:

res.cookie("my_token", token);

问题是 Cookie 没有被添加到会话中。使用 Mozilla,我可以看到 Set-Cookie 属性位于带有正确 cookie 的标题中,但它没有显示在我的资源中。

我还用 DHC 做了一些测试,使用 DHC Cookie 成功存储在我的会话 cookie 中。

我有

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Credentials", true);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 

在我的网站和 api 中。在网站中,我使用反应模块 axios 来发出请求。在 api 中,我使用 cookie-parser 来处理 cookie。这些是我的中间件(api和app):

    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Credentials", true);
      res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
      next();
    });

    const cookieParser = require("cookie-parser");
    app.use(cookieParser());

    const bodyParser = require("body-parser");
    app.use(bodyParser.json({limit: '50mb'}));
    app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

    const morgan = require("morgan");
    app.use(morgan('dev'));

这是我的要求:

axios.post(`${ROOT_URL}/login`, creds)
  .then(res => { /*...*/ })
  .catch(err => { /*...*/ });

这是我的回应:

res.cookie("session_token", token, { domain: ".mydomain.com" }).send(response);
4

1 回答 1

2

我对 Angular 代码有类似的问题,我做了什么来解决

  • 从客户端你需要启用withCredentials我的东西 axios 应该有一些选项来启用它
  • 从你的后端res.header("Access-Control-Allow-Origin", "*");是不够的

你可以做这样的事情

    res.header("Access-Control-Allow-Origin", req.header('Origin'));

因为您需要返回一个主机而不是星号,这仅用于开发目的,我建议您稍后将其更改为一些静态 url

于 2016-09-10T15:13:44.080 回答