对盈透证券客户端 Web API 的任何 POST 请求的 403 响应代码

Nik*_*las 5 http-post http-status-code-403 interactive-brokers

我尝试使用盈透证券客户端门户 Web API:

  • 我成功启动网关并登录。
  • 我成功地向各种端点发出 GET 请求。
  • 当我向任何端点发出 POST 请求时,我收到 403 响应代码。

例如,我尝试更新当前选择的帐户:

// it is need for change User-Agent as recommended*
chrome.webRequest.onBeforeSendHeaders.addListener(function (details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
        if (details.requestHeaders[i].name === 'User-Agent') {
            details.requestHeaders[i].value = 'Console';
            break;
        }
    }
    return {requestHeaders: details.requestHeaders};
}, {urls: ['<all_urls>']}, ['blocking', 'requestHeaders']);

// it is code of make of POST request
var data = {};
data['acctId'] = 'U1234567';
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://localhost:5000/v1/portal/iserver/account', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(data));
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
        sendResponse({Status: xhr.status + '_' + xhr.responseText}); // I have "403_" response
    }
};
Run Code Online (Sandbox Code Playgroud)

*:从控制台应用程序发出 POST 请求导致错误 403 - 访问被拒绝

我的请求的标题:

Cookie: SBID=xskr4cf7kflki7wrzzy; XYZAB_AM.LOGIN=29c2d567b3a3f23d8d02bdd5ef78d0c8c2694438; XYZAB=29c2d567b3a3f22d8d12bdd5ef78d0c8c2694438; api=673d21e86cf499f04b985446a90a844b; ibkr.nj=286565962.20480.0000
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6
Accept-Encoding: gzip, deflate, br
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: none
Origin: chrome-extension://jnblchdcckkmedocgchlfmfhbaihjdnl
Accept: */*
Content-Type: application/json
User-Agent: Console
Content-Length: 21
Connection: close
Host: localhost:5000
Run Code Online (Sandbox Code Playgroud)

我的请求正文:

{"acctId":"U1234567"}
Run Code Online (Sandbox Code Playgroud)

Nik*_*las 1

我解决了这个问题。\n事实是 \xe2\x80\x9cClient Portal WebAPI gateway\xe2\x80\x9d 不仅仅是一个网关,它还是一个服务器,允许您托管带有代码的 HTML 页面.\n按照此处所述https://interactivebrokers.github.io/cpwebapi/index.html#login启动网关并在 https://localhost:5000/ 页面上进行授权后,\n您可以转到 https:// /localhost:5000/demo/#/ 并看到一个带有非常复杂代码的小型演示应用程序,这超出了我的原始知识。因此,我将root\\webapps\\demo文件夹中的index.html文件替换为我自己的文件,并为POST请求编写了自己的javascript代码

\n
var data={};\ndata["symbol"]="RSG";\ndata["name"]=false;\ndata["secType"]="STK";\nvar xhr=new XMLHttpRequest();\nxhr.open("POST", "https://localhost:5000/v1/portal/iserver/secdef/search", true);\nxhr.setRequestHeader("Content-Type", "application/json");\nxhr.send(JSON.stringify(data));\nxhr.onreadystatechange=function()\n    {\n    if (xhr.readyState==4)\n        {\n        console.log(xhr.status);\n        console.log(xhr.responseText);\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

它起作用了,因为现在我的应用程序的 index.html 页面和端点位于同一域 localhost:5000 上,因此不会发生 mod_security 拒绝并且一切正常!

\n