django-rest-framework-social-oauth2部署后出现redirect_uri_mismatch 400错误
redirect_uri_mismatch 问题排查方案
你遇到的redirect_uri_mismatch错误的本质是:Django服务在向Google发起授权请求时,主动携带的redirect_uri参数就是localhost地址,和Google控制台配置的线上地址不一致才会被拒绝,不需要排查Google侧配置,只需要调整Django侧的部署配置即可。
1. 反向代理请求头配置缺失
大部分线上场景会用Nginx、Caddy等工具做反向代理转发请求到Django服务,默认配置下Django无法识别到用户真实的请求域名和HTTPS协议,会默认用本地服务地址生成回调链接。
解决步骤:
- 调整
settings.py配置,开启代理头识别:
# 信任反向代理传递的域名、协议头 USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 添加上线域名到白名单 ALLOWED_HOSTS = ['mydjangoapp.com']
- 调整反向代理配置,确保转发请求时携带真实信息,以Nginx为例,对应location块需要新增以下配置:
proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
2. 第三方登录回调地址硬编码/环境变量未更新
你使用的登录组件依赖python-social-auth,检查配置是否存在本地写死的回调地址:
- 检查
settings.py中是否配置了SOCIAL_AUTH_GOOGLE_OAUTH2_REDIRECT_URI,如果值为localhost地址,替换为线上地址即可:
SOCIAL_AUTH_GOOGLE_OAUTH2_REDIRECT_URI = 'https://mydjangoapp.com/auth/complete/google-oauth2/'
- 如果你用环境变量传入回调地址参数,确认线上部署的环境变量已经更新,没有沿用本地开发的配置文件。
3. Django站点配置错误
检查Django自带的站点配置:
- 登录Django Admin后台,进入「站点」管理页
- 确认默认站点的域名已修改为
mydjangoapp.com,而非默认的example.com或者本地localhost地址
4. 缓存导致的重复报错
如果以上配置都调整完成后还有问题,清空浏览器缓存或者切换无痕模式测试,避免之前的错误授权请求被缓存导致重复报错。
内容的提问来源于stack exchange,提问作者Damian
相关产品推荐
相关产品推荐

