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

使用dj-rest-auth实现Google登录时遭遇OAuth2Error问题求助

解决dj-rest-auth Google认证参数错误问题

1. 修正Google OAuth2核心配置

确保settings.py中SOCIALACCOUNT_PROVIDERS的Google配置开启id_token验证,且客户端信息与Google开发者后台完全匹配:

SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'APP': {
            'client_id': '你的Google Client ID',
            'secret': '你的Google Client Secret',
            'key': ''
        },
        'AUTH_PARAMS': {'access_type': 'online'},
        'SCOPE': ['profile', 'email'],
        'VERIFIED_EMAIL': True,
        'ID_TOKEN_AUTH_ENABLED': True,  # 必须开启,否则无法识别id_token参数
    }
}

2. 使用正确的认证接口

dj-rest-auth 5.x版本中,id_token认证需调用/auth/google/token/接口,而非/auth/google/(后者用于authorization code模式,需传code参数):

  • 请求方式:POST
  • 请求体(JSON格式):
    {
        "id_token": "前端获取的Google idToken"
    }
    

3. 验证idToken有效性

  • 确认前端获取的idToken来自官方认证流程,未被篡改,且aud字段完全匹配你的Google Client ID(可通过Google Tokeninfo端点手动验证)
  • 检查idToken是否过期(Google idToken有效期为1小时)

4. 补全必要的全局配置

  • 确保INSTALLED_APPS包含所有依赖应用:
    INSTALLED_APPS = [
        # ... Django默认应用
        'rest_framework',
        'rest_framework.authtoken',
        'dj_rest_auth',
        'django.contrib.sites',
        'allauth',
        'allauth.account',
        'allauth.socialaccount',
        'allauth.socialaccount.providers.google',
        'dj_rest_auth.registration',
    ]
    
  • 配置SITE_ID = 1(django-allauth强制要求)
  • 配置REST_AUTH序列化器:
    REST_AUTH = {
        'SOCIAL_LOGIN_SERIALIZERS': {
            'google': 'dj_rest_auth.registration.serializers.GoogleLoginSerializer',
        },
    }
    

5. 修正URL路由配置

确保urls.py中注册了idToken认证专用视图:

from django.urls import path, include
from dj_rest_auth.registration.views import SocialLoginView
from allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter
from dj_rest_auth.registration.serializers import GoogleLoginSerializer

class GoogleLogin(SocialLoginView):
    adapter_class = GoogleOAuth2Adapter
    serializer_class = GoogleLoginSerializer

urlpatterns = [
    # ... 其他路由
    path('auth/', include('dj_rest_auth.urls')),
    path('auth/registration/', include('dj_rest_auth.registration.urls')),
    path('auth/google/token/', GoogleLogin.as_view(), name='google_login'),
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:42:43