远程上的同源策略阻止API请求

时间:2020-02-11 16:55:42

标签: cors same-origin-policy

“偏僻”部分是为什么我对此感到困惑的原因。我正在尝试向https://api.smarkets.com/v3/sessions发出POST请求。途径是为随后的API请求创建会话令牌。

如果我在本地计算机上执行此请求,则可以正常工作。我收到2xx的回复。但是,如果尝试在远程计算机上(昨晚我弹出的 DO框),则会收到“ 503服务暂时不可用”的响应。

我尝试通过浏览器登录,并且得到了相同的响应。我raised this question to Smarkets,他们逃避了事实,这可能是由于Smarkets实行的原产地政策。

一段时间后,我通过禁用同源策略成功通过Chrome登录。 API请求仍然失败。

根据我对同源政策的有限了解(如果我错了,请纠正我),它指定了允许从某些来源退还哪些资源。与CORS问题类似。为什么我必须显式禁用远程浏览器上的Web安全性才能使其登录smarkets.com,但我的本地计算机上的浏览器无需修改就可以正常登录?

我在上面突出显示的问题显示了我尝试使该方法起作用的方法。无论我尝试设置什么请求标头,响应标头始终与X-Frame-Options响应标头始终设置为SAMEORIGIN相同,根据我的理解, 仅允许要发送到发件人相同来源的资源。即只能通过smarkets.com的请求访问smarkets.com发送的资源。

我当前的请求尝试是(httpie ):

http POST https://api.smarkets.com/v3/sessions/ 'Access-Control-Request-Headers: Content-Type, Accept, Host, Origin' 'Access-Control-Request-Methods: POST, OPTIONS' 'Origin: https://smarkets.com' username=<username> password=<password> --print=Hh

请求和响应标头为:

Failed headers

我真的在找;

  • 明确规定原产地政策
  • 为什么此请求在我的本地计算机上成功但在远程DO盒上未成功
  • 如何使该请求成功?

Smarkets的用户似乎是一个同源问题,但可能并非如此。

编辑:

这不是防火墙问题,因为我禁用了Ubuntu的内置防火墙。我正在通过同一来源通过http(s)发出其他请求,所以我不知道这个请求有何不同

编辑2:

下面是成功的请求/响应头的示例:

Successful headers

我能够从同一个盒子向其他来源发出其他API调用,包括:

  • https://api.betdaq.com
  • https://api.betfair.com
  • https://api.matchbook.com

我没有在包装盒上的任何原始位置上添加任何配置,因此,实际上不确定此问题是什么。我添加了所有我能想到的可能的CORS请求标头,但仍然没有运气。

编辑3:

令人烦恼的是,由于供应商API默认将DigitalOcean IP列入黑名单,此问题现已得到解决。

2 个答案:

答案 0 :(得分:3)

Cors既是服务器又是客户端。服务器定义策略,客户端可以强制执行。例如,浏览器会强制执行它,因为它更安全(此处不做详细介绍)。因此,在浏览器中禁用同源策略或使用不受信任的浏览器是一个安全问题。

同样,客户端可以执行该策略。据我所知,大多数命令行http客户端都不执行它。那可以解释为什么您的httpie请求不会失败。

从浏览器的角度来看,您无法解决问题。同样,是由服务器定义策略。您可以做的是创建代理服务器。您可以指定自己的cors政策。浏览器向您的代理服务器发出请求。您的代理服务器将请求传递到实际服务器。

答案 1 :(得分:0)

Cors或多或少总是服务器端的东西。如果供应商要暴露某些api,则应确保已禁用cors。除了与他们讨论之外,您实际上无所不能。必须禁用Chrome的cors是个坏主意。