Как модерировать django_openid_auth
Я реализую функцию openid с использованием библиотеки django_openid_auth, что довольно удивительно. Однако я ищу очень специфические настройки модерации.
Хотя openid доступен для всех.
- OpenId должен предоставить адрес электронной почты. Не все ребята предоставляют
- Адрес электронной почты должен быть одним из списка разрешенных прав доступа, присутствующего в моей базе данных
Я начал думать о вполне возможных способах, таких как создание пользовательского промежуточного программного обеспечения, пользовательского декоратора login_required и т. Д. Но я не могу придумать возможный способ вписать их точно в счет.
Может кто-нибудь добавить предложения будут оценены
1 ответ
Получение адреса электронной почты достаточно просто - вам просто нужно запросить у openid server. django-openid-auth предоставляет настройки для этого:
OPENID_SREG_EXTRA_FIELDS = ['email']
В моем проекте мне также нужно было делать дополнительные вещи после аутентификации. Я решил это с сигналом:
def register_login_signal():
from django.contrib.auth.signals import user_logged_in
from django.contrib.auth.models import User
user_logged_in.connect(your_function_name_here, sender = User)
def your_function_name_here(sender, **kwargs):
request = kwargs.get('request')
logout(request) if request.user.email not in your_list_of_authenticated_emails else pass
и не забудьте поместить register_login_signal() в какое-то место, где он будет использоваться, как проекты.py файл
Редактировать:
1-й комментарий / вопрос.
Часть дополнительных полей не указана в документации. Кроме того, если вы сканируете пакет github, вы ничего такого не замечаете, я уверен. Я использую старую версию https://pypi.python.org/pypi/django-openid-auth/0.5. Загрузите его, распакуйте и откройте views.py в папке django-openid-auth. Найдите OPENID_SREG_EXTRA_FIELDS, и вы увидите его. Работает как шарм, если вы определите его в settings.py.
2-й вопрос
Асинхронный? Нет, не совсем. Async будет работать вне текущего стека функций - если вы можете описать это так. Это не так. Представьте себе это так - в конце функции входа в систему есть проверка, что если есть какие-то функции, подключенные к концу функции входа в систему. И они бегут мгновенно. Это так же асинхронно, как и промежуточное программное обеспечение Django. Так что совсем нет.
Но это правильное место, чтобы сделать это? Я полагаю, что у вас есть настроенный сайт, который вы проверяете, зарегистрировался ли пользователь с @login_required decorator или что-то в этом роде.
Итак, давайте посмотрим, как все будет выполнено:
1) Ваш сервер openid отправляет вам всю информацию, которую вы запрашивали с помощью последнего запроса
2) Ваше представление django-openid-auth login_complete вступает во владение и аутентифицирует пользователя, используя его бэкэнд
3) в конце этого процесса срабатывает сигнал, который вы прослушиваете, электронная почта пользователя проверяется по вашему списку, и если проверка не проходит, он сразу же выходит из системы.
4) Поскольку представление завершено, оно автоматически перенаправляет вас либо на URL, который был указан в исходном представлении с параметром "next", либо на LOGIN_REDIRECT_URL, указанный в ваших настройках.
5) Перед этим просмотрите все промежуточное ПО и декораторы. И если вы использовали что-то вроде @login_required decorator (что разумно сделать для каждой защищенной страницы входа в систему), то он мгновенно перенаправляет пользователя на страницу входа. Если вам нужно добавить какое-либо сообщение для запроса в сигнале, то это сообщение отображается (учитывая, что ваша страница входа / выхода поддерживает это)
И сказать что-то в конце - нет более сильного метода, чем выход из системы.
/редактировать