Аутентификация 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, поэтому с небольшим количеством поисков вы можете сэкономить себе трудность писать.