Мой общий вопрос: есть ли более простой способ сделать это?
Попытка обновить токен аутентификации в background.js расширения chrome.
Поэтому перед каждым запросом API я делаю этот запрос, чтобы получить свой токен и проверить, что токен является текущим.Если нет, я открываю вызов порта для background.js, чтобы обновить мой токен.Это действительно сбивает с толку: мне нужно вкладывать больше, чем хотелось бы, строить порт, потому что он может работать долго.А затем поверх него оберните все это в переменную, чтобы замаскировать его как обещание.
В фоновом режиме, поскольку я могу потенциально открывать несколько портов, мне нужно создать переменную для функции на лету.
В целом это выглядит очень странно для случая
- Получить токен
- Срок его действия истек
- Подождите, пока токен не обновится
Сохранить новый токен
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);
});
});