桌面应用程序的Django REST身份验证

时间:2016-11-14 10:38:12

标签: python django rest authentication

我一直在尝试使用Django-REST身份验证来验证桌面应用程序中提供的用户名/密码。

在服务器端,我安装了以下DJANGO-REST-FRAMEWORK-JWT软件包:

https://github.com/GetBlimp/django-rest-framework-jwt

我已经完成了示例,当我在命令行上运行以下命令时,获取一个令牌作为响应:

curl -X POST -d "username=luca&password=letmein123" http://localhost:8000/api-token-auth/

我得到了:

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InBhbmthaiIsInVzZXJfaWQiOjIsImVtYWlsIjoiIiwiZXhwIjoxNDc5MTE5NzQ2fQ.RA085m-YSnGFheykCCxSVxI_9rW9AC9kEaOkUB5Gm0A"}

我尝试过类似的事情:

import requests
resp = requests.post('http://127.0.0.1:8000/api-token-auth/', data={}, auth=('luca', 'letmein123'))

但是,这始终会返回带有400

的响应代码Bad request

我的问题是如何从我的桌面python应用程序中执行此操作。我基本上想要使用用户名和密码调用相同的API,并能够处理响应并访问受保护的API。

1 个答案:

答案 0 :(得分:0)

requests.requestauth参数默认为基本/摘要/自定义HTTP身份验证,类似于curl的-u, --user <user:password>参数。 您可以define your own custom Authentication class来获得所需的结果,但获得与原始curl请求相同结果的基本方法是:

resp = requests.post(
    'http://localhost:8000/api-token-auth/',
    data={"username": "luca", "password": "letmein123"})

如果您愿意,可以使用data参数将json字典作为json提供(请求可能不同,但Django REST框架JWT的also supported)。

然后,您可以使用令牌(使用token = resp.json()['token']提取)访问受限制的网址,如下所示:

requests.post(
    'http://localhost:8000/some-personal-function/',
    json={"foo": 42},
    headers={'Authorization': 'JWT ' + token})

顺便看response.text可能有助于找到原因,如果您的400回复,则会包含以下内容:

  

'{“username”:[“此字段为必填项。”],“密码”:[“此字段为必填项。”]}'