使用在服务器端获取的 IBM Bluemix 音调分析器令牌时客户端出错
Posted
技术标签:
【中文标题】使用在服务器端获取的 IBM Bluemix 音调分析器令牌时客户端出错【英文标题】:Error on client side when using iBM Bluemix tone analyzer token fetched on server side 【发布时间】:2016-10-26 12:57:19 【问题描述】:我已经在服务器端获得了一个令牌并将其存储在一个 cookie 中,但是当我使用该令牌查询 api 时,我似乎无法弄清楚为什么会出现错误。
这是我发送的 jQuery ajax 请求:
$.ajax(
url:'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone',
data:
'X-Watson-Authorization-Token':readCookie('token'),
'text':input,
'version':'v3',
'version_date':'2016-05-19'
,
dataType:'jsonp',
contentType:'application/json',
method:'GET',
success:function(tone)
console.log(tone);
);
如果我不使用dataType:jsonp
,我会收到一个无访问控制源错误。当我不使用contentType:application/json
或使用contentType:application/javascript
时,当查询api 询问用户名和密码时,我会得到一个登录对话框。但是既然我有一个令牌,我就不应该传递用户名和密码。当我以这种方式运行它时,同时使用 dataType 和 contentType,我收到 400 错误错误请求。
有谁知道我做错了什么?文档说我可以在客户端使用令牌。但我必须在服务器端获取它。
更新:
根据建议,我没有通过单独的 php 文件的 jquery ajax 调用来访问服务器端代码。我能够获取令牌,但是当我将它传递给音调分析器的 api 调用时,我收到 400 错误。不管我是否对令牌进行 decodeURI。
这是我的 jquery:
$.when($.ajax(
url:'watsonToken.php',
type:'GET',
)).done(function(token)
console.log('watsonToken, lasts 1 hour: ', decodeURI(token));
$.ajax(
url:'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone',
type:'POST',
data:JSON.stringify(
'body':input,
'version':'2016-05-19'
),
contentType:'application/json',
headers:
'X-Watson-Authorization-Token':decodeURI(token)
,
success:function(tone)
console.log(tone);
,
error: function(error)
console.error('Error: Couldn\'t use token: ', error);
);
).fail(function()
console.error('Error: Couldn\'t fetch watson token');
);
以及获取令牌的 watsonToken.php 文件:
<?php
$accessWatsonToken = curl_init();
$params=http_build_query(array('url' => 'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone'));
curl_setopt($accessWatsonToken, CURLOPT_URL, "https://gateway.watsonplatform.net/authorization/api/v1/token?$params");
curl_setopt($accessWatsonToken, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($accessWatsonToken, CURLOPT_USERPWD, 'username':password');
print curl_exec($accessWatsonToken);
curl_close($accessWatsonToken);
?>
【问题讨论】:
【参考方案1】:我认为您正在尝试将 X-Watson-Authorization-Token
作为正文参数,而 version
应该是一个查询参数。同样在您的 JQuery 休息调用的数据字段中,您正在对已经字符串化的对象进行字符串化,并且在标题中您正在解码不需要解码的令牌响应
您可以找到有关如何创建对 Watson 音调分析器服务here的调用的更多信息
编辑:这是一个使用 PHP 的完整示例。
index.php
<!doctype html>
<html lang="en">
<head>
<title>Watson Tone Analyzer Example</title>
<meta charset="utf-8"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
</head>
<body>
<h2>This is an example of client side call to Watson Tone analyzer service using an authorization token.</h2>
<div id="myoutput"></div>
</body>
</html>
<script>
analyze();
function analyze()
$.ajax(
url:'/get-token.php',
type:'GET',
success:function(token)
callToneAnalyzer(token);
,
error: function(err)
console.error(err);
);
function callToneAnalyzer(token)
$.ajax(
url:'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone?version=2016-05-19',
type:'POST',
data: JSON.stringify(text: "this is my sample text"),
contentType: 'application/json',
headers:
'X-Watson-Authorization-Token': token
,
success:function(tone)
$("#myoutput").text(JSON.stringify(tone));
,
error: function(err)
$("#myoutput").text(JSON.stringify(err));
);
</script>
get-token.php
<?php
// Send a http request using curl
function getToken()
$username='YOUR-TONE-ANALYZER-USERNAME';
$password='YOUR-TONE-ANALYZER-PASSWORD';
$URL='https://gateway.watsonplatform.net/authorization/api/v1/token?url=https://gateway.watsonplatform.net/tone-analyzer/api';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$result=curl_exec ($ch);
curl_close ($ch);
return $result;
echo getToken();
?>
【讨论】:
啊,我不知道你是这样传递标题的。但现在我收到 403 错误:MLHttpRequest cannot load https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://domaincom' is therefore not allowed access. The response had HTTP status code 403.
你是从本地主机还是其他地方运行它?除了使用您的令牌之外,您是否尝试过完全复制上述代码?
我使用了这个确切的代码,我在一个实际的服务器上运行它,在线
好的,我能够在本地运行它并在服务器上在线运行。这让我觉得你的令牌可能是问题所在。因此,我在呼叫中放入了一个错误的令牌,并得到了与您发布的相同的访问控制错误响应。请重新检查您在 ajax 请求中提供的令牌以确保其正确,这将解决此问题
您可以从这里查看有关如何正确获取令牌的更多信息:ibm.com/watson/developercloud/doc/getting_started/… 或者如果您使用的是 Node.js,则有一个 SDK 可以帮助您轻松完成此操作,这就是我用过的。相关信息在这里github.com/watson-developer-cloud/node-sdk#authorization以上是关于使用在服务器端获取的 IBM Bluemix 音调分析器令牌时客户端出错的主要内容,如果未能解决你的问题,请参考以下文章
使用 IBM Worklight 和 IBM Bluemix 推送通知