由于 Rails/AJAX 应用程序上的 CORS,无法在本地访问 IBM Watson API

Posted

技术标签:

【中文标题】由于 Rails/AJAX 应用程序上的 CORS,无法在本地访问 IBM Watson API【英文标题】:Can't access IBM Watson API locally due to CORS on a Rails/AJAX App 【发布时间】:2016-06-30 06:35:03 【问题描述】:

关于如何处理这个问题似乎没有很多答案(但有很多问题),所以我将把我的名字添加到合唱团中,并祈祷一个不涉及的答案节点。

我通过 Chrome 控制台的错误:

1. POST https://gateway.watsonplatform.net/visual-recognition-beta/api 
2. XMLHttpRequest cannot load https://gateway.watsonplatform.net/visual-recognition-beta/api. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 401.

我正在使用 Rails AJAX 请求:

$.ajax(
         method: "POST",
         version: 'v2-beta',
         url: "https://gateway.watsonplatform.net/visual-recognition-beta/api",
         password: "-----------",
         username: "-----------",
         version_date:'2015-12-02',
         visual_recognition: [
             
             name: "visual-recognition-service",
             label: "visual_recognition",
             plan: "free",
             credentials: 
                 url: "https://gateway.watsonplatform.net/visual-recognition-beta/api",
                 password: "----------",
                 username: "---------"
               
             
           ],
         image: "/images/image1.jpg",
         contentType: 'application/json'
         ).done(function(msg)
         if (200) 
           console.log("This is a test for if.")
          else 
           console.log("This is a test for else.")
         
       );

对于这个特殊的原型应用程序,我设置了 Rack::Cors 以让任何东西都能正常工作。这是在我的 application.rb 中:

config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*',
        :headers => :any,
        :methods => [:get, :post, :delete, :put, :patch, :options, :head],
        :expose  => ['access-token', 'expiry', 'token-type', 'uid', 'client', 'auth-token'],
        :max_age => 0
      end
end

有没有人知道如何配置这些东西来解决这个问题?我必须假设有一种方法可以访问这些 API,而无需启动 Node 实例。

【问题讨论】:

这不是 Watson 问题。如需完整讨论,请参阅***.com/questions/20035101/… 【参考方案1】:

以下服务支持CORS:

音调分析器 语音转文字 文字转语音 个性洞察 对话

以下服务不支持 CORS

语言翻译器 视觉识别(部分支持) 自然语言理解

我们正在努力增加对剩余服务的支持。

正如@brian-martin 建议的那样,您不应该在浏览器中使用您的凭据。您可以做的是使用授权服务获取令牌,然后使用该令牌而不是用户名和密码。看看这个教程如何使用tokens

04/07 更新: 添加了支持 CORS 的服务列表(感谢 Nathan) 更新 07/10: 删除了已弃用的服务

【讨论】:

我们现在部分支持 CORS,请参阅 github.com/watson-developer-cloud/node-sdk/tree/master/examples/…(和 watson-speech.mybluemix.net 用于语音服务) 哪个自然语言理解版本支持CORS? 我认为 Natural Language Understanding 曾经支持 CORS,但他们取消了支持。【参考方案2】:

将您的 Watson API 密钥放在浏览器中不是一个好主意,因为有人可以获取这些密钥,在另一个应用程序中使用它们,而您需要为他们的访问付费。您需要从经过身份验证的服务器端应用程序调用 API。

【讨论】:

这是一个原型应用程序,而不是生产,所以我只是想弄清楚如何破解一个解决方案。你是对的,通常情况下,我肯定会为这些值使用单独的常量。

以上是关于由于 Rails/AJAX 应用程序上的 CORS,无法在本地访问 IBM Watson API的主要内容,如果未能解决你的问题,请参考以下文章

由于跨域资源共享 (CORS),主机 Web 上的 SP.ClientContext 失败

Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切

如何使 Rails.ajax(...) 在所有页面上工作?

在 Heroku 上的 Django 应用程序中为 CORS 指定 URL

Rails.ajax 数据未传递给控制器

带有反应应用程序的 POST 上的 ASP.NET CORS 异常