如何本地调试有IP限制的三方接口

经常碰到三方接口有 ip 限制,需要将我们这边的 ip 地址加入对方的白名单才能进行访问测试。
这就给测试增加了难度,有以下原因

  • 本地 ip 是动态的
  • 不允许将本地 ip 提供给三方

以前每次测试都提交到测试环境,然后测试,改动多的话就会特别麻烦。
后面查找有没有方法本地就可以测试,发现 http 代理可以实现,配合 guzzle 的代理使用特别方便。

    resolver x.x.x.x;       #指定DNS服务器IP地址(需替换成自己的)  
    location / {  
        proxy_pass https://$http_host$request_uri;     #设定代理服务器的协议和地址 
        proxy_set_header HOST $http_host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0k; 
        proxy_connect_timeout 30;
        proxy_send_timeout 60;
        proxy_read_timeout 60;
        proxy_next_upstream error timeout invalid_header http_502;
    }

但是这个有几个问题

  • 没有防护,所有人都能使用此代理(已经看到很多访问了:()
  • 目前没法通过域名设置代理,只能通过 ip 加端口,所以代理都是 127.0.0.1:8080 这种。
  • 没法直接访问 https 请求,需要将改成 http 在 proxy_pass 指定协议 https (每次设置都很麻烦)

大家有没有 “优雅” 的方式调试这种三方 ip 限制的接口?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 17

最近我也遇到类似的情况。我这边是这样,第三方服务的 api 会限制 ip,而且只能填一个。我现在的做法是第三方服务的平台中填写服务器 A 的 ip, 然后在服务器 A 上写一个转发程序,本地服务器 B 或者其他服务器 C 调用服务器 A 上的转发程序,服务器 A 再把接收到的数据提交到第三方服务。

1年前 评论
cxcsz (楼主) 1年前
mofung (作者) 1年前
cxcsz (楼主) 1年前
mofung (作者) 1年前
cxcsz (楼主) 1年前
cxcsz (楼主) 1年前
sanders

:sweat_smile: 标准流程应该是自己做 mock 吧。

1年前 评论
cxcsz (楼主) 1年前
Imuyu 1年前
sanders (作者) 1年前

A 做个代理服务器,然后其他服务器使用 socks 访问

1年前 评论

找台云服务器,搭建个 nginx 转发一下,第三方平台配置云服务器 ip。

location /xxxx/ {
      access_by_lua '
        ngx.req.set_uri_args(params)   验证等
      ';
      proxy_pass http://原始网址;
      proxy_cache cache_one;
      proxy_cache_valid 200 304 302 90s;
      proxy_cache_bypass $arg_nocache;
   }
}
1年前 评论
yyy123456 1年前
skarner

白名单加你们自己公司的一台机器的 IP(比如测试环境机器的公网 IP)

然后再在这台机器上转个代理

本地请求通过这台机器的代理去请求即可

1年前 评论
GDDD

workerman 很快就能搭建 http 代理服务器

1年前 评论

感谢大家的反馈,测试过 nginx 转发 http 和 https,一直没有成功。原来一直没有找到合适的解决方案就搁置了,后来是使用 golang 写了个简单的代理解决的。只能感叹 chatgpt 的强大。

代码已被折叠,点此展开

该代码实现了 http 和 https 转发;添加了用户认证,防止别人来调用 (自己的服务器差点被打趴下了)。 guzzle 调用示例

$config = [
    'proxy' =>  'http://user:password@xx.xx.xx.xx:8080'
];
$client = new \GuzzleHttp\Client($config);
$res = $client->get("https://httpbin.org/get");
$res = $client->get("http://httpbin.org/get");
11个月前 评论