【问题标题】:cookie httponly not sentcookie httponly 未发送
【发布时间】:2020-11-19 05:50:16
【问题描述】:

我正在构建一个带有 api 平台的 api 和一个带有 react 的前端(使用 apiplatform 的 react 模板)。我配置了身份验证并使用包含 jwt 的 httponly cookie 返回客户端。但是当我的前端发出请求时,它并没有发送这个cookie......我绝对不知道为什么,我认为它是由浏览器自动完成的,直到它在同一个域上。

这是我的客户端的网络历史示例:

我的应用在 https://localhost:3000/ 上运行

您在这些请求中发现有什么问题吗?或者有没有人知道它可能来自什么? 我的应用和 api 正在使用 https 并拥有有效的证书...

如果您需要任何其他信息,请随时询问,谢谢大家!!!

【问题讨论】:

    标签: cookies api-platform.com httponly


    【解决方案1】:

    好的,我找到了解决方案: 向身份验证请求添加凭据,如果未添加标头,则浏览器不会存储 cookie。 第二点:

    const fetchHydra = (url, options = {}) =>
      baseFetchHydra(url, {
        ...options,
        credentials: 'include',
      });
    

    credentials: 'include' 不在标题选项中...很好!

    【讨论】:

      【解决方案2】:

      我无法在评论中回答,因为有代码... 所以,它由 api-platform (https://api-platform.com/docs/admin/) 的 react admin base 管理,但我的配置是这样的:

      
      const fetchHeaders = {
        credentials: 'include',
      };
      
      const fetchHydra = (url, options = {}) =>
        baseFetchHydra(url, {
          ...options,
          headers: new Headers(fetchHeaders),
        });
      
      const apiDocumentationParser = (entrypoint) =>
        parseHydraDocumentation(entrypoint, { headers: new Headers(fetchHeaders) }).then(
          ({ api }) => ({ api }),
          (result) => {
              ...
          },
        );
      
      const dataProvider = baseHydraDataProvider(entrypoint, fetchHydra, apiDocumentationParser, true);
      

      所以,所有对数据的获取、发布等请求都是基于这个配置

      但我的第一次身份验证调用是这样完成的:

      login: ({ username, password }) => {
          const request = new Request(`${entrypoint}/authentication_token`, {
            method: 'POST',
            body: JSON.stringify({ username, password }),
            headers: new Headers({ 'Content-Type': 'application/json' }),
          });
          return fetch(request).then((response) => {
            if (response.status < 200 || response.status >= 300) {
              localStorage.removeItem('isAuthenticated');
              throw new Error(response.statusText);
            }
            localStorage.setItem('isAuthenticated', 'true');
          });
        },
      

      【讨论】:

      • 我不认识这个客户。在您的 localhost:3000 上,打开 Web 控制台并输入 xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.open('GET', 'http://localhost:8443'); xhr.send();。如果失败了,我不知道。
      • 它不起作用,我发现添加 credentials: 'includes'mode: 'cors' 使请求失败,如果我发送凭据,allow_origin 不应该是 *... 但这是一个****** 地狱......
      【解决方案3】:

      好的,我的问题最后还是存在...我的浏览器没有发送 cookie...

      我的身份验证请求返回不记名 cookie(有效,经邮递员测试)

      我的 cookie 从身份验证请求中收到

      我的 GET 请求没有那个 auth cookie

      我错过了一些东西,但我没有找到它...... 我已经设置了凭据,Access-Control-Allow-Credentials,samesite 是“无”,可以将其发送到任何地方。还有其他事情要做吗?或者,也许我正在做一件错误的愚蠢的小事?

      【讨论】:

      【解决方案4】:

      好吧,我不知道...当我试图解决我的问题时,我什么也没找到。 我使用 cookie httponly 是因为:

      • 我想试试 :D
      • 很多安全文章说它更安全,因为客户端 api 无法访问这些 cookie,浏览器管理它。它似乎可以对抗 xss 和 cookie 的隐身,但是如果我的 cookie 是使用 localforage 存储的,我认为我没有这个问题,但是使用 localStorage 我有,不是吗?
      • 很酷,不!我用经典的不记名身份验证做了太多的项目,我现在可以改进它

      非常感谢您的好回答 rugolinifr !

      【讨论】:

      • 如果它解决了您的问题,请不要忘记接受答案!
      【解决方案5】:

      我假设您使用 xhrfetch

      Cookie 会忽略端口,但跨源策略不会。

      您使用两个 URL(http://localhost:8443 和 http://localhost:3000)。因此,您的应用正在生成 cross origin request,因为端口不同。

      xhr 需要将其 withCredentials 属性设置为 true 以发送带有跨域请求的 cookie。 fetch 要求将其 credentials 参数设置为 include

      服务器端,将 Access-Control-Allow-Credentials 设置为 true

      另请注意,您的 cookie 是 samesite=strict。在生产环境中,如果您的应用和 api 使用两个域,则永远不会发送。

      这里真正的问题是为什么使用 cookie 而不是 Authorization 标头?

      【讨论】:

      • 它适用于邮递员,但不适用于我的应用程序(CORS 策略已阻止从源“localhost:3000”获取“localhost:8443”的访问权限:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。)但是,我的第一个问题已经解决,谢谢,添加凭证头是修复!
      • 我无法解决它......它永远不会工作,当我完成它时,我将使用 api 平台和 js 为这个 auth 发布一个 tuto
      猜你喜欢
      • 2021-08-26
      • 2021-08-05
      • 2018-03-18
      • 2019-01-27
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2021-11-03
      • 2017-06-20
      相关资源
      最近更新 更多