使用django-rest-social-auth实现Google登录时遭遇HTTP 400错误求助
首先,HTTP 400错误在这里基本都是参数不匹配、配置错误或者code本身无效导致的,结合你提到服务器能接收到提交的数据,咱们可以从这几个方向逐一排查:
参数名或取值不符合库的要求
这个库对Google登录的参数有明确规范:provider参数必须填google-oauth2(不能是google或其他简写)- 客户端ID的参数名应该是
client_id(下划线分隔,不是驼峰式的clientId) - 记得提交
grant_type=authorization_code,部分OAuth2流程需要这个参数明确授权类型
redirect_uri完全不匹配
Google OAuth2要求你提交的redirect_uri必须和Google开发者控制台里配置的完全一致——包括协议(http/https)、域名、路径,甚至结尾的斜杠都不能有差异。比如控制台里是http://localhost:8000/auth/google/callback,你提交成http://localhost:8000/auth/google就会直接触发错误。Authorization Code已失效或重复使用
Google的授权code只能使用一次,且有效期仅约10分钟。如果你之前用这个code测试过一次,或者拿到code后隔了太久才提交,都会导致验证失败返回400。建议重新获取一次code再测试。Django配置错误
检查你的Djangosettings.py里的社交认证配置是否正确:SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "你的Google客户端ID" SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "你的Google客户端密钥" SOCIAL_AUTH_GOOGLE_OAUTH2_REDIRECT_URI = "和控制台一致的回调地址"如果密钥或ID填错,服务器在和Google验证code时会失败,进而返回400错误。
CSRF令牌问题(仅浏览器表单提交场景)
如果是用浏览器表单提交,Django的CSRF保护会要求你提交csrfmiddlewaretoken参数。如果没带这个令牌,也会返回400。可以在表单里加上{% csrf_token %}标签来生成该参数。
你可以先从参数名和redirect_uri这两个最常见的问题入手排查,应该能很快定位到原因。
内容的提问来源于stack exchange,提问作者moh

