Аутентификация django без пароля

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

Я хотел бы сделать что-то вроде этого...

user = ... # queried the user based on the OpenID response
user = authenticate(user) # function actually requires a username and password
login(user)

Я скорее просто опустил функцию authenticate, но придает поле backend, которое требуется для входа.

Ответ 1

Для этого просто написать собственный аутентификационный сервер. Если вы создадите файл yourapp/auth_backend.py со следующим содержимым:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User


class PasswordlessAuthBackend(ModelBackend):
    """Log in to Django without providing a password.

    """
    def authenticate(self, username=None):
        try:
            return User.objects.get(username=username)
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

Затем добавьте в свой settings.py:

AUTHENTICATION_BACKENDS = (
    # ... your other backends
    'yourapp.auth_backend.PasswordlessAuthBackend',
)

По-вашему, теперь вы можете вызывать аутентификацию без пароля:

user = authenticate(username=user.username)
login(request, user)

Ответ 2

Это немного взломать, но если вы не хотите переписывать кучу вещей, удалите аутентификацию

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

пользователь будет вашим объектом User

Ответ 3

Вы можете легко исправить это, создав собственный сервер аутентификации и добавив его в AUTHENTICATION_BACKENDS.

Есть уже некоторые бэкэнды OpenID, поэтому с небольшим количеством поисков вы можете сэкономить себе трудность писать.