天天看點

跨域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跳轉。

繼續閱讀