Django не проверяет подлинность маркера доступа
Я использую JWT для аутентификации пользователей, при обращении к конечной точке login я получаю следующий вывод в Postman
{
"message": "Login successful",
"user_id": 2,
"username": "Animesh0764",
"tokens": {
"refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTczNjU5MTAxNywiaWF0IjoxNzM1Mjk1MDE3LCJqdGkiOiI4YmJhMTczZmZkNDg0OWIzODU3YTZkMDE1MDZlNzM2ZCIsInVzZXJfaWQiOjJ9.-wX6S9yxNgFCjIR8Tu0FRc-Q2ivFDMVJouXkKkjDNtI",
"access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzM1Mjk1OTE3LCJpYXQiOjE3MzUyOTUwMTcsImp0aSI6IjdhOWU3ZDA0NTllNzQxMzFhNDM1MWVlZjVkOWRiODcyIiwidXNlcl9pZCI6Mn0.LI6afRT66MFWTpomo1E9BHn5JTrRuGoTeX0EEwMRFvQ"
}
}
При использовании этого токена доступа в представлении Bearer for Profile отображается:
{
"detail": "User not found",
"code": "user_not_found"
}
Посетил jwt.io и проверил свой токен, все вроде бы в порядке, он показывает правильный user_id, но все равно не проверяет. Представления для обоих вариантов приведены ниже
#Login user
class UserLoginView(APIView):
def post(self, req):
serializer = UserLoginSerializer(data=req.data)
if serializer.is_valid(raise_exception=True):
user = serializer.validated_data['user']
return Response({
"message": "Login successful",
"user_id": user.id,
"username": user.username,
"tokens": get_tokens_for_user(user)
}, status=HTTP_200_OK)
return Response(
{"message": "Login failed"},
status=HTTP_400_BAD_REQUEST
)
#View user profile
class UserProfileView(APIView):
permission_classes = [IsAuthenticated]
def get(self, req):
print(f"Request user: {req.user}")
print(f"User authenticated: {req.user.is_authenticated}")
if req.user.is_authenticated:
user = req.user
serializer = UserProfileSerializer(user)
return Response(serializer.data, status=HTTP_200_OK)
return Response({"message": "Unauthorized"}, status=HTTP_401_UNAUTHORIZED)
Он должен проверить токен и затем показать ответ 200, но всегда показывает 401 Unauthorized
Добавил все необходимое в settings.py
файл
можете ли вы предоставить весь код setting.py, view.py и urls.py
Прежде всего, посмотрите на свои настройки и перейдите к этому
` section.AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend'
] ` И что делать? Существует ли этот раздел или нет? Если да, то каков его порядок? В каком бы порядке он ни был установлен, не говорите ему аутентифицироваться, он будет действовать в том порядке, в котором он находится в этом списке. Теперь, если вы хотите использовать пользовательскую систему аутентификации, нам нужно добавить ее. Например, создайте в приложении секцию аутентификации для логики карты и поместите ее перед вашей системой аутентификации, как показано ниже:
` AUTHENTICATION_BACKENDS = [
'authenticate.backends.OTPBackend',
'django.contrib.auth.backends.ModelBackend'
] ` На примере Форекса вы можете использовать этот код
` class OTPBackend(BaseBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
otp = kwargs.get('otp')
phone_number = kwargs.get('phone_number')
`