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

使用django-social-auth获取Google ID Token遇问题求助

解决django-social-auth获取Google ID Token的问题

我来帮你搞定这个获取Google ID Token的问题!结合你的配置,主要是几个关键项没调整到位,以下是具体的修复步骤:

1. 补充OpenID Connect核心Scope

Google的ID Token是基于OpenID Connect协议的,必须添加openid这个核心Scope才能触发ID Token的返回。修改你的Scope配置:

SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPES = (
    'openid',  # 这行是获取ID Token的关键,必须添加
    'https://www.googleapis.com/auth/plus.login',
    'https://www.googleapis.com/auth/plus.me',
    'https://www.googleapis.com/auth/userinfo.email',
    'https://www.googleapis.com/auth/userinfo.profile',
    'email'
)

2. 调整授权请求的响应类型

需要明确告诉Google授权服务器,我们需要返回id_token。更新AUTH_EXTRA_ARGUMENTS配置:

SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {
    'access_type': 'offline',
    'response_type': 'code id_token',  # 同时请求授权码和ID Token
    'prompt': 'select_account'  # 可选,强制用户选择账号,避免缓存导致的异常
}

3. 配置EXTRA_DATA存储ID Token

要让django-social-auth把返回的ID Token保存到用户的社交关联数据里,需要在EXTRA_DATA中指定该字段:

SOCIAL_AUTH_GOOGLE_OAUTH2_EXTRA_DATA = [
    ('id', 'id'),
    ('id_token', 'id_token'),  # 添加这行,将返回的id_token映射存储
    ('refresh_token', 'refresh_token')  # 可选,若需要离线刷新令牌可保留
]

4. 如何获取存储的ID Token

认证完成后,你可以通过用户的社交关联对象获取ID Token,示例代码如下:

from social_django.models import UserSocialAuth

# 假设当前请求的用户已完成认证
user = request.user
try:
    google_auth = UserSocialAuth.objects.get(user=user, provider='google-oauth2')
    id_token = google_auth.extra_data.get('id_token')
    # 这里就拿到了长JWT格式的ID Token
except UserSocialAuth.DoesNotExist:
    # 处理用户未关联Google账号的情况
    pass

额外注意点

  • 确保你的Google Cloud Console中,OAuth2客户端ID的授权重定向URI已添加项目的回调地址(通常是/complete/google-oauth2/)
  • ID Token默认有效期为1小时,若需要长期使用API,要配合refresh_token来获取新的ID Token
  • 如果你使用的是较新版本的python-social-auth(原django-social-auth),确认requests-oauthlib依赖版本兼容

内容的提问来源于stack exchange,提问作者Mike Nachtigaal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:49:06