Django Rest Framework:JWT授权失败

时间:2019-02-18 17:20:19

标签: django django-rest-framework jwt django-rest-framework-jwt

我有一个使用Django REST Framework(DRF)编写的应用程序。 此外,还有这样的注册端点:

from refreshtoken.views import delegate_jwt_token
from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('api-token-auth/', obtain_jwt_token),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path(r'refresh-token', delegate_jwt_token, name='refresh-token'),
]

此外,还有一些端点需要授权。

因此,我正在尝试使用curl客户端提取令牌:

curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api-token-auth/ -d '{"username": "test", "password": "testpassword"}'

它返回如下内容:

{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYTdlMmIyMjItZTZkNy00NjhiLTkxNzYtOTE2YzAwZWRhY2E2IiwidXNlcm5hbWUiOiJ0ZXN0IiwiZXhwIjoxNTUwNTEwNDAwLCJlbWFpbCI6InRlc3RAZHhhbXBsZS5jb20iLCJpc19zdGFmZiI6ZmFsc2UsImdyb3VwcyI6W10sInN1YnNjcmliZWQiOmZhbHNlLCJ0ZWxlZ3JhbV9zdWJzY3JpYmVkIjpmYWxzZX0.OExR9TlO3GUisYAu_D86CJ6hgF1EcofpQA0MZ1ENT2c","refresh_token":"1ab03e609d7a7ae05ce104c73858a346a0438e72"}

然后,使用我要登录的令牌,使用令牌:

curl -X POST -H "Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYTdlMmIyMjItZTZkNy00NjhiLTkxNzYtOTE2YzAwZWRhY2E2IiwidXNlcm5hbWUiOiJ0ZXN0IiwiZXhwIjoxNTUwNTEwNDAwLCJlbWFpbCI6InRlc3RAZHhhbXBsZS5jb20iLCJpc19zdGFmZiI6ZmFsc2UsImdyb3VwcyI6W10sInN1YnNjcmliZWQiOmZhbHNlLCJ0ZWxlZ3JhbV9zdWJzY3JpYmVkIjpmYWxzZX0.OExR9TlO3GUisYAu_D86CJ6hgF1EcofpQA0MZ1ENT2c" -H "Content-Type: application/json" http://127.0.0.1:8000/api-auth/login/ -d '{"username": "test", "password": "testpassword"}'

它返回403 (Forbidden) CSRF验证失败。请求中止。

为什么我做错了?

一个有趣的地方:

每个请求令牌的请求都会为同一个user:password对返回一个新令牌(是预期的还是我的令牌过期太快)?

1 个答案:

答案 0 :(得分:1)

一旦有了令牌,就不需要像尝试那样传递登录凭据或转到登录URL时,令牌将提供身份验证。尝试像docs示例中那样访问受保护的URL:

  

现在,要访问受保护的api网址,您必须添加   授权:JWT标头。

$ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/

确保像在文档中一样将'rest_framework_jwt.authentication.JSONWebTokenAuthentication'添加到'DEFAULT_AUTHENTICATION_CLASSES'

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

关于最后一个问题:

  

每个请求令牌的请求都会为同一个user:password对返回一个新令牌(是预期的还是我的令牌过期太快)?

这是预料之中的,每次调用/api-token-auth/时都会生成一个新的。默认到期时间为5分钟,您可以使用JWT_EXPIRATION_DELTA在设置中进行更改。选中additional settings