由于 Rails/AJAX 应用程序上的 CORS,无法在本地访问 IBM Watson API
Can't access IBM Watson API locally due to CORS on a Rails/AJAX App
关于如何处理这个问题似乎没有很多答案(但有很多问题),所以我将把我的名字添加到合唱团并祈祷没有答案'不涉及节点。
我通过 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 API 密钥放在浏览器中是个坏主意,因为有人可以拿走这些密钥,在另一个应用程序中使用它们,而您需要为它们的访问付费。您需要从经过身份验证的服务器端应用程序调用 APIs。
以下服务支持CORS:
- 音调分析器
- 语音转文本
- 文字转语音
- 个性洞察
- 对话
以下服务不支持 CORS
- 语言翻译
- 视觉识别(部分支持)
- 自然语言理解
我们正在努力增加对其余服务的支持。
正如@brian-martin 所建议的,您不应在浏览器中使用您的凭据。您可以做的是使用授权服务获取令牌,然后使用该令牌代替用户名和密码。查看本教程,了解如何使用 tokens
更新 04/07: 添加了支持 CORS 的服务列表(感谢 Nathan)
07 月 10 日更新: 删除了已弃用的服务
关于如何处理这个问题似乎没有很多答案(但有很多问题),所以我将把我的名字添加到合唱团并祈祷没有答案'不涉及节点。
我通过 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 API 密钥放在浏览器中是个坏主意,因为有人可以拿走这些密钥,在另一个应用程序中使用它们,而您需要为它们的访问付费。您需要从经过身份验证的服务器端应用程序调用 APIs。
以下服务支持CORS:
- 音调分析器
- 语音转文本
- 文字转语音
- 个性洞察
- 对话
以下服务不支持 CORS
- 语言翻译
- 视觉识别(部分支持)
- 自然语言理解
我们正在努力增加对其余服务的支持。
正如@brian-martin 所建议的,您不应在浏览器中使用您的凭据。您可以做的是使用授权服务获取令牌,然后使用该令牌代替用户名和密码。查看本教程,了解如何使用 tokens
更新 04/07: 添加了支持 CORS 的服务列表(感谢 Nathan) 07 月 10 日更新: 删除了已弃用的服务