Heroku已配HTTPS调用谷歌Sheets API仍报OAuth2 InsecureTransportError
核心原因
报错由oauthlib的传输安全校验触发,本质是你的Django服务识别到的当前请求协议为HTTP,和外部域名配置了HTTPS无关:Heroku的架构会在边缘负载均衡层终止SSL连接,转发到应用实例的请求实际走内部HTTP协议,默认配置下Django不会识别代理传递的HTTPS标识。
修复方案
- 首先修改Django项目
settings.py文件,添加如下配置:
# 信任Heroku反向代理的HTTPS标识头 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') USE_X_FORWARDED_HOST = True
配置生效后Django会识别Heroku传递的X-Forwarded-Proto请求头,当外部请求是HTTPS时,Django内部的request.scheme会返回https,通过oauthlib的校验。
- 检查Google OAuth Flow初始化时的
redirect_uri参数:不要硬编码HTTP开头的地址,优先用request.build_absolute_uri生成回调地址,配置修复后该方法会自动生成HTTPS前缀的回调地址。 - 确认生产环境未配置
OAUTHLIB_INSECURE_TRANSPORT=1环境变量,该变量仅用于本地HTTP测试,生产环境开启会存在安全隐患。
进一步排查所需信息
authorize_success视图开头输出的request.scheme、request.META.get('HTTP_X_FORWARDED_PROTO')的实际值- 构造Google OAuth Flow实例时的回调地址相关代码
- Django配置文件中所有
SECURE_前缀的配置项值
内容的提问来源于stack exchange,提问作者juju
相关产品推荐
相关产品推荐

