Вход в Django без аутентификации

У меня есть приложение Django, в котором есть два случая использования, когда я хочу, чтобы пользователь мог войти без пароля.

  • Пользователь регистрирует и получает ссылку активации по электронной почте.
  • Пользователь сбрасывает пароль и получает ссылку на изменение формы пароля по электронной почте.

В ссылках используется одноразовый ключ, который я проверяю, а затем я хочу войти в систему без использования учетных данных.

# This raises an exception unless
# I call user.authenticate 1st.
auth.login(request, user)

Как это сделать?

Ответ 1

Вы можете написать свой собственный бэкэнд для аутентификации, который обрабатывает ваши два варианта использования. См. Документы по написанию и использованию пользовательского архива: http://docs.djangoproject.com/en/1.2/topics/auth/#other-authentication-sources

EDIT: Похоже, что может быть какое-то неправильное представление о том, как трудно было бы написать собственный собственный сервер. Из документов:

Бэкэнд аутентификации - это класс который реализует два метода: get_user (user_id) и аутентификации (** учетные данные).

Это правильно. Это любой класс, который реализует две функции, которые возвращают объекты User.

Метод get_user принимает user_id - который может быть именем пользователя, идентификатором базы данных или что-то еще - и возвращает пользователя объект.

... аутентификация должна проверять учетные данные, которые он получает, и он должен вернуть объект User, который соответствует эти учетные данные, если учетные данные действительны. Если они недействительны, должен возвращать None.

OP уже заявил, что ссылки содержат одноразовые ключи, которые он проверяет (и предположительно связан с пользователем, которого он хочет зарегистрировать). Другими словами, он уже написал бизнес-логику для бэкэнда, ему просто нужно было преобразовать его в подходящий класс.

Пользовательские серверы аутентификации могут выполнять ряд удивительных вещей в Django 1.2, например, разрешения на уровне объектов, но они не должны быть такими сложными. Кроме того, они складываются, поэтому вы можете смешивать свою аутентификацию на основе токенов с бэкэндом по умолчанию или OpenID или Facebook. Но, в конце концов, auth-бэкенд просто класс с двумя методами, и я не вижу, как вы можете назвать это излишним.

Ответ 2

Вы можете использовать описанный метод здесь в документах Django. Вы хватаете своего пользователя на основе используемого вами одноразового ключа и вызываете логин (запрос, пользователь). Ловушка здесь заключается в том, что вам нужно вручную указать сервер аутентификации, потому что вы сначала не вызываете authenticate().

from django.contrib.auth import login

def my_view(request):

    // your user retrieval code
    ...

    user.backend='django.contrib.auth.backends.ModelBackend'
    login(request, user)

Ответ 3

Здесь у вас есть рабочий фрагмент, который вводит пользователя в действие без требуемых учетных данных.

http://djangosnippets.org/snippets/1547/

Ответ 5

Вы можете использовать пакет ska, в который введен пароль без пароля для Django. ska работает с токенами аутентификации, а его "безопасность" основана на SHARED_KEY, который должен быть равен всем вовлеченным сторонам (серверам).

На стороне клиента (сторона, которая запрашивает пароль без пароля) вы создаете URL-адрес и подписываете его, используя ska. Пример:

from ska import sign_url
from ska.contrib.django.ska.settings import SECRET_KEY

server_ska_login_url = 'https://server-url.com/ska/login/'

signed_url = sign_url(
    auth_user = 'test_ska_user_0',
    secret_key = SECRET_KEY,
    url = server_ska_login_url
    extra = {
        'email': '[email protected]',
        'first_name': 'John',
        'last_name': 'Doe',
    }
    )

Время жизни по умолчанию токена составляет 600 секунд. Вы можете настроить это, указав аргумент lifetime.

На стороне сервера (на сайте, к которому пользователь входит в систему), имея в виду, что вы правильно установили ska, пользователь регистрируется при посещении URL-адреса, если они существуют (совпадение имени пользователя) или создается иным образом. В настройках проекта Django можно настроить три обратных вызова.

USER_GET_CALLBACK (строка): вызывается, если пользователь был успешно извлечен из базы данных (существующий пользователь). USER_CREATE_CALLBACK (строка): срабатывает сразу после создания пользователя (пользователь не существует). USER_INFO_CALLBACK (строка): вызывается при успешной аутентификации.

Подробнее см. документацию (http://pythonhosted.org/ska/).

Ответ 6

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