我正在开发一个Chrome扩展程序,该扩展程序使用Google的OAuth获取用户的名称,并能够将内容写入Google电子表格。
我能够做我需要的但是我注意到每次打开扩展程序的页面操作(执行OAuth的地方)时,它都会更新并为我的扩展程序提供新的令牌,即使旧的令牌也是如此仍然没有过期。
理想情况下,我需要以某种方式检查,并在旧的过期之前,发布一个新的。目前,如果用户等待超过1小时,则扩展变得无用,因为它仍在尝试使用旧令牌。他们必须点击omnibar中的页面操作图标来刷新它并获得一个新令牌。
所以我的问题是,当它即将到期时,如何让它刷新并为扩展提供新的令牌?我没有尝试让用户每隔1小时手动点击一下,所以我无法解决这个问题。
以下是我必须执行OAuth的代码:
popup.html:
<html>
<head>
<script src="js/contentscript.js"></script>
<script src="https://apis.google.com/js/client.js?onload=handleClientLoad"></script>
</head>
<body style="width: 500px">
<div id="PleaseLogIn" style="display: none;" >
<h2>Please sign in before using this extension!</h2>
</div>
<center><span id="signinButton">
<span
class="g-signin"
data-callback="signinCallback"
data-clientid=".....apps.googleusercontent.com"
data-cookiepolicy="single_host_origin"
data-width="wide"
data-scope="https://www.googleapis.com/auth/plus.login https://spreadsheets.google.com/feeds">
</span>
</span>
</center>
</body>
</html>
contentscript.js:
(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/client:plusone.js?onload=signinCallback';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
function signinCallback(authResult) {
if (authResult['status']['signed_in']) {
//hide the welcome text and sign in button if signed in.
document.getElementById('signinButton').setAttribute('style', 'display: none');
document.getElementById('PleaseLogIn').setAttribute('style', 'display: none');
//I'm storing the token in chrome.local.storage to be used by the rest of the extension
var token = JSON.stringify(gapi.auth.getToken().access_token);
chrome.storage.local.set({'token': token});
//get the logged in user name
makeAPICall();
//reload the current tab so it can pick up the user's name and their token
chrome.tabs.reload();
} else {
//if the user is not logged in or there was an issue, let them know to log in
document.getElementById('PleaseLogIn').setAttribute('style', 'display: ');
console.log('Problem with sign in: ' + authResult['error']);
}
}
//request info from the user's account such as their name
function makeAPICall(){
gapi.client.load('plus', 'v1', function() {
var request = gapi.client.plus.people.get({
'userId': 'me'
});
request.execute(function (resp){
var username = resp.displayName;
chrome.storage.local.set({'username': username});
});
});
}
我假设我必须以某种方式检查当前令牌是否已过期或即将过期,然后获取一个新令牌,最后将其保存在chrome.local.storage中,以便下次需要时使用该扩展程序
P.S。我甚至尝试过Chrome.Identity并确实发出了新令牌,但在重新加载整个扩展程序之前无法使用它:/
谢谢!