Django DRF JWT身份验证获取令牌 - JSON解析错误 - 期望值

时间:2017-11-25 23:00:50

标签: python django django-rest-framework jwt

我有简单的Django DRF应用程序设置,我已经实现了JWT身份验证。

我使用了Django REST framework JWT documentation

我使用curl来测试实现。

我可以使用文档中使用的以下符号成功获取令牌:

$ curl -X POST -d "username=admin&password=password123" http://localhost:8000/api-token-auth/

令牌以下列格式返回:

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InNpdHJ1Y3AiLCJleHAiOjE1MTE2NTEyMTQsInVzZXJfaWQiOjEsImVtYWlsIjoiY3VydGlzLnBva3JhbnRAZ21haWwuY29tIn0.F1TSkxe5tQVpddetUdOJDdAPP1XB9Bimb5U3c75oWd0"}

然而,当我尝试使用其他变体时,我收到错误:

$ curl -X POST -H "Content-Type: application/json" -d '{"username":"admin","password":"password123"}' http://localhost:8000/api-token-auth/ 

我得到的错误是:

{"detail":"JSON parse error - Expecting value: line 1 column 1 (char 0)"}

尝试刷新或验证令牌时,我也遇到了同样的错误:

刷新:

$ curl -X POST -H "Content-Type: application/json" -d '{"token":"<EXISTING_TOKEN>"}' http://localhost:8000/api-token-refresh/

验证

$ curl -X POST -H "Content-Type: application/json" -d '{"token":"<EXISTING_TOKEN>"}' http://localhost:8000/api-token-verify/

我正在添加令牌如下:

curl -X POST -H "Content-Type: application/json" -d '{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InNpdHJ1Y3AiLCJleHAiOjE1MTE2NDg5MjIsInVzZXJfaWQiOjEsImVtYWlsIjoiY3VydGlzLnBva3JhbnRAZ21haWwuY29tIn0.T5h_PSvzvKOZCPTS60x5IUm3DgAsRCRmbMJeGWZk3Tw"}' http://localhost:8800/api-token-refresh/

我是否可能错误地添加了令牌?是否需要其他一些带引号的格式?

2 个答案:

答案 0 :(得分:1)

这些请求以两种不同的方式发送数据。第一个请求将其作为表单数据(x-www-form-urlencoded)发送,这是您的端点所期望的,第二个请求将其作为application / json发送。

我不确定您使用的库是否会处理开箱即用的json请求,因此可以选择创建自定义端点并使用以下内容:

import json

def ParseFormData(self, request):
    payload = json.loads(request.body.decode('utf-8'))
    // use django auth to authorize request and return token

您可以在此答案中详细了解相关内容:https://stackoverflow.com/a/29514222/5443056

有关于在库的文档中手动创建auth令牌的说明。这是代码:

from rest_framework_jwt.settings import api_settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)

答案 1 :(得分:1)

我建议使用json.dumps({ key:value })