Как я могу использовать токен jwt для аутентификации, который я получаю из моего представления входа в систему

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Мне нужно создать аутентификацию токеном JWT, но я не знаю как, не могли бы вы объяснить мне, как это сделать лучше, или привести несколько примеров?

мое представление:

 class UserLogin(generics.CreateAPIView):
    """
    POST auth/login/
    """
    # This permission class will overide the global permission
    # class setting
    permission_classes = (permissions.AllowAny,)

    queryset = User.objects.all()
    serializer_class = TokenSerializer

    def post(self, request, *args, **kwargs):
        username = request.data.get("username", "")
        password = request.data.get("password", "")

        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return Response({
                "token": jwt_encode_handler(jwt_payload_handler(user)),
                'username': username,
            }, status=200)
        return Response(status=status.HTTP_401_UNAUTHORIZED)
  

Комментарии:

1. Проверьте этот пакет: simplejwt

Ответ №1:

Вы создаете токен в этом представлении. После этого вам понадобятся два других механизма:

  1. Ваш клиент должен отправлять этот токен API с каждым запросом в заголовке авторизации, например:

     Authorization: Bearer your_token
      
  2. На стороне api вам нужно использовать класс аутентификации, который ищет заголовок авторизации, принимает токен и декодирует его, и находит экземпляр пользователя, связанный с токеном, если токен действителен.

Если вы используете библиотеку для аутентификации drf jwt, в ней должен быть класс аутентификации, который вы можете использовать. Если вы реализуете его вручную, вам нужно самостоятельно написать класс аутентификации, который является подклассом класса BaseAuthentication DRF. В основном это могло бы выглядеть так:

 class JwtAuthentication(authentication.BaseAuthentication):

    def authenticate(self, request):

        auth_header = request.META.get('HTTP_AUTHORIZATION')
        if auth_header:
            key, token = auth_header.split(' ')

            if key == 'Bearer':
                # Decode the token here. If it is valid, get the user instance associated with it and return it
                ...
                return user, None

                # If token exists but it is invalid, raise AuthenticationFailed exception

                # If token does not exist, return None so that another authentication class can handle authentication
  

Вам нужно указать DRF использовать этот класс аутентификации. Добавьте это в свой файл настроек для этого:

 REST_FRAMEWORK = {
    ...    
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'path.to.JwtAuthentication',
        ...
    ]
}