我有简单的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/
我是否可能错误地添加了令牌?是否需要其他一些带引号的格式?
答案 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 })