如何使用async和await這對組合設計統一的取Access Token的函數

  • 2019 年 10 月 8 日
  • 筆記

最近我在使用SAP雲平台的機器學習API做和SAP系統的集成,因為SAP Cloud Platform Leonardo上的機器學期API,每次消費時需要傳一個Access Token,故在每次實際調用API前,我需要先發一個請求去獲取Access Token. 該請求的響應,除了返回實際的token外,還有一個過期時間,expires_in欄位:

根據OAuth 2.0標準定義,expires_in欄位代表伺服器頒發的該token,距離過期時間還剩的秒數。

我的程式碼如下:

const request = require('request-promise-native');    var config = require('../config.js');    var TOKEN = undefined;  var EXPIRES_IN = undefined;  var TOKEN_FETCHED_SINCE = undefined;      function isCurrentDateExpired(){      var current = new Date();        var diffInMilliSeconds = current - TOKEN_FETCHED_SINCE;      var diffInSecond = Math.ceil(diffInMilliSeconds/1000);      var expired = diffInSecond >= EXPIRES_IN ? true:false;      // for debug;      // expired = true;      return expired;  }    async function getAccessToken(){      if( TOKEN === undefined || isCurrentDateExpired()){          var raw = new Buffer(config.username + ":" + config.password);          const accessToken = await request({              method: 'GET',              headers: {                  'Authorization': 'Basic ' + raw.toString('base64')              },              url: config.ACCESS_TOKEN,              json: false          });          var oToken = JSON.parse(accessToken);          EXPIRES_IN = oToken.expires_in;          TOKEN = oToken.access_token;          TOKEN_FETCHED_SINCE = new Date();          return oToken.access_token;      }      else{          return TOKEN;      }  }    var request1 = getAccessToken();  var freshNewToken, secondTimeToken;    request1.then(function(o){      // console.log("token1: " + o);       freshNewToken = o;  });    function test2(){      var b = getAccessToken();      b.then(function(o){      // console.log("token2: " + o);          secondTimeToken = o;          console.log("they should be equal: " + (freshNewToken == secondTimeToken));      });  }    setTimeout( test2, 6000);

Tags: