Django集成Facebook登录报AuthCanceled错误,SOCIAL_AUTH_REDIRECT_IS_HTTPS无效如何解决
问题根因
从报错日志可以确认,调用Facebook换取access_token的接口时,提交的redirect_uri参数仍然是HTTP协议的地址,和你在Facebook开发者后台配置的HTTPS回调地址不匹配,所以Facebook返回400错误,最终触发AuthCanceled异常。你配置的SOCIAL_AUTH_REDIRECT_IS_HTTPS未生效,通常是因为Django部署在反向代理(Nginx/Apache/CDN等)后,无法识别外层的HTTPS请求导致的。
解决方案
按以下步骤配置即可解决:
- 首先在Django的
settings.py中添加代理SSL头识别配置,让Django可以识别外层的HTTPS请求:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 确保允许你的域名作为请求Host ALLOWED_HOSTS = ['www.example.com', 'example.com']
- 如果你使用Nginx作为反向代理,需要在对应站点的配置块中添加请求头传递规则,确保协议头可以正常传递给Django服务:
server { # 其它配置省略 location / { proxy_pass http://你的Django服务监听地址; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; } }
如果使用Apache或者其它反向代理,自行查找对应的X-Forwarded-Proto头传递配置即可。
- 补充social_django的配置,强制使用HTTPS回调,也可以直接硬写回调地址兜底避免自动生成错误:
SOCIAL_AUTH_REDIRECT_IS_HTTPS = True # 硬写的回调地址必须和Facebook后台配置的完全一致 SOCIAL_AUTH_FACEBOOK_REDIRECT_URI = 'https://www.example.com/oauth/complete/facebook/'
- 所有配置修改完成后,重启反向代理服务和Django服务,清空浏览器缓存后重新测试登录流程即可。
验证方法
可以在social_core/backends/facebook.py的auth_complete方法中打印提交的params参数,确认其中的redirect_uri已经是HTTPS协议开头的地址即可。
内容的提问来源于stack exchange,提问作者Pratik Gaikwad
相关产品推荐
相关产品推荐

