You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:42:36