Самостоятельная аутентификация ссылок в Django - PullRequest
2 голосов
/ 16 апреля 2010

В моем веб-приложении я хотел бы иметь возможность отправлять пользователям ссылки для самоидентификации. Эти ссылки будут содержать уникальный токен (uuid). Когда они нажимают на ссылку, токена, присутствующего в строке запроса, будет достаточно для их аутентификации, и им не нужно будет вводить свое имя пользователя и пароль.

Какой лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2010

Это довольно распространенная задача, если у вас истек срок действия ссылок :). Вам потребуется реализовать собственный бэкэнд аутентификации. Вместо проверки имени пользователя и пароля вы будете проверять auth_link.

class AuthLinkBackend(object):
  def authenticate(auth_link = None):
    if auth_link:
      # validate and expire this link, return authenticated user if successful
      return user

Добавьте свой бэкэнд-класс в список бэкэндов (настройка AUTHENTICATION_BACKENDS).

В представлении проверки ссылки вы должны попытаться аутентифицировать пользователя и, если это удалось, войдите в него / нее:

user = auth.authenticate(auth_link=link)
if user:
  auth.login(request, user)
1 голос
/ 16 апреля 2010

По мнению Т. Стоуна, конечные пользователи печально известны тем, что обмениваются ссылками - ОСОБЕННО те, кто находится в сети. Наличие чего-то, что аутентифицировало пользователя автоматически, означает, что я могу почти гарантировать, что вы, по крайней мере, один человек вошли как кто-то еще.

Есть, конечно, более эффективные способы обновления сеанса пользователя из информации Cookie, так что вы, по крайней мере, хорошо представляете себе, что он является действительным пользователем, подключенным к действительному браузеру, и может чувствовать себя ЧЕМ-то более безопасным, чем когда-либо. маловероятно, что они получат свои ноутбуки со ссылкой, но да ... повторюсь, то, что вы пытаетесь сделать, ОЧЕНЬ плохая идея, если в вашем приложении более 1 пользователя.

1 голос
/ 16 апреля 2010

С точки зрения безопасности это выглядит как действительно плохая идея .

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

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

(не проверено, но общая идея)

import base64

class UUIDQueryStringMiddleware(object):

    def process_request(request):

        if request.method == 'GET':
            if not request.user.is_authenticated():
                uuid = request.REQUEST.get('u', None)
                if uuid:
                    username = base64.b64decode(uuid)
                    try:
                        user = User.objects.get(username=username)
                        request.user = user
                    except:
                        pass

        # Pass the original request back to Django
        return request

Затем вам потребуется настроить это промежуточное ПО для запуска до запуска промежуточного ПО для аутентификации и сеансов ...

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'yourapp.middleware.UUIDQueryStringMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)

См. Этот вопрос для получения дополнительной информации о кодировании / декодировании: шифрование и дешифрование строк в python

Я действительно надеюсь, что вы не собираетесь использовать это на живом сайте.

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