使用 Cookie 获取 API

Fetch API with Cookie

我正在试用新的 Fetch API,但在使用 Cookie 时遇到了问题。具体来说,登录成功后,以后的请求中有一个Cookie头,但是Fetch好像忽略了那个头,我用Fetch发出的所有请求都是未经授权的。

是因为 Fetch 还没有准备好还是 Fetch 不支持 Cookies?

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

Fetch 默认不使用 cookie。要启用 cookie,do this:

fetch(url, {
  credentials: "same-origin"
}).then(...).catch(...);

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

示例 JSON 获取请求:

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

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

刚刚解决。只有两个 f。蛮力的日子

对我来说秘诀在于:

  1. 我调用了 POST /api/auth 并看到 cookie 已成功接收。

  2. 然后使用 credentials: 'include' 调用 GET /api/users/ 并得到 401 unauth,因为没有随请求发送 cookie。

关键是为第一个 /api/auth 调用也设置 credentials: 'include'

如果您在 2019 年阅读本文,credentials: "same-origin" 是默认值。

fetch(url).then

只是在此处为 .net webapi2 用户添加正确答案。

如果您正在使用 cors,因为您的客户端站点是从与您的 webapi 不同的地址提供服务的,那么您还需要在服务器端配置中包含 SupportsCredentials=true

        // Access-Control-Allow-Origin
        // https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api
        var cors = new EnableCorsAttribute(Settings.CORSSites,"*", "*");
        cors.SupportsCredentials = true;
        config.EnableCors(cors);

这对我有用:

import Cookies from 'universal-cookie';
const cookies = new Cookies();

function headers(set_cookie=false) {
  let headers = {
    'Accept':       'application/json',
    'Content-Type': 'application/json',
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
};
if (set_cookie) {
    headers['Authorization'] = "Bearer " + cookies.get('remember_user_token');
}
return headers;
}

然后建立你的调用:

export function fetchTests(user_id) {
  return function (dispatch) {
   let data = {
    method:      'POST',
    credentials: 'same-origin',
    mode:        'same-origin',
    body:        JSON.stringify({
                     user_id: user_id
                }),
    headers:     headers(true)
   };
   return fetch('/api/v1/tests/listing/', data)
      .then(response => response.json())
      .then(json => dispatch(receiveTests(json)));
    };
  }

我的问题是我的 cookie 设置在特定的 URL 路径(例如,/auth),但我 fetch 正在转向不同的路径。我需要将我的 cookie 的 path 设置为 /

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

fetch 文档中,提到了 Note that some names are forbidden.。而 Cookie 恰好是禁止使用的 header 名称之一,无法以编程方式修改。以下面的代码为例:

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

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

详情见Forbidden header name

如果修复凭据后仍然无法正常工作。

我也在用 :

  credentials: "same-origin"

它曾经可以工作,然后突然就不行了,在深入挖掘之后我意识到我已经将我的网站 url 更改为 http://192.168.1.100 以在 LAN 中测试它,那是url 用于发送请求,即使我在 http://localhost:3000.

所以总而言之,确保页面的域与提取的域相匹配url。