Getting phone number of user in a django app from google with social_core
Hello I am working on a Django app that have Customuser model and i just save users phone number in the model for some reasons this is my model and manager :
class CustomUserManager(BaseUserManager):
def create_user(self, phone_number, password=None, **extra_fields):
if not phone_number:
raise ValueError('The Phone Number must be set')
user = self.model(phone_number=phone_number, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, phone_number, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(phone_number, password, **extra_fields)
class CustomUser(AbstractBaseUser, PermissionsMixin):
phone_number = models.CharField(max_length=15, unique=True)
email = models.EmailField(unique=True, null=True, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
score = models.PositiveIntegerField(default=10, null=True, blank=True)
objects = CustomUserManager()
USERNAME_FIELD = 'phone_number'
REQUIRED_FIELDS = []
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
Profile.objects.get_or_create(user=self)
def add_score(self, score):
self.score += score
print(self.score)
self.save()
def decrease_score(self, score):
self.score -= score
self.save()
def generate_referral_code(self):
code_length = 19
characters = string.ascii_letters + string.digits
unique_code = ''.join(random.choice(characters) for _ in range(code_length))
while ReferralCode.objects.filter(code=unique_code).exists():
unique_code = ''.join(random.choice(characters) for _ in range(code_length))
ReferralCode.objects.create(user=self, code=unique_code)
def get_referral_code(self):
try:
return self.referralcode.code
except ReferralCode.DoesNotExist:
return None
def __str__(self):
return self.phone_number
i edit my setting.py file for having a pipleline file like this :
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = config("GOOGLE_CLIENT_ID")
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = config("GOOGLE_SECRET")
SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = [
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/user.phonenumbers.read',
]
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.auth_allowed',
'social_core.pipeline.social_auth.social_user',
'social_core.pipeline.user.get_username',
'social_core.pipeline.user.create_user',
'accounts.pipeline.save_profile',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'social_core.pipeline.user.user_details',
)
and in pipeline.py i expect to get user phone number to save in database but i get None also in Json file i dont see any information about user phone neumber how can i get the mobile phone ? thank you
from .models import Profile
import json
def save_profile(backend, user, response, *args, **kwargs):
if backend.name == 'google-oauth2':
print(json.dumps(response, indent=2))
phone_number = response.get('phoneNumber')
print(f"this is phone number{phone_number}")
if phone_number:
user.phone_number = phone_number
user.email = response.get('email')
user.first_name = response.get('given_name')
user.last_name = response.get('family_name')
user.save()
Profile.objects.get_or_create(
user=user,
defaults={
'email': response.get('email'),
'first_name': response.get('given_name', ''),
'last_name': response.get('family_name', '')
}
)