Google登录后Django allauth的SocialTokens表为空问题求助
环境版本
- Python: 3.8.10
- Django: 4.1.7
- django-allauth: 0.54.0
我正在开发需对接企业Google Workspace的网页,已成功实现Google登录功能。现需对接已认证用户的Gmail服务,按理解对接Google应用所需令牌应在登录后自动存入数据库的SocialTokens表。
我已手动配置Sites和Social Application,且登录功能正常,但认证成功后SocialToken模型(对应“Social application tokens”表)仍为空,无法查明原因。
settings.py配置
SITE_ID = 1 INSTALLED_APPS = [ 'django.contrib.admin', ..., 'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth.socialaccount.providers.google', ] SOCIALACCOUNT_PROVIDERS = { 'google':{ 'SCOPE': [ 'profile', 'email', ], 'AUTH_PARAMS': {'access_type':'offline'}, } } SOCIALACCOUNT_STORE_TOKEN = True SOCIALACCOUNT_AUTO_SIGNUP = True
已尝试的操作
- 将django-allauth从0.4升级至0.54
- 调整SOCIALACCOUNT_STORE_TOKEN为False、True及移除配置
- 调整SOCIALACCOUNT_AUTO_SIGNUP为False、True及移除配置
- 尝试上述两个参数的所有组合
- 每次修改后清空数据库、重建超级用户并重新登录(登录均正常)
- 检查Google API的Client ID和密钥配置
- 创建新Site后测试SITE_ID=1和2的情况
- 测试access_type为'offline'和'online'的配置
- 测试开启/关闭HTTPS的环境
- 测试DEBUG=True和False的情况
请问是否存在配置错误、遗漏项或理解偏差?恳请提供帮助,谢谢。
1. 检查Google OAuth重定向URI
确保Google Cloud控制台里,你的OAuth客户端ID的已授权重定向URI包含http(s)://<你的域名>/accounts/google/login/callback/——这是allauth处理Google回调的默认地址,配置错了会直接导致令牌无法存储。
2. 确认数据库迁移完成
虽然你重建过数据库,还是再确认下allauth的迁移是否执行:
python manage.py migrate
如果迁移没跑,SocialToken表可能没正确创建(哪怕你看到表存在,也可能字段不全)。
3. 开启allauth日志排查
在settings.py里添加日志配置,查看登录时的详细流程:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': {'class': 'logging.StreamHandler'}, }, 'loggers': { 'allauth': { 'handlers': ['console'], 'level': 'DEBUG', }, }, }
登录时看控制台输出,找令牌获取、存储阶段的错误信息,比如令牌返回为空、存储时抛异常等。
4. 核对Social Application配置细节
在Django admin的Social Application里确认:
- 选择的站点和settings.py的
SITE_ID完全匹配 - 客户端ID、密钥和Google Cloud控制台的内容完全一致
- 应用类型选的是
Web application
5. 检查自定义适配器是否覆盖存储逻辑
如果你自定义了SocialAccountAdapter,可能不小心覆盖了save_token方法:
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter class MySocialAccountAdapter(DefaultSocialAccountAdapter): def save_token(self, request, token): # 没调用父类方法的话,令牌就不会存进数据库 pass
如果有这类代码,必须加上super().save_token(request, token)。
6. 验证Google是否返回令牌
用信号临时打印Google返回的内容,确认令牌是否存在:
from django.dispatch import receiver from allauth.socialaccount.signals import socialaccount_updated @receiver(socialaccount_updated) def check_token(sender, request, sociallogin, **kwargs): print("返回的令牌:", sociallogin.token)
如果打印为空,问题在Google OAuth配置;如果有令牌但没入库,就是allauth的存储逻辑出问题。
内容的提问来源于stack exchange,提问作者fschicco

