我正在设置IBM Watson Speech-to-Text。这需要访问令牌documented here:
"令牌有一个小时的生存时间(TTL),之后您将无法再使用它们与服务建立连接。已使用令牌建立的现有连接不受超时影响。尝试传递过期或无效的令牌会从DataPower中引出HTTP 401 Unauthorized状态代码。您的应用程序代码需要准备好刷新令牌以响应此返回码。"
我没有在文档页面上看到刷新令牌的应用程序代码示例。
我的代码是否应为每个下载JavaScript应用的用户生成新令牌?或者服务器是否应该每小时请求一个新令牌,并在一小时内为所有用户提供相同的令牌?
获取令牌的shell命令是:
curl -X GET - 用户名:密码\ - 输出令牌 " https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api"
看起来我可以从我的JavaScript应用程序发送HTTP请求并获取令牌。我应该将令牌作为文件请求,然后让我的应用程序从文件中获取令牌吗?
答案 0 :(得分:0)
enter code here
使用Cloud Functions for Firebase(谷歌云功能的一部分)是有效的,在用户登录时触发,运行节点以发送HTTP请求以获取令牌,然后将结果写入AngularJS价值服务。
此云功能有效:
// Node modules
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests
const fs = require('fs');
admin.initializeApp(functions.config().firebase);
exports.getWatsonToken = functions.database.ref('userLoginEvent').onUpdate(event => { // authentication trigger when user logs in
var username = 'groucho',
password = 'swordfish',
url = 'https://' + username + ':' + password + '@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api';
request({url: url}, function (error, response, body) {
var tokenService = "app.value('watsonToken','" + body + "');";
fs.writeFile('../public/javascript/services/watsonTokenValue.js', tokenService, (err) => {
if (err) throw err;
console.log('The file has been saved!');
}); // close fs.writeFile
}); // close request
}); // close getWatsonToken
在控制器中:
firebase.auth().onAuthStateChanged(function(user) { // this runs on login
if (user) { // user is signed in
console.log("User signed in!");
$scope.authData = user;
firebase.database().ref('userLoginEvent').update({'user': user.uid}); // update Firebase database to trigger Cloud Function to get a new IBM Watson token
} // end if user is signed in
else { // User is signed out
console.log("User signed out.");
}
}); // end onAuthStateChanged
通过云功能,它会注入四个Node模块,包括request
用于发送HTTP请求,fs
用于将结果写入文件。然后设置触发器以更新Firebase数据库中的位置userLoginEvent
(我是从控制台创建的)。接下来,HTTP请求消失。响应(令牌)称为body
。 app.value(' watsonToken','" + body +"');"是一个用于包装令牌的Angular值服务。然后fs
将所有这些写入我项目中的某个位置。
在AngularJS控制器中,onAuthStateChanged
会在用户登录时触发。然后,user.uid会更新到Firebase数据库中的userLoginEvent
位置,并且Cloud功能会触发,HTTP请求会启动out,并将响应写入Angular服务。