如何使用async和await这对组合设计统一的取Access Token的函数
最近我在使用SAP云平台的机器学习API做和SAP系统的集成,因为SAP Cloud Platform Leonardo上的机器学期API,每次消费时需要传一个Access Token,故在每次实际调用API前,我需要先发一个请求去获取Access Token. 该请求的响应,除了返回实际的token外,还有一个过期时间,expires_in字段:
根据OAuth 2.0标准定义,expires_in字段代表服务器颁发的该token,距离过期时间还剩的秒数。
我的代码如下:
constrequest=require('request-promise-native');varconfig=require('../config.js');varTOKEN=undefined;varEXPIRES_IN=undefined;varTOKEN_FETCHED_SINCE=undefined;functionisCurrentDateExpired(){varcurrent=newDate();vardiffInMilliSeconds=current-TOKEN_FETCHED_SINCE;vardiffInSecond=Math.ceil(diffInMilliSeconds/1000);varexpired=diffInSecond>=EXPIRES_IN?true:false;//fordebug;//expired=true;returnexpired;}asyncfunctiongetAccessToken(){if(TOKEN===undefined||isCurrentDateExpired()){varraw=newBuffer(config.username+":"+config.password);constaccessToken=awaitrequest({method:'GET',headers:{'Authorization':'Basic'+raw.toString('base64')},url:config.ACCESS_TOKEN,json:false});varoToken=JSON.parse(accessToken);EXPIRES_IN=oToken.expires_in;TOKEN=oToken.access_token;TOKEN_FETCHED_SINCE=newDate();returnoToken.access_token;}else{returnTOKEN;}}varrequest1=getAccessToken();varfreshNewToken,secondTimeToken;request1.then(function(o){//console.log("token1:"+o);freshNewToken=o;});functiontest2(){varb=getAccessToken();b.then(function(o){//console.log("token2:"+o);secondTimeToken=o;console.log("theyshouldbeequal:"+(freshNewToken==secondTimeToken));});}setTimeout(test2,6000);
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。