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


121

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

我在客户端上设置了一个cookie,我想从所有Axios请求中读取该cookie,而无需手动将其手动添加到请求中。

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

axios.get(`some api url`).then(response => ...

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

req.headers
req.cookies

他们两个都不包含任何cookie。我正在使用cookie解析器中间件:

app.use(cookieParser())

如何使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:'/'})
        }
      })
    }
...

虽然它也使用Axios,但与问题无关。我只想在设置cookie后将cookie嵌入到我的所有请求中。


1
您如何在客户端上设置Cookie?请显示代码示例:)
Tzook Bar Noy

@TzookBarNoy添加了有问题的代码
Kunok

Cookie是由具有Set-Cookie的服务器设置的,而不是由客户端设置的,我想您的意思是在客户端上读取Cookie。根据Cookie协议,客户端在向Cookie颁发者服务器的请求中应包含Cookie标头。
Hans Poo

Answers:


241

我遇到了同样的问题,并通过使用该withCredentials属性进行了修复。

来自其他域的XMLHttpRequest不能为自己的域设置cookie值,除非在发出请求之前将withCredentials设置为true。

axios.get('some api url', {withCredentials: true});

8
如果您尝试连接到Express应用-您将需要使用cors,并使用这些设置。请求的来源是必需的。app.use(cors({credentials:true,origin:' localhost:8080 '}));
DogCoffee

17
注意,当这只会工作Access-Control-Allow-Origin的响应头没有被设置为通配符(*)
杰里张

1
@JerryZhang是什么意思?我面临着同样的问题,如果Access-Control-Allow-Origin未设置为*意味着,由于CORS权利,我不会向该服务器发出请求
samayo

5
响应需要将Access-Control-Allow-Origin的值设置为您要向其发出XHR请求的域。例如,https://a.com是服务器,https://b.com是客户端,并且https://b.com已加载到某人的浏览器中,并用于XMLHTTPRequest向发送请求https://a.com。除了设置XMLHTTPRequest(在中发起https://a.com)外withCredential: truehttps://b.com还需要配置服务器- 以便响应头包含Access-Control-Allow-Origin: https://a.com
Jerry Zhang

我对此有一点问题...如果我将a作为服务器b作为客户端(即react页面),则比将它设置为true时,它将发送一个凭据,而不是b凭据...大声笑。 ..好,不好笑。
golddragon007

24

TL; DR:

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


从axios文档

withCredentials: false, // default

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

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

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

axios.defaults.withCredentials = true


5
每个请求中发送凭据是一种不好的做法。这些控件之所以到位是有原因的。与另一项服务进行通信,发送所有cookie(无论是否已使用),已经可以被利用了。
colm.anseo

2
@colminator仅发送以服务器域为域的cookie。(默认情况下,它们也不会被发送到任何子域,并且可能会基于路径进行进一步的过滤。)实际上,我们仅发送由服务器设置的服务器cookie。
M3RS

15

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

withCredentials: true

这将自动将cookie发送到客户端。举例来说,该场景也是通过passportjs生成的,它在服务器上设置了一个cookie


11

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

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();
});

添加X-PINGOTHERAccess-Control-Allow-Headers已强制要求我(Node.js的6.9快车4.16,Chrome浏览器63)。在此GitHub问题上查看JakeElder的文章:github.com/axios/axios/issues/191#issuecomment-311069164
Frosty Z


5

对于仍然无法解决问题的人,此答案对我有所帮助。 stackoverflow答案:34558264

TLDR;一个人需要{withCredentials: true}在axios和fetch中都同时设置GET请求和POST请求(获取cookie)。


1
这很关键。我在代码中忽略了这一点,并花了很多时间想知道为什么{ withCredentials: true }在GET请求中没有任何作用。
yogmk '19

1
非常重要!关于添加withCredentials: true到请求配置的讨论很多,但没有这个细节。我花了将近2天的时间来解决问题,直到遇到这个问题
R. Antao

4

如何使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');

也设置

res.setHeader('Access-Control-Allow-Credentials',true);

3

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

axios.get(`api_url`, { withCredentials: true })

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

expressApp.use(cors({ credentials: true, origin: "http://localhost:8080" }));

在这里您可以了解withCredentials


2

您将两种想法混为一谈。

您有“ react-cookie”和“ axios”

react-cookie =>用于在客户端处理cookie

axios =>用于将ajax请求发送到服务器

有了这些信息,如果您希望客户端的cookie也要在后端进行通信,则需要将它们连接在一起。

来自“ react-cookie”自述文件的注释:

同构饼干!

为了能够在执行服务器渲染时访问用户cookie,可以使用plugToRequest或setRawCookie。

链接到自述文件

如果这是您需要的,那就太好了。

如果没有,请发表评论,以便我进一步阐述。


到底plugToRequest是做什么的?我以为要访问节点服务器上的cookie,所有需要的就是cookie-parser中间件(假设Express)?
geoboy

2

因此,我遇到了同样的问题,失去了大约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'
    }});

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.