Django Rest Auth集成Google登录:邮箱与用户名未存储问题
问题排查与解决方案
你基于AbstractUser扩展用户模型,通过Django Rest Auth实现Google登录时,出现Google账号的邮箱、用户名未存入数据库的问题,可从以下几个方向排查解决:
1. 检查Google OAuth2权限范围配置
必须请求email和profile权限才能获取用户的邮箱、用户名信息,在settings.py中配置:
SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', ], 'AUTH_PARAMS': { 'access_type': 'online', } } }
2. 确认自定义User模型的全局配置
确保settings.py中指定了你的自定义User模型,否则Django会用内置User模型,导致数据存入错误表:
AUTH_USER_MODEL = 'users.User' # 替换为你的app名称.User
3. 修复Social Account用户创建逻辑
Django Rest Auth依赖django-allauth,若默认适配器未正确从Google返回数据中填充字段,可自定义适配器重写save_user方法:
# 在你的app下创建adapter.py from allauth.socialaccount.adapter import DefaultSocialAccountAdapter class SocialAccountAdapter(DefaultSocialAccountAdapter): def save_user(self, request, sociallogin, form=None): user = super().save_user(request, sociallogin, form) extra_data = sociallogin.account.extra_data # 从Google返回的额外数据中提取并赋值 user.email = extra_data.get('email') # 可根据需求生成用户名,比如用邮箱前缀或姓名组合 user.username = extra_data.get('email').split('@')[0] user.full_name = extra_data.get('name') user.save() return user
然后在settings.py中配置该适配器:
SOCIALACCOUNT_ADAPTER = 'users.adapter.SocialAccountAdapter' # 替换为你的适配器路径
4. 验证Google返回的用户数据
调用Google用户信息接口https://www.googleapis.com/oauth2/v1/userinfo?access_token=你的Google令牌,确认返回数据中包含email、name等关键字段,若缺失需检查Google开发者控制台的OAuth2配置。
5. 检查自定义User模型的方法重写
如果你重写了create_user方法或有post_save信号,确保没有忽略email和username的赋值,比如:
class User(AbstractUser): # 你的自定义字段... def create_user(self, username, email=None, password=None, **extra_fields): if not email: raise ValueError('必须设置邮箱字段') email = self.normalize_email(email) user = self.model(username=username, email=email, **extra_fields) user.set_password(password) user.save(using=self._db) return user
内容的提问来源于stack exchange,提问作者Erick Echeverry García
相关产品推荐
相关产品推荐

