Hawk auth可以使用python请求,但不能使用JS Axios

时间:2018-06-12 05:12:37

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

我有一台使用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请求失败,因为身份验证中间件在标题中看不到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标头肯定会被剥离,但我无法弄清楚在哪里。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我也遇到了类似的问题,服务器将登录请求之外的后续请求视为另一个会话。在碰巧遇到请求包的内置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可以做的一切很酷,但除非包含其他软件包,否则它并没有内置的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);
});

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

相关问题