【问题标题】:Django DRF JWT authentication get token - JSON parse error - Expecting valueDjango DRF JWT 身份验证获取令牌 - JSON 解析错误 - 期望值
【发布时间】:2018-05-09 12:51:23
【问题描述】:

我有简单的 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/

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

【问题讨论】:

  • 您是否覆盖了任何视图?您的设置如何?我们实际上在生产中使用它,从我在视图和 url 中看到的内容来看,我们已经将 auth 类添加到登录视图中,并且我们已经自定义了 url 并直接调用了 refresh_jwt_token。
  • 一个愚蠢的问题,但是您是否已经逃脱了数据?
  • 不只是使用基本的基于类的视图。设置几乎直接来自 DRF 教程实现。您能否更具体地说明转义数据?

标签: python django django-rest-framework jwt


【解决方案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

在您的库文档中有手动创建身份验证令牌的说明。代码如下:

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)

【讨论】:

  • 他正在使用为他执行此操作的库,请查看他发布的链接
  • 是的,我看到了,刚刚编辑过。我不确定他是否可以使用该库实现该功能,除非他创建一个自定义端点来处理请求。
  • 是的,正在为我创建令牌,并且可以正常工作。好的,也许 DRF 需要帮助解析 JSON,但 Django REST framework JWT documentation 确实明确表明它希望 DRF 能够这样做。它提到了给我错误的变体:“或者,您可以使用 Django REST 框架支持的所有内容类型来获取身份验证令牌。”
  • 好吧,我看到了类似的错误。我不是 Python 专家,但从代码来看,该库似乎无法处理 json 请求,但我可能是错的。如果需要,构建自定义路线并不是什么大问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 2019-02-27
    • 2019-01-22
    • 2021-01-10
    • 2018-05-07
    • 2018-07-01
    • 2019-06-17
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多