【问题标题】:AJAX calls should be on the server?AJAX 调用应该在服务器上?
【发布时间】:2016-11-04 11:33:58
【问题描述】:

我正在构建一个 React/Express/Node 应用程序并尝试向 Instagram 发出 AJAX 请求。不幸的是,我这样做时总是遇到错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.

但我已经设置了标题

res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, content-type, accept');
  res.setHeader('Access-Control-Allow-Credentials', true);

虽然我尝试在本地发出这些请求,但我也使用 heroku 进行了部署,并且还尝试使用 https(而不是 http)url。然而,我仍然收到同样的错误。

因此,出于某种原因,这是不允许的。我想这是不可能的(如果是,请告诉我)。 Instagram 在您的应用设置中也有此选项:


[ ] 禁用隐式 OAuth

禁用 Web 应用程序的客户端(隐式)OAuth 流。如果您选中此选项,Instagram 将通过仅允许使用服务器端(显式)OAuth 流的授权请求来更好地保护您的应用程序。服务器端流程被认为更安全。有关详细信息,请参阅身份验证文档。


那么,我是否应该让用户单击一个按钮,将请求发送到我的后端,在我的后端发出 ajax 请求,当我收到响应时,然后将其返回给前端?这似乎令人费解,但上面的消息听起来更安全。但它需要更多的网络请求。什么是最好的?

【问题讨论】:

  • 最后一段描述了 API 不支持 CORS 或 jsonp 时需要的代理。自己设置标头是没用的……远程服务器需要设置它们
  • 最后一段是什么?
  • 你问题的最后一段
  • 那么也许这不是我应该做的。因为我使用的是 Instagram api,所以我应该能够使用访问令牌发出 AJAX 请求。

标签: ajax node.js api express reactjs


【解决方案1】:

当您从localhost 请求任何内容时,大多数浏览器都会忽略典型的 CORS 相关标头。设置一个本地开发域(例如,通过您在 *nix 上的 /etc/hosts)然后尝试再次与您的 expressjs 或 Instagram 的 API 通信,它应该可以工作。

如您在问题中所述,通过您自己的应用程序进行代理通常仅在第三方 API 未在其 API 上设置正确的 CORS 相关标头时才有用。原因是服务器 API 调用(例如通过 curl)不实现 CORS,因此不执行预检请求(例如 OPTIONS http 调用)。另一方面,浏览器可以,但是当您从 localhost 域访问内容时,它们无法正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多