Django JWT Получить информацию о пользователе - PullRequest
0 голосов
/ 18 мая 2018

Я использую аутентификацию Django JWT с Django Rest Framework.
Как я могу получить информацию о пользователе, вошедшем в систему после получения токена?

Ответы [ 4 ]

0 голосов
/ 14 марта 2019

После того, как вы вошли в систему, это означает, что вы аутентифицированы Django, теперь вы можете получить информацию о текущем пользователе в любом месте кода.

request.user

запрос содержитвсе детали пользовательской модели после аутентификации пользователя.в противном случае будет показан пользователь Anonymus.

0 голосов
/ 19 мая 2018

просто проверьте файл настроек вашего приложения, независимо от того, указали вы бэкэнд аутентификации jwt или нет.если там упоминалось и если вы используете модель пользователя (другими словами, django.contrib.auth.models.User) request.user будет работать

Если вы используете свою собственную пользовательскую модель

from django.conf import settings
from rest_framework import authentication
from rest_framework import exceptions
from rest_framework.authentication import get_authorization_header
import CustomUser # just import your model here
import jwt

class JWTAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request): # it will return user object
        try:
            token = get_authorization_header(request).decode('utf-8')
            if token is None or token == "null" or token.strip() == "":
                raise exceptions.AuthenticationFailed('Authorization Header or Token is missing on Request Headers')
            print(token)
            decoded = jwt.decode(token, settings.SECRET_KEY)
            username = decoded['username']
            user_obj = CustomUser.objects.get(username=username)
        except jwt.ExpiredSignature :
            raise exceptions.AuthenticationFailed('Token Expired, Please Login')
        except jwt.DecodeError :
            raise exceptions.AuthenticationFailed('Token Modified by thirdparty')
        except jwt.InvalidTokenError:
            raise exceptions.AuthenticationFailed('Invalid Token')
        except Exception as e:
            raise exceptions.AuthenticationFailed(e)
        return (user_obj, None)

    def get_user(self, userid):
        try:
            return CustomUser.objects.get(pk=userid)
        except Exception as e:
            return None

и добавьте следующие настройки в ваше приложение

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'path_to_custom_authentication_backend',
        ....
    )
}

теперь в каждом представлении / наборе вы можете получить доступ к объекту пользователя с помощью request.user

0 голосов
/ 12 декабря 2018

Если вы знакомы с django rest jwt, вы можете увидеть такую ​​конфигурацию в своих настройках .py:

JWT_AUTH = {
 .....
'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',

'JWT_SECRET_KEY': SECRET_KEY,
....
}

Вы можете просто создать метод, например my_custom_jwt_response_payload_handler, как показано ниже, и адрес JWT_RESPONSE_PAYLOAD_HANDLER для нового обработчика:

def jwt_response_payload_handler(token, user=None, request=None):

return {
    'token': token,
    'user': {
        'username': user.username, 'id': user.id,
        ...
    }
}

Вы можете добавить любые данные, которые вы хотите в этом ответе.затем исправьте settings.py с вашим новым обработчиком:

JWT_AUTH = {
 .....
'JWT_RESPONSE_PAYLOAD_HANDLER':
    'localtion-to-my-own-handler-file.my_custom_jwt_response_payload_handler',
....
}

Для лучшего понимания я предлагаю прочитать исходный код и комментарии для jwt_response_payload_handler в здесь

0 голосов
/ 18 мая 2018

Читая документацию по Аутентификация DRF и, как @neverwalkaloner упоминает в своем комментарии, мы видим, что мы можем получить доступ к экземпляру django.contrib.auth.User вошедшего в систему пользователя в представлении, используя request.userатрибут.

Чтение документации обоих рекомендованных модулей JWT для DRF:

Я не нашел никаких доказательств того, что они меняют / переопределяют метод доступа к информации об экземпляре зарегистрированного пользователя.

...