Пароль не сохраняется из запроса на регистрацию в django-allauth
У меня есть приложение django, и я использую django-allauth для аутентификации пользователей.Сейчас у меня нет никаких сложных настроек, все, что я пытаюсь сделать, это позволить пользователю зарегистрироваться с помощью электронной почты и пароля и подтвердить свой адрес электронной почты, прежде чем он сможет войти в систему.
Прямо сейчас я тестирую API-интерфейсы через postman, и когда я нажимаю на конечную точку singup, все работает нормально: объект пользователя сохраняется в базе данных с соответствующими полями (адрес электронной почты, номер телефона, роль), но пароль не сохраняется, и из-за этого я не удается войти в систему или выполнить что-либо еще в процессе аутентификации.
Вот мои настройки:
Я использую обезглавленные API, а не обычные.
Это мой settings.py
INSTALLED_APPS = [
....
'allauth',
'allauth.account',
'allauth.headless',
'allauth.usersessions',
]
AUTHENTICATION_BACKENDS = [
# `allauth` specific authentication methods, such as login by email
'allauth.account.auth_backends.AuthenticationBackend',
# Needed to login by username in Django admin, regardless of `allauth`
'django.contrib.auth.backends.ModelBackend'
]
#ALLAUTH SETTINGS
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True
ACCOUNT_SIGNUP_FIELDS = [
'email*',
'phone*',
'password*',
]
ACCOUNT_SIGNUP_FORM_CLASS = "user_onboarding.forms.CustomSignupForm"
ACCOUNT_ADAPTER = 'user_onboarding.adapter.CustomAccountAdapter'
ACCOUNT_LOGIN_METHODS = {"email"}
HEADLESS_ONLY = True
HEADLESS_FRONTEND_URLS = {
"account_confirm_email": "/account/verify-email/{key}",
"account_reset_password": "/account/password/reset",
"account_reset_password_from_key": "/account/password/reset/key/{key}",
"account_signup": "/account/signup",
"socialaccount_login_error": "/account/provider/callback",
}
ACCOUNT_PHONE_VERIFICATION_ENABLED = False
form.py
class CustomSignupForm(forms.Form):
role = forms.CharField(max_length=50)
def signup(self, request, user):
user.role = self.cleaned_data['role']
user.save()
adapter.py
from allauth.account.adapter import DefaultAccountAdapter
class CustomAccountAdapter(DefaultAccountAdapter):
def set_phone(self, user, phone: str, verified: bool):
# map the incoming "phone" value onto your CustomUser.phone_number
user.phone_number = phone
user.save()
def get_phone(self, user):
if user.phone_number:
return user.phone_number, True
return None
urls.py
urlpatterns = [
path('list-urls/', list_urls, name='list_urls'),
path("_allauth/", include("allauth.headless.urls")),
....
]
и это запрос на регистрацию, который я отправляю
curl --location 'http://0.0.0.0:8080/api/_allauth/browser/v1/auth/signup' \
--header 'X-CSRFToken: nALgtSOEx2J0neAIzw2BFASadoM5FwN9' \
--header 'Content-Type: application/json' \
--header 'Cookie: csrftoken=nALgtSOEx2J0neAIzw2BFASadoM5FwN9; sessionid=er7b190l2n04rvif873t2w2x8rkj3i5o' \
--data-raw '{
"email": "umansafor@gmail.com",
"password": "passabcd1",
"phone": "+911234567899",
"role": "USERS"
}'
я получаю 401 неавторизованный ответ на этот запрос, который ожидался, но в базе данных пароль пользователя не сохраняется, все остальные поля сохраняются должным образом
p.s. это моя пользовательская модель
class CustomUser(AbstractBaseUser, PermissionsMixin):
ROLE_CHOICES = [
("USERS", "Users"),
("USER_KIN", "User Kin"),
("CARE_MANAGER", "Care Manager"),
("ADMIN", "Admin"),
("ENG_TEAM", "Engineering Team"),
]
phone_number = models.CharField(max_length=15, unique=True, blank=True, null=True)
email = models.EmailField(unique=True, null=True, blank=True)
username = models.CharField(max_length=50, unique=True)
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default="USERS")
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
def __str__(self):
return self.username