【问题标题】:Django Rest Framework: JWT Authorization failedDjango Rest Framework:JWT 授权失败
【发布时间】:2019-07-12 03:18:00
【问题描述】:

我有一个使用 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 验证失败。请求中止。

为什么我做错了?

这里有一个有趣的点:

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

【问题讨论】:

  • 尝试不使用 JWT 单词,只使用令牌。
  • 你能告诉我们DEFAULT_AUTHENTICATION_CLASSES吗?

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


【解决方案1】:

获得令牌后,您无需像尝试那样传递登录凭据或转到登录 url,令牌将提供身份验证。尝试访问 docs 示例中的受保护 url:

现在,为了访问受保护的 api url,您必须包含 授权: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',
    ),
}

关于你的最后一个问题:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2021-07-17
    • 2020-04-03
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多