使Axios自动在其请求中发送cookie

Kun*_*nok 86 javascript cookies node.js express axios

我正在使用Axios从客户端向Express.js服务器发送请求.

我在客户端设置了一个cookie,我想从所有Axios请求中读取该cookie,而不是手动添加它们来手动请求.

这是我的客户端请求示例:

axios.get(`some api url`).then(response => ...
Run Code Online (Sandbox Code Playgroud)

我试图通过在Express.js服务器中使用这些属性来访问标头或cookie:

req.headers
req.cookies
Run Code Online (Sandbox Code Playgroud)

它们都不包含任何cookie.我正在使用cookie解析器中间件:

app.use(cookieParser())
Run Code Online (Sandbox Code Playgroud)

如何让Axios自动在请求中发送cookie?

编辑:

我在客户端设置cookie如下:

import cookieClient from 'react-cookie'

...
let cookie = cookieClient.load('cookie-name')
if(cookie === undefined){
      axios.get('path/to/my/cookie/api').then(response => {
        if(response.status == 200){
          cookieClient.save('cookie-name', response.data, {path:'/'})
        }
      })
    }
...
Run Code Online (Sandbox Code Playgroud)

虽然它也使用Axios,但它与问题无关.一旦设置了cookie,我只想在我的所有请求中嵌入cookie.

fin*_*ich 178

我有同样的问题,并通过withCredential属性修复它.

来自其他域的XMLHttpRequest无法为自己的域设置cookie值,除非在提出请求之前将withCredentials设置为true.

axios.get('some api url', {withCredentials: true});
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅在响应头中的"Access-Control-Allow-Origin"未设置为通配符(*)时才有效 (11认同)
  • 如果您尝试连接到Express应用-您将需要使用cors,并使用这些设置。请求的来源是必需的。app.use(cors({credentials:true,origin:'http:// localhost:8080'})); (4认同)
  • 响应需要将"Access-Control-Allow-Origin"的值设置为您想要发出XHR请求的域.例如`https:// a.com`是服务器,`https:// b.com`是客户端,并且`https:// b.com`被加载到某人的浏览器中并使用`XMLHTTPRequest`来制作请求`https:// a.com`.除了`XMLHTTPRequest`(在`https:// a.com`中启动)设置`withCredential:true`之外,还需要配置服务器 - `https:// b.com`,以便响应头包含` Access-Control-Allow-Origin:https:// a.com` (3认同)
  • @JerryZhang 你是不是点错了?`https://b.com` 在你的例子中代表客户端,因此 `XMLHTTPRequest` 应该在 `b` 而不是 `a` 中启动吗? (2认同)
  • 另外,请确保设置 cookie 的 POST 请求也包含“withCredentials: true”,而不仅仅是后续的 GET 请求 (2认同)

Leo*_*eon 14

Fatih 的答案在 2022 年仍然有效且很棒。

axios.defaults.withCredentials = true将发挥作用。

似乎传递{ withCredentials: true }给单个 axios 调用已被弃用。


小智 12

我不熟悉Axios,但据我所知,在javascript和ajax中有一个选项

withCredentials: true
Run Code Online (Sandbox Code Playgroud)

这将自动将cookie发送到客户端.例如,这个场景也是使用passportjs生成的,后者在服务器上设置cookie


Man*_*yes 11

对我有用的:

客户端:

import axios from 'axios';

const url = 'http://127.0.0.1:5000/api/v1';

export default {
  login(credentials) {
    return axios
      .post(`${url}/users/login/`, credentials, {
        withCredentials: true,
        credentials: 'include',
      })
      .then((response) => response.data);
  },
};
Run Code Online (Sandbox Code Playgroud)

注意:凭据将是发布请求的正文,在本例中是用户登录信息(通常从登录表单获取):

{
    "email": "user@email.com",
    "password": "userpassword"
}
Run Code Online (Sandbox Code Playgroud)

服务器端:

const express = require('express');
const cors = require('cors');

const app = express();
const port = process.env.PORT || 5000;

app.use(
  cors({
    origin: [`http://localhost:${port}`, `https://localhost:${port}`],
    credentials: 'true',
  })
);
Run Code Online (Sandbox Code Playgroud)


Eyk*_*ein 10

在快速响应中设置必要的标头也很重要。这些是为我工作的:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', yourExactHostname);
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  next();
});
Run Code Online (Sandbox Code Playgroud)


Fat*_*cet 7

TL; DR:

{ withCredentials: true } 要么 axios.defaults.withCredentials = true


从axios文档

withCredentials: false, // default

withCredentials 指示是否应使用凭据发出跨站点访问控制请求

如果您{ withCredentials: true }的请求通过,它应该可以工作。

一个更好的方法将被设置withCredentialstrueaxios.defaults

axios.defaults.withCredentials = true

  • @colminator 仅发送具有服务器域作为其域的 cookie。(默认情况下,它们也不会发送到任何子域,并且可以根据路径进行进一步过滤。)实际上,我们只发送服务器设置的服务器 cookie。 (7认同)
  • 发送带有_every_请求的凭据是一种不好的做法。这些控件之所以到位是有原因的。与另一项服务进行通信,发送所有cookie(无论是否已使用),已经可以被利用了。 (2认同)

pro*_*jon 7

对于仍然无法解决它的人,这个答案帮助了我。 stackoverflow 答案:34558264

TLDR;需要{withCredentials: true}在 GET 请求和 POST 请求(获取 cookie)中为 axios 和 fetch 设置。

  • 这一点至关重要。我在代码中忽略了这一点,并花了很多时间想知道为什么 GET 请求中的 `{ withCredentials: true }` 没有任何效果。 (2认同)

小智 7

所以我遇到了完全相同的问题并且失去了大约 6 个小时的生命搜索,我有

withCredentials: true

但是浏览器仍然没有保存 cookie,直到出于某种奇怪的原因,我想到了调整配置设置的想法:

Axios.post(GlobalVariables.API_URL + 'api/login', {
        email,
        password,
        honeyPot
    }, {
        withCredentials: true,
        headers: {'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'
    }});
Run Code Online (Sandbox Code Playgroud)

似乎您应该始终首先发送“withCredentials”密钥。

  • 呜呜呜呜www伙计!我一直被这个问题所困扰,这是我在互联网上最喜欢的新答案。非常感谢!如果有人可能想知道为什么他们的 GET 请求对 isAuthenticated 为 true,但他们的 POST 请求却没有,那么您的 POST 格式必须如下所示:axios.post(`URL`, {data}, {withCredentials: true})。而您的 GET 允许 withCredentials 与数据一起发送:axios.get(`URL`, {data, withCredentials: true})。至少对于我来说,在我的反应->快速操作中。 (5认同)

Sun*_*arg 7

您可以使用withCredentials属性在请求中传递 cookie。

axios.get(`api_url`, { withCredentials: true })
Run Code Online (Sandbox Code Playgroud)

通过设置,{ withCredentials: true }您可能会遇到跨源问题。要解决您需要使用

expressApp.use(cors({ credentials: true, origin: "http://localhost:8080" }));
Run Code Online (Sandbox Code Playgroud)

在这里你可以阅读withCredentials


mac*_*ost 6

另一种解决方案是使用这个库:

https://github.com/3846masa/axios-cookiejar-support

它将“Tough Cookie”支持集成到 Axios 中。请注意,这种方法仍然需要withCredentials标志。


pra*_*rak 6

如何让 Axios 在请求中自动发送 cookie?

axios.defaults.withCredentials = true;

或者对于某些特定的请求,您可以使用 axios.get(url,{withCredentials:true})

如果您的“Access-Control-Allow-Origin”设置为通配符(*),则会出现 CORS 错误。因此,请确保指定请求的来源网址

例如:如果使请求在 localhost:3000 上运行的前端,则将响应标头设置为

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
Run Code Online (Sandbox Code Playgroud)

还设置

res.setHeader('Access-Control-Allow-Credentials',true);
Run Code Online (Sandbox Code Playgroud)