#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:
Вы создаете токен в этом представлении. После этого вам понадобятся два других механизма:
-
Ваш клиент должен отправлять этот токен API с каждым запросом в заголовке авторизации, например:
Authorization: Bearer your_token
- На стороне 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',
...
]
}