【问题标题】:Hawk auth works with python Requests but not JS AxiosHawk auth 适用于 python 请求,但不适用于 JS Axios
【发布时间】:2018-11-21 09:46:58
【问题描述】:

我有一个使用 Hawk 身份验证(Django Rest Framework)的服务器。

在发出经过身份验证的请求时,我对 python requests 包没有任何问题。

但是,当使用 javascript axios 包时,Authorization 标头无法到达我的身份验证中间件。

requests 的 Python 请求有效

->
GET /logout/ HTTP/1.1
Host: localhost:8000
Accept-Encoding: identity
Authorization: Hawk mac="sPJZet9eQKyBZSBpbGVQefPzsfBIXNFJDWAPF93n6fA=", hash="q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=", id="z1dkOdDr", ts="1528778355", nonce="gBZQRS"

<-
HTTP/1.1 200 OK
Date: Tue, 12 Jun 2018 04:39:15 GMT
Server: WSGIServer/0.2 CPython/3.6.4
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
Server-Authorization: Hawk mac="jBlHlyWCkirfBafbfw+N4iadwuQEsX99pATGXqxjOCY=", hash="2BRBGFjKOpKo9GffbS9rYZddAd5xoq/WdfD0Fm9wDhk="
X-Frame-Options: SAMEORIGIN
Content-Length: 41
{"detail": "user secret has been changed"}

带有axios 的JS 请求失败,因为auth 中间件在标头中没有看到Authorization

->
GET /logout/ HTTP/1.1
Accept: application/json, text/plain, */*
Authorization: Hawk id="7RdDRgkJ", ts="1528778122", nonce="TQWhoS", mac="nrX3bJbVF1wQt/tWrmUf/y/oEmAE6oFPyM5uP5sqzLg="
User-Agent: axios/0.18.0
Host: localhost:8000
Connection: close

<-
HTTP/1.1 401 Unauthorized
Date: Tue, 12 Jun 2018 04:35:22 GMT
Server: WSGIServer/0.2 CPython/3.6.4
Content-Type: application/json
WWW-Authenticate: Hawk
Vary: Accept
Allow: GET, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 39
{"detail": "Hawk authentication failed"}

差异似乎是名义上的。什么可能造成问题? Authorization 标头在请求到达身份验证中间件之前肯定会被剥离,但我不知道在哪里。

【问题讨论】:

  • 对我来说这是由于 apache 中的错误配置而发生的
  • 为什么 Authorization 标头会在一种情况下通过而不是在另一种情况下?开发服务器也会出现这个问题,所以头部的移除肯定是在Django的请求中间件的某个地方发生的。

标签: javascript python django-rest-framework python-requests axios


【解决方案1】:

我也遇到了类似的问题,登录请求之外的后续请求被服务器视为不同的会话。在我碰巧遇到请求包的内置 cookie 选项 https://www.npmjs.com/package/request 之前,我已经到处搜索了该做什么。

默认情况下,cookie 在请求中被禁用(否则,它们将在后续请求中使用)。要启用 cookie,请将 jar 设置为 true(在默认值或选项中)。

var request = request.defaults({jar: true})
request('http://www.google.com', function () {
  request('http://images.google.com')
})

或者,如果你想使用流行的 axios,你需要获取更多的 javascript 包。我找到了这个解决方案,https://www.npmjs.com/package/axios-cookiejar-support。看起来尽管 axios 在 Promise 方面可以做很多很酷的事情,但它并没有内置对 cookie 的支持,除非你包含其他一些包。

const axios = require('axios').default;
const axiosCookieJarSupport = require('@3846masa/axios-cookiejar-support').default;
// const axiosCookieJarSupport = require('axios-cookiejar-support').default;
const tough = require('tough-cookie');

axiosCookieJarSupport(axios);

const cookieJar = new tough.CookieJar();

axios.get('https://google.com', {
  jar: cookieJar, // tough.CookieJar or boolean
  withCredentials: true // If true, send cookie stored in jar
})
.then(() => {
  console.log(cookieJar);
});

我希望这对那里的人有所帮助,我花了一整天的时间才弄清楚我的请求出了什么问题。

【讨论】:

【解决方案2】:

问题是 Axios 在 301 重定向响应后没有重新附加 Authorization 标头 - 即,实际 GET 请求上没有 Authorization 标头到正确的(反斜杠附加)url。解决方案是分离请求并确保标头的存在 - 或者只是第一次正确获取端点 url。

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2020-07-19
    • 2019-04-11
    • 2018-06-22
    • 1970-01-01
    • 2021-04-27
    • 2020-11-23
    • 2023-01-12
    • 2021-03-24
    相关资源
    最近更新 更多