使用Cookie获取API

Kha*_*tor 173 cookies fetch-api

我正在尝试使用新的Fetch API但是遇到了Cookie问题.具体来说,在成功登录后,将来的请求中会有一个Cookie标头,但是Fetch似乎忽略了这些标头,而我使用Fetch发出的所有请求都是未经授权的.

是因为Fetch还没有准备好,或者Fetch不能与Cookies一起使用?

我用Webpack构建我的应用程序.我也在React Native中使用Fetch,它没有相同的问题.

Kha*_*tor 256

默认情况下,Fetch不使用cookie.要启用cookie,请执行以下操作:

fetch(url, {
  credentials: "same-origin"
}).then(...).catch(...);
Run Code Online (Sandbox Code Playgroud)

  • 同源不再起作用,包括(参见@Jerry的回答):https://developers.google.com/web/updates/2015/03/introduction-to-fetch (41认同)
  • @jpic:'include'仅适用于跨源请求,但不适用于同源请求.官方文档:https://github.com/github/fetch#sending-cookies (5认同)
  • 我相信`same-origin`(*确实*仍然有用)意味着会尊重更多的标题(cookie等),但是你的代码对访问的访问权限有限. (4认同)
  • fetch中的@MartinBajcar参数“credentials”不读取任何cookie,它只充当一扇门,如果打开(credentials:'include'),则cookie将被允许通过,如果没有打开,则它们不会通过。 (2认同)
  • @JohnBalvinAriasThx。正如我后来所理解的那样,拥有cookie httponly意味着它不能被`document.cookie`读取,但仍可用于ajax或获取请求。 (2认同)

zur*_*fyx 155

除了@Khanetor的回答,对于那些处理跨源请求的人: credentials: 'include'

示例JSON获取请求:

fetch(url, {
  method: 'GET',
  credentials: 'include'
})
  .then((response) => response.json())
  .then((json) => {
    console.log('Gotcha');
  }).catch((err) => {
    console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials

  • 你怎么设置cookie? (7认同)
  • @Khanetor我可以通过javascript使用document.cookie设置cookie,然后发送请求吗? (3认同)
  • cookie 是从服务器端设置的。就我而言,我使用的是 httponly cookie。 (2认同)
  • @ospider 我发现只需在 `document.cookie` 中设置值就足以将其包含在请求中。 (2认同)

use*_*599 25

刚刚解决了.只有两个f.残酷的日子

对我来说,秘诀在于:

  1. 我打电话给POST/api/auth,看到cookie已成功收到.

  2. 然后调用GET/api/users/credentials: 'include'并获得401 unauth,因为没有cookie与请求一起发送.

KEY也是credentials: 'include'为第一个/ api/auth调用设置的.

  • 我欠你一大品脱啤酒。在过去的三个小时里,我一直在用头撞桌子,试图解决这个问题。谢谢你x1000。 (5认同)
  • 还有,别是我。确保获取 URL 是 127.0.0.1 而不是 localhost,否则 Cookie 将不会被设置。 (3认同)

Ice*_*erg 22

Cookie在浏览器端以编程方式覆盖标头将不起作用

fetch文档中,请注意某些名称是禁止的。被提到。并且Cookie恰好是禁止的标头名称之一,无法以编程方式修改。以下面的代码为例:

  • 在https://httpbin.org/页面的 Chrome DevTools 控制台中执行,将被忽略,如果有的话,Cookie: 'xxx=yyy'浏览器将始终将 的值作为 cookie 发送。document.cookie
  • 如果在不同的源上执行,则不会发送 cookie。
fetch('https://httpbin.org/cookies', {
  headers: {
    Cookie: 'xxx=yyy'
  }
}).then(response => response.json())
.then(data => console.log(JSON.stringify(data, null, 2)));
Run Code Online (Sandbox Code Playgroud)

PS 您可以通过在 Chrome 浏览器中foo=bar打开https://httpbin.org/cookies/set/foo/bar来创建示例 cookie 。

有关详细信息,请参阅禁止的标头名称。


ale*_*ero 10

如果您在2019年阅读此内容,credentials: "same-origin"则为默认值。

fetch(url).then
Run Code Online (Sandbox Code Playgroud)

  • 但请注意,并非每个人都在使用足够更新的浏览器。我遇到这个问题是因为我自己的 Firefox 版本(60.x,Debian Stretch 中的最新版本)默认情况下没有设置。 (5认同)