我的总体问题是:有没有更简单的方法可以做到这一点?
尝试刷新chrome扩展程序的background.js中的auth令牌。
因此,在每个API请求之前,我都会发出此请求以获取我的令牌并验证该令牌是最新的。如果不是最新版本,则打开对background.js的端口调用以刷新令牌。这似乎确实使我感到困惑,因为它可能会长时间运行,因此我不得不嵌套比我想要的更多的嵌套端口。然后将其全部包装在变量中,以伪装成一个承诺。
在后台,因为我可能会打开多个端口,所以我需要动态地为该函数创建一个变量。
总体而言,对于
而言,这确实令人困惑存储新令牌
公共异步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);
});
});