2010-09-27 2 views
10

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

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

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

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

Как это получить?

+0

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

ответ

4

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

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

бэкэнд аутентификации является классом , который реализует два метода: get_user (user_id) и аутентификацию (** мандатных).

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

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

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

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

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

+0

Вы серьезно? Это не относится к написанию собственного бэкэнда! Если он хотел бы использовать то есть. OpenID или аутентификация из других источников - это нормально, но не в этом случае - это было бы излишним! – bx2

+1

«Ссылки включают одноразовый ключ, который я проверяю« Он в основном выполняет проверку подлинности на токенах, что является идеальным вариантом использования для вашего собственного бэкэнда. –

+0

Мне нравится эта идея, но, похоже, нет способа указать бэкэнд при вызове authenticate(). Я не хочу добавлять бэкэнд токена в settings.AUTHENTICATION_BACKEND, потому что водопад аутентификации не подходит. Я только хочу, чтобы аутентифицироваться против токена.Я предполагаю, что я вручную создам экземпляр брандмауэра, сделаю аутентификацию, а затем вручную настрою user.backend, как описано в ответе rekmulk. – limscoder

1

Посмотрите на django-registration приложение, это именно то, что вам нужно :)

Edit:

Новая ссылка на django-registration repo

+0

Репо больше не существует. – AliBZ

+0

@AliBZ, как вы можете видеть, это сообщение было от 2010 года (6 лет назад!) - несуществующий репо не является поводом для downvote ... Просто прокомментируйте новую ссылку и не будьте ad * ck :) Особенно что старая ссылка говорит вам, куда идти - просто научитесь читать: https://github.com/ubernostrum/django-registration ... Я обновил ответ сейчас. – bx2

+0

Я d * ck, поэтому я не удалю свой нисходящий! Просто шучу;) Спасибо за новую ссылку. – AliBZ

0

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

+0

Это, вероятно, лучшая идея для второго случая, который я перечислил, но для первого случая я хотел бы, чтобы пользователь автоматически регистрировался, как только они нажали ссылку активации. Я не могу придумать какой-либо веской причины, чтобы заставить их вводить свое имя пользователя и пароль снова после активации. – limscoder

4

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

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

17

Вы можете использовать метод, описанный here в документации 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) 
+0

Я сделал это, но не знаю, почему, в более позднем запросе XHR, Django установил идентификатор сеанса в cookie на пустую строку, таким образом, выйдет пользователь. Можешь мне сказать почему? – jcyrss

+0

Хотел бы я. Я не работал с Django через несколько лет, так что я немного не связан с вещами. – supersighs

+0

ОК, в любом случае, спасибо. – jcyrss

1

Вы можете использовать ska пакет, который имеет беспарольный вход Джанго реализован. 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, если они существуют (имя пользователя матч), или в противном случае - создано: , Существует 3 обратных вызова, которые вы можете настроить в настройках Django вашего проекта.

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

См. Документацию (http://pythonhosted.org/ska/) для получения дополнительной информации.

Смежные вопросы