使用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
相关产品推荐
相关产品推荐

