【问题标题】:How does fetch send the auth token in the requestfetch 如何在请求中发送 auth token
【发布时间】:2021-09-29 23:06:48
【问题描述】:

我用django rest框架开发了一个API,我的前端是用vue js构建的,所以我必须使用fetch来与API通信。

function apiService(endpoint, method, data) {
    const config = {
        method: method || 'GET',
        body: data !== undefined ? JSON.stringify(data) : null,
        headers: {
            'content-type': 'application/json',
            'X-CSRFToken': CSRF_TOKEN
        }
    };
    return fetch(endpoint, config)
           .then(data => getJson(data))
           .catch(err => err)
    };

我注意到这段代码可以正常工作,但我有疑问,因为我已经在 api 上添加了身份验证权限,所以我必须在请求中发送一个令牌,因为我是没有从浏览器连接。那么,如果我不发送,这个令牌是如何发送到 api 的。

【问题讨论】:

  • 它通常会发送一个带有 session-id 的 cookie,因此 Django 会查找该 session id 是否有用户登录。
  • @在控制台WillemVanOnsem I型 '的document.cookie',这是输出: “tabstyle = HTML标签; _xsrf = 2 | d1f3c838 | d65d796531602abc0a275dcdb1e0096d | 1626274319; csrftoken = p3lY4bWKdgphgLyguZR0m9bB4iX57VtrotbzZZgQRbaIQSZ1v5oTJmNjjtz3rXA8”,所以有不是会话 ID。
  • document.cookies 确实 not 包含sessionid 的 cookie:stackoverflow.com/questions/39356004/… 这是用作防止恶意 JavaScript 代码“窃取”会话 ID 的安全机制,并重用它来发出其他请求。
  • 我会建议你打开浏览器的开发者控制台,并阅读你提出的请求的标题。
  • 好的,非常感谢。

标签: javascript django django-rest-framework


【解决方案1】:

这是通过存储 sessionid 的 cookie 完成的(您可以通过使用 SESSION_COOKIE_NAME setting [Django-doc] 更改它来更改它。此 cookie 包含一个标识符,用于查找您与网络服务器的会话。如果您已登录有了那个 cookie,Django 就可以查询哪个用户已经登录了。

这个 cookie 是用 HttpOnly 标志发送的(你可以用 SESSION_COOKIE_HTTPONLY setting 改变它,虽然我强烈建议不要这样做),这意味着通常 JavaScript 可以检查那个cookie。这是一种安全措施,可防止其他恶意 JavaScript 读取该 cookie 并开始与服务器通信。

例如,您可以在浏览器Web 开发工具 中检查此 cookie:通过检查您发出的请求并查看请求标头的 Cookie: 部分。

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 2021-02-14
    • 1970-01-01
    • 2020-11-24
    • 2021-08-07
    • 1970-01-01
    • 2019-12-24
    • 2016-09-09
    • 2020-11-04
    相关资源
    最近更新 更多