Вместо
return Response({'error': 'Token does not exist'}, status=HTTP_401_UNAUTHORIZED)
используйте эту
raise NotAuthenticated(detail='Token does not exist')
Надеюсь, что над строкой адресован ваш 1-й вопрос.
Для 2-го вопроса. Вы можете расширить TokenAuthentication
и затем реализовать метод def authenticate_credentials(self, key):
. Не рекомендуется вызывать внешний API для выборки пользователя каждый раз . Скорее вы должны получить токен JTW один раз из внешнего источника, а затем передать токен JWT в заголовке, например Authorization : Bearer cn389ncoiwuencr
, для каждого вызова API. Затем вы должны декодировать токен JWT в текущей системе.
from rest_framework.authentication import TokenAuthentication
from django.contrib.auth import get_user_model
class CustomTokenAuthentication(TokenAuthentication):
keyword = 'Bearer' # token type
def authenticate_credentials(self, key):
#decode JWT.
username = get_username()
User = get_user_model()
user = User(username=username)
return user, key
Наконец, добавьте этот класс в файл settings.py.
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'path.of.CustomTokenAuthentication',
)
}
Это будет применяться ко всем вашим представлениям. или вы можете применить спецификацию вида c auth class.
class Sample(ViewSet):
authentication_classes = (CustomTokenAuthentication,)
Теперь вы можете получить доступ к пользователю с помощью request.user
в представлениях или наборе. Вот и все.