跨域POST访问第三方页面

遇到一个在新页面中打开第三方网站,但是只提供了POST请求的需求。

首先要吐槽第三方网站只提供POST请求,简直****!

1、接口测试

    首先用postman测试接口,返回html文档,第三方接口用POST请求,默认对方返回的是静态页面,将结果写入新窗口即可;代码测试发现该html文档是第三方系统内部访问的页面,有很多该系统内部的请求。

2、解决方案

    表单可以用POST请求向第三方网站提交数据,尝试js内部构造form表单,并提交

const url = '{address}/index_new.php/Login';
const tempForm = document.createElement('form');
tempForm.action = url;
tempForm.target = '_blank';
tempForm.method = 'post';
tempForm.style.display = 'none';

for (const x in argument) {
  const opt = document.createElement('input');
  opt.type = 'hidden';
  opt.name = x;
  opt.value = argument[x];
  tempForm.append(opt);
}
document.body.appendChild(tempForm);
tempForm.submit();
document.body.removeChild(tempForm);

成功打开新窗口,document.domain = {address},但该接口只接受application/json格式参数,表单POST请求参数默认为application/x-www-form-urlencoded。至此发现对方接口不可行,只能和对方沟通修改接口。

对方无论如何不接受提供GET请求,只能要求对方修改该请求参数为application/x-www-form-urlencoded类型。

form提交打开的新窗口,打开控制台,刷新后network窗口可以看到form提交的数据。如百度搜索163,在百度页面输入163邮箱的账号密码登录,form提交跳转到163邮箱登录页面,如果登录失败,即可如此查看;如果登录成功,163返回一个token,做一次重定向,直接跳转到个人邮箱主页。当然,如果抓包,还是能监测到form请求的信息——而且是明文。

因此,考虑到安全因素,尽量与第三方系统在后台完成关键数据的交互,比如使用Author2.0等验证方式,前端持token跳转。

你可能感兴趣的:(http)