如何在Python请求中实际使用DRF + JWT身份验证

时间:2019-09-27 14:50:20

标签: django django-rest-framework

因此,我为Django“时间管理”应用提供了一个REST API。我正在为我的API使用JWT(JSON Web令牌)授权。我已经配置了所有设置和视图,但是我不清楚它实际如何工作的概念。我的应用程序有一个客户端,该客户端将使用这些身份验证令牌来增加出勤。

这是我项目的url.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView


urlpatterns = [
    path('', admin.site.urls),
    path('time/', include('timemanagement.urls')),
    path('api-auth', include("rest_framework.urls")),
    path('api/token/', TokenObtainPairView.as_view()),
    path('api/token/refresh/', TokenRefreshView.as_view()),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

问题1-基本上,当我的应用程序首次启动时,我希望它做什么? 我假设我首先需要使用用户名和密码作为标头向'myserver.com/api/token/'发出请求,但是我不知道如何使用Python Requests库来进行此操作。

问题2-假设我的令牌已过期。我的客户应用程序怎么知道的? (通过发送带有该令牌的请求,我猜我会得到一个错误?)如果是这样,如何处理此错误以获取新的令牌?如果该令牌也过期,因为'api/token/refresh/'这次只给出一个令牌,而没有刷新令牌,该怎么办?

此外,每次加载我的应用程序时,我是否都必须使用管理员凭据从“ api / token”请求一个新令牌,否则一个应用程序将只有一个令牌会被刷新一次。 我不使用POSTMAN,而是使用Python请求库。

感谢您的时间,

1 个答案:

答案 0 :(得分:0)

  1. 您不使用标头发出请求api/token,而是执行POST请求并在正文中传递凭据。使用请求2.4.2,您可以这样做:

    requests.post(
        "http://localhost:8000/api/token/",
        json={"username": "davidattenborough", "password": "boatymcboatface"}
    )
    
  2. 如果令牌已过期,您将收到状态码为401的响应。您将其称为刷新端点。如果您的刷新令牌已过期,这还将给出一个401。然后,您必须使用您的凭据重新进行身份验证。使用请求,您可以使用.status_code来获取状态:

    response = requests.get(...)
    response.status_code
    

    或者,您可以从令牌中读取过期时间并主动刷新/重新认证。客户端可以读取JWT令牌,但不能验证其内容。这足以从“ exp”字段中读取到期时间。您可以为此使用库PyJWT。像这样:

    response = requests.post(
        "http://localhost:8000/api/token/",
        json={"username": "davidattenborough", "password": "boatymcboatface"}
    )
    tokens = response.json()
    access_expiration = jwt.decode(token["access"], verify=False)["exp"]
    refresh_expiration = jwt.decode(token["refresh"], verify=False)["exp"]