Как на самом деле использовать аутентификацию DRF + JWT с запросами Python - PullRequest
0 голосов
/ 27 сентября 2019

Итак, у меня есть API отдыха для моего приложения Django «Управление временем».Я использую авторизацию JWT (JSON Web Token) для своего API.У меня есть все настройки и представления, но я не совсем понял, как это работает на самом деле.У меня есть клиент для моего приложения, который будет использовать эти токены авторизации для добавления посещаемости.

Вот мой проект 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 голосов
/ 27 сентября 2019
  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"]
    
...