[PYTHON] Ich habe den JWT-Token-Generator mit Django Rest Auth auf SimpleJWT geändert.

Warum nicht djangorestframework-jwt verwenden?

Es gab zwei Hauptgründe.

Django-simplejwt kann gleichzeitig access_token und refresh_token erhalten.

djangorestframework-jwt → djangorestframework-simplejwt

Installieren Sie zunächst von djangorestframework-simplejwt.

pip install djangorestframework-simplejwt

Verzeichnisstruktur von django-rest-auth. Die Datei, die in dieser Datei repariert werden soll, ist utils.py.

├── __init__.py
├── __init__.pyc
├── __pycache__
│   ├── __init__.cpython-38.pyc
│   ├── admin.cpython-38.pyc
│   ├── app_settings.cpython-38.pyc
│   ├── models.cpython-38.pyc
│   ├── serializers.cpython-38.pyc
│   ├── social_serializers.cpython-38.pyc
│   ├── urls.cpython-38.pyc
│   ├── utils.cpython-38.pyc
│   └── views.cpython-38.pyc
├── admin.py
├── admin.pyc
├── app_settings.py
├── app_settings.pyc
├── locale
│   ├── cs
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   ├── de
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   ├── es
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   ├── ko
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   ├── pl
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   ├── ru
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   ├── tr
│   │   └── LC_MESSAGES
│   │       └── django.po
│   ├── zh_Hans
│   │   └── LC_MESSAGES
│   │       ├── django.mo
│   │       └── django.po
│   └── zh_Hant
│       └── LC_MESSAGES
│           ├── django.mo
│           └── django.po
├── models.py
├── models.pyc
├── registration
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── __pycache__
│   │   ├── __init__.cpython-38.pyc
│   │   ├── app_settings.cpython-38.pyc
│   │   ├── serializers.cpython-38.pyc
│   │   ├── urls.cpython-38.pyc
│   │   └── views.cpython-38.pyc
│   ├── app_settings.py
│   ├── app_settings.pyc
│   ├── serializers.py
│   ├── serializers.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── views.py
│   └── views.pyc
├── serializers.py
├── serializers.pyc
├── social_serializers.py
├── social_serializers.pyc
├── tests
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── __pycache__
│   │   ├── __init__.cpython-38.pyc
│   │   ├── django_urls.cpython-38.pyc
│   │   ├── mixins.cpython-38.pyc
│   │   ├── settings.cpython-38.pyc
│   │   ├── test_api.cpython-38.pyc
│   │   ├── test_social.cpython-38.pyc
│   │   └── urls.cpython-38.pyc
│   ├── django_urls.py
│   ├── django_urls.pyc
│   ├── mixins.py
│   ├── mixins.pyc
│   ├── requirements.pip
│   ├── settings.py
│   ├── settings.pyc
│   ├── test_api.py
│   ├── test_api.pyc
│   ├── test_base.pyc
│   ├── test_social.py
│   ├── test_social.pyc
│   ├── urls.py
│   └── urls.pyc
├── urls.py
├── urls.pyc
├── utils.py # <-dies
├── utils.pyc
├── views.py
└── views.pyc

Wenn Sie in utils.py schauen, gibt es eine Funktion, die jwt_encode sagt, und es sieht so aus, und ändern Sie diesen Code in den folgenden Code.

(https://django-rest-framework-simplejwt.readthedocs.io/en/latest/creating_tokens_manually.html)

def jwt_encode(user):
    try:
        from rest_framework_jwt.settings import api_settings 
    except ImportError:
        raise ImportError("rest_framework_simplejwt needs to be installed")

    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

    payload = jwt_payload_handler(user)
    return jwt_encode_handler(payload)

def jwt_encode(user):
    try:
        # from rest_framework_jwt.settings import api_settings <-- old version.
        from rest_framework_simplejwt.tokens import RefreshToken
    except ImportError:
        raise ImportError("rest_framework_simplejwt needs to be installed")

    # jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    # jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

    # payload = jwt_payload_handler(user)
    refresh = RefreshToken.for_user(user)
    payload = {'refresh' : str(refresh), 'access': str(refresh.access_token)}
    return payload

Korrigieren Sie danach den Code von serializers.py wie folgt.

class JWTSerializer(serializers.Serializer):
    """
    Serializer for JWT authentication.
    """
    token = serializers.CharField()
    user = serializers.SerializerMethodField()

    def get_user(self, obj):
        """
        Required to allow using custom USER_DETAILS_SERIALIZER in
        JWTSerializer. Defining it here to avoid circular imports
        """
        rest_auth_serializers = getattr(settings, 'REST_AUTH_SERIALIZERS', {})
        JWTUserDetailsSerializer = import_callable(
            rest_auth_serializers.get('USER_DETAILS_SERIALIZER', UserDetailsSerializer)
        )
        user_data = JWTUserDetailsSerializer(obj['user'], context=self.context).data
        return user_data

class JWTSerializer(serializers.Serializer):
    """
    Serializer for JWT authentication.
    """
    token = serializers.JSONField()
    user = serializers.SerializerMethodField()

    def get_user(self, obj):
        """
        Required to allow using custom USER_DETAILS_SERIALIZER in
        JWTSerializer. Defining it here to avoid circular imports
        """
        rest_auth_serializers = getattr(settings, 'REST_AUTH_SERIALIZERS', {})
        JWTUserDetailsSerializer = import_callable(
            rest_auth_serializers.get('USER_DETAILS_SERIALIZER', UserDetailsSerializer)
        )
        user_data = JWTUserDetailsSerializer(obj['user'], context=self.context).data
        return user_data

Before & After

Before

{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyLCJ1c2VybmFtZSI6InVzZXIiLCJleHAiOjE1OTk5MzQ0NDYsImVtYWlsIjoiIn0.ddZRKpU76x66dkJVh0SEP3FZL1HHLv8XJqvaf8OEd5o",
  "user": {
    "pk": 2,
    "username": "user",
    "email": "",
    "first_name": "",
    "last_name": ""
  }
}

After

{
  "token": {
    "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTYwMDAyMDYzMSwianRpIjoiNTEwNzhlZmU4MGY2NDNiYjkyYmUyMTlkMDc5OWM1ZTIiLCJ1c2VyX2lkIjoyfQ.eGzYcmAD5e7Oi_DnN9N0j0iMswiCnBc8Qwoeltnlhos",
    "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTk5OTM0NTMxLCJqdGkiOiI1ZTA1N2U5NThlM2I0NDgzODA4ZDkyNWFlODljMTMzYyIsInVzZXJfaWQiOjJ9.OFX7jYeco6uNK_WenOdO5jKJkN-RwMiwFZa1zhusoUA"
  },
  "user": {
    "pk": 2,
    "username": "user",
    "email": "",
    "first_name": "",
    "last_name": ""
  }
}

Als Ergebnis der Überprüfung scheint es ein neues Paket mit dem Namen dj-rest-auth zu geben. Verwenden Sie daher dj-rest-auth. Bitte. Dies verwendet simple-jwt.

Recommended Posts

Ich habe den JWT-Token-Generator mit Django Rest Auth auf SimpleJWT geändert.
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Ich habe Jinja2 beim Lesen des Dokuments verglichen, um es mit Django zu verwenden
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich wollte mit der Bezier-Kurve spielen
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich möchte in der Django-Verschiebungstabelle scrollen, aber ...
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Wenn Sie mit dem Django REST-Framework filtern möchten
Übergang zum Update-Bildschirm mit dem Django-Tag
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe dir geschrieben, dass du das Signal mit Go sehen sollst
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Was ich getan habe, um die Python2 EOL mit Zuversicht zu begrüßen
[Python] Ich möchte die Option -h mit argparse verwenden
Ich habe das Toho-Projekt mit Deep Learning aufgenommen ... ich wollte.
Verwendung des Generators
Django REST Framework mit Vue.js
Melden Sie sich mit dem Django Rest Framework an
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
[Einführung in sinGAN-Tensorflow] Ich habe mit der hochauflösenden "Challenge Big Imayuyu" ♬ gespielt
Ich habe am Wochenende versucht, mit Bitcoin Systre zu beginnen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Vorerst möchte ich jede Datei mit ffmpeg konvertieren !!
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern