Как объект запросов находит имя пользователя, связанное с конкретным токеном, прошедшим через Django REST Framework TokenAuthentication - PullRequest
0 голосов
/ 23 октября 2019

Я использую TokenAuthentication, предоставленную Django REST Framework, и следую этой статье https://simpleisbetterthancomplex.com/tutorial/2018/11/22/how-to-implement-token-authentication-using-django-rest-framework.html

При отправке токена в заголовке я не указываю пользователя, для которого сгенерировал токен, но он автоматическивыбирая правильного пользователя. Мне интересно, как это работает?

Это вызов, который я делаю (обратите внимание, я передаю только токен, а не имя пользователя, связанное с токеном)

r = requests.post(url, headers={Authentication: 'Token my_token'}, data=data)

Я создаю токен с помощьюкоманда manage.py, передающая определенное имя пользователя.

1 Ответ

0 голосов
/ 23 октября 2019

Так почему бы просто не взглянуть на реализацию TokenAuthentication?

Если вы посмотрите на реализацию, вы найдете следующий authenticate метод. Как мы видим, токен хранится в БД вместе с пользователем.

authenticate метод просто извлекает и проверяет токен, а authenticate_credentials фактически проверяет таблицу, если токен существует.

def authenticate(self, request):
    auth = get_authorization_header(request).split()

    if not auth or auth[0].lower() != self.keyword.lower().encode():
        return None

    if len(auth) == 1:
        msg = _('Invalid token header. No credentials provided.')
        raise exceptions.AuthenticationFailed(msg)
    elif len(auth) > 2:
        msg = _('Invalid token header. Token string should not contain spaces.')
        raise exceptions.AuthenticationFailed(msg)

    try:
        token = auth[1].decode()
    except UnicodeError:
        msg = _('Invalid token header. Token string should not contain invalid characters.')
        raise exceptions.AuthenticationFailed(msg)

    return self.authenticate_credentials(token)

def authenticate_credentials(self, key):
    model = self.get_model()
    try:
        token = model.objects.select_related('user').get(key=key)
    except model.DoesNotExist:
        raise exceptions.AuthenticationFailed(_('Invalid token.'))

    if not token.user.is_active:
        raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))

    return (token.user, token)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...