IBM Watson令牌在一小时后到期。用于刷新令牌的代码?

时间:2017-08-09 16:43:00

标签: ibm-watson

我正在设置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请求并获取令牌。我应该将令牌作为文件请求,然后让我的应用程序从文件中获取令牌吗?

1 个答案:

答案 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服务。