Как я могу использовать токен JWT для аутентификации, которую я получаю из моего входа в систему - PullRequest
0 голосов
/ 22 марта 2019

Мне нужно создать аутентификацию токена 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 Ответ

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

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

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

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

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

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',
        ...
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...