Chrome扩展程序,OAuth,刷新

时间:2019-03-15 20:04:31

标签: google-chrome-extension

我的总体问题是:有没有更简单的方法可以做到这一点?

尝试刷新chrome扩展程序的background.js中的auth令牌。

因此,在每个API请求之前,我都会发出此请求以获取我的令牌并验证该令牌是最新的。如果不是最新版本,则打开对background.js的端口调用以刷新令牌。这似乎确实使我感到困惑,因为它可能会长时间运行,因此我不得不嵌套比我想要的更多的嵌套端口。然后将其全部包装在变量中,以伪装成一个承诺。

在后台,因为我可能会打开多个端口,所以我需要动态地为该函数创建一个变量。

总体而言,对于

而言,这确实令人困惑
  1. 获取令牌
  2. 它过期了吗
  3. 等待令牌刷新
  4. 存储新令牌

    公共异步refreshToken(消息:字符串):承诺{         const context:any = this;

        // Callback Wrapper to execute inside a promise.
        const getTokenFromStorage = () =>
            new Promise((resolve, reject) => {
                chrome.storage.sync.get(['accessToken'], function(result) {
                    if (result != null && !context._hasExpired( result.accessToken )) {
                        context.token = result.accessToken;
                        resolve( context.token );
                    }
                    else {
                        context.token = null;
                        chrome.storage.sync.remove(['accessToken']);
                        const port = chrome.runtime.connect({name: 'token_refresh'});
                        port.postMessage({message: 'need_token_refresh'});
                        port.onMessage.addListener(function(msg) {
                            chrome.storage.sync.get(['accessToken'], function(token) {
                                if (token != null && !context._hasExpired( token.accessToken )) {
                                    context.token = token.accessToken;
                                    resolve( context.token );
                                } else {
                                    const errorList: TWErrorList = context.buildErrorList(null, { 'key': 'Authentication', 'value': 'Authentication expired need to login again', level: 0 } );
                                    reject( errorList );
                                }
                            });
                        });
                    }
                });
            });
    
        // Execute the wrapper.
        await getTokenFromStorage();
        return context.token;
    }
    

在我的background.js文件中,监听器的连接方式如此

    chrome.runtime.onConnect.addListener(function(port) {
  var portResponseFunction = function callback(unparsedToken) {
    if (unparsedToken) {
      var parsed = parseURL( unparsedToken.substr(chrome.identity.getRedirectURL("oauth2").length + 1) );
      parsed = setExpiry(parsed);
      chrome.storage.sync.set({'accessToken': parsed}, function() {
        if (port !== null) {
          port.postMessage({response: "token_refreshed"});
        }
      });
    } 
    else {
      return (null);
    }
  };

  port.onMessage.addListener(function(msg) {
      var url = loginConfig(configuration);
      chrome.identity.launchWebAuthFlow({'url': url, 'interactive': true}, portResponseFunction);
  });
});

0 个答案:

没有答案