因此,我为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请求库。
感谢您的时间,
答案 0 :(得分:0)
您不使用标头发出请求api/token
,而是执行POST请求并在正文中传递凭据。使用请求2.4.2,您可以这样做:
requests.post(
"http://localhost:8000/api/token/",
json={"username": "davidattenborough", "password": "boatymcboatface"}
)
如果令牌已过期,您将收到状态码为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"]