• 如何使用async和await这对组合设计统一的取Access Token的函数


    最近我在使用SAP云平台的机器学习API做和SAP系统的集成,因为SAP Cloud Platform Leonardo上的机器学期API,每次消费时需要传一个Access Token,故在每次实际调用API前,我需要先发一个请求去获取Access Token. 该请求的响应,除了返回实际的token外,还有一个过期时间,expires_in字段:

    clipboard1,1

    根据OAuth 2.0标准定义,expires_in字段代表服务器颁发的该token,距离过期时间还剩的秒数。

    clipboard2,2

    我的代码如下:

    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);
    

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":
    公众号截图

  • 相关阅读:
    音频重采样48kk转16k
    ld: symbol(s) not found for architecture x86_64问题解决
    麦克风啸叫抑制解决方案之移频法
    gcc makefile 模板
    mysql 分组加序号
    java微信公众号JSAPI支付以及所遇到的坑
    appium新手入门(1)—— appium介绍
    一次完整的JVM堆外内存泄漏故障排查记录
    mysql 批量更改表名
    爬虫技术
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/11604068.html
Copyright © 2020-2023  润新知