Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EncryptedEmailField() Not Compatible With Allauth Custom User Model #24

Open
9mido opened this issue Mar 21, 2020 · 1 comment
Open

Comments

@9mido
Copy link

9mido commented Mar 21, 2020

This github project's EncryptedEmailField() is not compatible with allauth for encrypting an email during the allauth custom user model sign up process from my website's form. When I create a user from the command line or admin, this github project works perfectly. But when trying to create a user from the allauth sign up form, it gives me this error message:

Error:

django.core.exceptions.FieldError: EncryptedEmailField 'iexact' does not support lookups

I have the following custom user model:

from fernet_fields import EncryptedEmailField

class CustomUserManager(BaseUserManager):
	def _create_user(self, email, password,is_staff, is_superuser, **extra_fields):
		now = timezone.now()
		if not email:
			raise ValueError('The given email must be set')
		email = self.normalize_email(email)
		user = self.model(email=email,is_staff=is_staff, is_active=True,is_superuser=is_superuser, last_login=now,**extra_fields)
		user.set_password(password)
		user.save(using=self._db)
		return user
	def create_user(self, email, password=None, **extra_fields):
		return self._create_user(email, password, False, False,**extra_fields)
	def create_superuser(self, email, password, **extra_fields):
		return self._create_user(email, password, True, True,**extra_fields)

class CustomUser(AbstractBaseUser, PermissionsMixin):
	objects = CustomUserManager()
	email = EncryptedEmailField()
	identifier = models.CharField(unique=True, max_length=50, default=uuid.uuid1)
	username = models.CharField(_('username'), max_length=30, blank=True, default='', unique=True)
	USERNAME_FIELD = 'username'
	first_name = models.CharField(_('first name'), max_length=30, blank=True)
	last_name = models.CharField(_('last name'), max_length=30, blank=True)
	is_staff = models.BooleanField(_('staff status'), default=False,
    	help_text=_('Designates whether the user can log into this admin '
                	'site.'))
	is_mod = models.BooleanField(_('moderator status'), default=False,
    	help_text=_('Designates whether the user can access mod pages and do mod things.'))
	is_active = models.BooleanField(_('active'), default=True,
    	help_text=_('Designates whether this user should be treated as '
                	'active. Unselect this instead of deleting accounts.'))
	EMAIL_FIELD = 'email'
	REQUIRED_FIELDS = ['email']

Allauth files interfering with this:

https://github.com/pennersr/django-allauth/blob/master/allauth/utils.py#L145

https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py#L336

https://github.com/pennersr/django-allauth/blob/master/allauth/account/adapter.py#L300

The main reason I want to do this is to protect myself from PII violations. Since allauth is probably the most popular django authentication package, I think this should be a required fix.

More details:

https://www.reddit.com/r/djangolearning/comments/fm7cnt/custom_user_model_encrypt_email/

I also created this same issue on the allauth github project page.

@Sult
Copy link

Sult commented Jan 10, 2024

The reason this doesnt work (and wont be fixable) is that allauth requires to query the email field for lookups.
You cannot query an encrypted field. Nor index it.

btw, under GDPR you dont have to encrypt email data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants