Рубрики
Без рубрики

JSON Web Token Authentication Backend для проекта Django

Комплексный учебник JSON Web Token. Tagged с Python, Django, JWT.

В нашем Последний пост Мы дали подробное описание токенов JSON Web. В этом посте мы собираемся показать образец механизма аутентификации веб -токена JSON с веб -структурой Django.

OWASP Определяет аутентификацию как процесс проверки того, что лицо, субъект или веб -сайт – это то, кем он утверждает. Аутентификация в контексте веб -приложений обычно выполняется путем отправки имени пользователя или идентификатора и одного или нескольких элементов частной информации, которые должен знать только данный пользователь.

Http по своей природе не имеет состояния, независимо от бэкэнда. Следовательно, большинство веб -фреймворков поставляются с функцией управления аутами и сеансами. В типичном случае браузер-сервер; Браузер управляет списком паров ключей/значений, известных как файлы cookie, для каждого домена. Сервер (чтение) можно получить с помощью файлов cookie, анализируя заголовок HTTP -запроса cookie. Этими файлами cookie можно управлять сервером (создать, изменять, удалить), используя заголовок Set-Cookie Httpresponse.

Сметные фреймворки, нацеленные на веб-нацеливание, предоставляют функции для работы с файлами cookie на более высоком уровне, давайте посмотрим на Django.

Джанго встроен в аутентификацию

У Джанго есть сессия и Аутентификация Управление встроено. Он заботится о сеансе и Auth через Middlewares, которые изменяют входящие запросы и исходящие ответы.

Джанго сеанс промежуточное программное обеспечение принимает входящий запрос Ищите ключ сеанса в файлах cookie запроса, а затем устанавливает запрос. Если сеанс запроса изменен, или если конфигурация должна сохранять сеанс каждый раз, он сохраняет изменения и устанавливает файл cookie сеанса или удаляет, если сеанс был опустошен.

Auth Middleware Устанавливает request.user на Lazyuser. Lazyuser здесь используется для задержки экземпляра обернутого класса. Когда доступ quest.user – скажем, @login_required Decerator – Lazyuser вызывает django.contrib.auth.get_user (), проходя в запросе; get_user () вытаскивает информацию из сеанса и, если пользователь аутентифицирован, возвращает соответствующий экземпляр пользователя. Однако, если для пользователя нет данных сеанса, предпринимается попытка аутентификации пользователя.

Как мы проверяем подлинность пользователя?

Учитывая определение учетных данных (имя пользователя и пароль), мы называем django.contrib.auth.autenticate (** учетные данные). Эта функция возвращает пользовательский объект, если успешно, или нет, если учетные данные не были правильными.

Учитывая аутентифицированный пользовательский объект, мы называем django.contrib.auth.login (запрос, пользователь). Это хранит бэкэнд аутентификации и идентификатор пользователя в сеансе. Поскольку одна из изменений в сеансе модифицируется, request.session должен быть обновлен, это делается с помощью Process_response в Промежуточное программное обеспечение Анкет

Пользовательский бэкэнд аутентификации в Джанго

У Джанго легко расширяется бэкэнд аутентификации. Это позволяет изменить то, что метод проверяет учетные данные нашего пользователя. Примером этого является создание бэкэнда социальной аутентификации. Поставщики OAuth, такие как Facebook, предоставляют подробную информацию о аутентифицированном пользователе. Но чтобы поддерживать декоратор login_required или использовать переменную request.user, нам все еще нужно, чтобы они вошли в Django. Это то, что может быть достигнуто с помощью пользовательского бэкэнда автоза.

Давайте внедрим базовый бэкэнд на пользовательском авторитете, где пароль всех пользователей – Alphaq.

Имя пользователя: альфа -пароль: Альфапас

    # import the User object
    from django.contrib.auth.models import User

    # Define backend class
    class BasicCustomBackend(object):

        # Create an authentication method
        def authenticate(self, username=None, password=None):

        try:
            # Try to find a user matching the username provided
            user = User.objects.get(username=username)

            # if successful return user if not return None
            if password == 'alphapass':
                return user
            else:
                return None
        except User.DoesNotExist:
            # No user was found
            return None

        # Required for the backend to work properly
        def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

И в настройках. мы добавляем

AUTHENTICATION_BACKENDS = ( 'path.to.Backend', )

Этот бэкэнд не подходит для использования в производстве, но достаточно хорош, чтобы демострифицировать пользовательский бэкэнд. См. Официальные документы Анкет

Jwt и django auth

Теперь, когда мы поняли, основной процесс аутентификации в Django и написал пользовательский бэкэнд автоза. Давайте перейдем к написанию пользовательского бэкэнда на основе JSON Web Tokens. Чтобы освежить, как работает jwt auth, будет хорошо прочитать наш Статья о jwt Анкет

Как видно из статьи, есть четыре шага:

  1. Браузеры отправляют запрос сообщения с именем пользователя и паролем на сервер.

  2. Сервер создает токен и возвращается в браузер.

  3. Браузер отправляет токен в заголовках.

  4. Сервер проверяет токен и возвращает защищенную информацию в ответе.

Наличие аутентификации на основе токенов требует следующих шагов:

  1. Библиотека Python для генерации и проверки JWT, мы будем использовать Python-Jose Анкет

  2. Представление Django, которое берет имя пользователя и пароль и возвращает токен.

    from jose import jws
    from django.http import HttpResponse
    import datetime
    from django.contrib.auth import authenticate

    def create_jwt(request):

        """
        the above token need to be saved in database, and a one-to-one
        relation should exist with the username/user_pk
        """

        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        expiry = datetime.date.today() + timedelta(days=50)
        token = jws.sign({'username': user.username, 'expiry':expiry}, 'seKre8',  algorithm='HS256')

    return HttpResponse(token)
  1. Пользовательский бэкэнд для AUTH для токенов
    class JWTAuthentication(object):

        """
        Simple token based authentication.
        Clients should authenticate by passing the token key in the "Authorization"
        HTTP header, prepended with the string "Token ".  For example:
        Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a
        """

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

        if not auth or auth[0].lower() != b'token':
            return None

        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, payload):

        decoded_dict = jws.verify(payload, 'seKre8', algorithms=['HS256'])

        username = decoded_dict.get('username', None)
        expiry = decoded_dict.get('expiry', None)

        try:
            usr = User.objects.get(username=username)
        except model.DoesNotExist:
            raise exceptions.AuthenticationFailed(_('Invalid token.'))

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

        if expiry < datetime.date.today():
            raise exceptions.AuthenticationFailed(_('Token Expired.'))

        return (usr, payload)

        def authenticate_header(self, request):
        return 'Token'

Надеюсь, приведенная выше статья показывает, как реализовать JWT с Django. Вышеуказанные шаги представлены только с целью демонстрации и не должны использоваться в производстве. Ниже приведены среди популярных библиотеков помощь с аутентификацией на основе токенов:

Django-Rest ЗНАЙТЕ

Django-jwt-Auth

Надеюсь, статья помогла. Не стесняйтесь отправлять свои мысли в комментариях.

Статья первоначально появилась на Apcelent Tech Blog Анкет

Оригинал: “https://dev.to/apcelent/json-web-token-based-authentication-backend-for-django-project-3n90”