使用OkHttp工具时Authorization请求头丢失问题

692 阅读1分钟

问题描述

对接三方接口接口,对方提供的地址:http://....../api/token,鉴权方式为Basic Auth,即在Header中加Authorization:Basic ${signature}。

  1. Postman请求结果:image.png
  2. Java代码使用OkHttp客户端调用返回:400 Bad Request
  3. 问题提交给接口提供方,得到反馈接口正常image.png

目测是ApiPost工具调用结果.

问题解决过程

经检查,接口路径,鉴权参数都没有任何问题。
代码debug调试时Authorization请求头也确实添加了。但是接口提供方日志显示缺少Header: Authorization。
通过debug跟踪okhttp源码发现这样一段代码:image.png
在重定向时,OkHttp会移除header: Authorization!!!
那么,提供方服务为什么要重定向一次?
答案是 nginx 使用301重定向将http请求重定向到https上 nginx配置如下

server {
    listen 80;
    
    # 绑定证书的域名
    server_name www.xxx.com;
    
    # 把http的域名请求转成https
    return 301 https://$host$request_uri;
}

问题找到,解决办法就是把http请求改为https即可。
所以这是一个接口提供方提供接口路径不完全正确 + OkHttp触发的问题。

ps:我自己也下载ApiPost试了一下,发现可以成功。所以合理猜测Postman做了与OkHttp类似的处理而ApiPost没有。在重定向时,移除Authorization估计是处于安全考虑。