Расширение Chrome, OAuth, Обновить - PullRequest
0 голосов
/ 15 марта 2019

Мой общий вопрос: есть ли более простой способ сделать это?

Попытка обновить токен аутентификации в background.js расширения chrome.

Поэтому перед каждым запросом API я делаю этот запрос, чтобы получить свой токен и проверить, что токен является текущим.Если нет, я открываю вызов порта для background.js, чтобы обновить мой токен.Это действительно сбивает с толку: мне нужно вкладывать больше, чем хотелось бы, строить порт, потому что он может работать долго.А затем поверх него оберните все это в переменную, чтобы замаскировать его как обещание.

В фоновом режиме, поскольку я могу потенциально открывать несколько портов, мне нужно создать переменную для функции на лету.

В целом это выглядит очень странно для случая

  1. Получить токен
  2. Срок его действия истек
  3. Подождите, пока токен не обновится
  4. Сохранить новый токен

    public async refreshToken (message: string): Promise {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);
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...