旧的OAuth令牌到期时获取新的Google OAuth令牌?

时间:2015-03-17 17:55:25

标签: javascript google-chrome-extension google-oauth

我正在开发一个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并确实发出了新令牌,但在重新加载整个扩展程序之前无法使用它:/

谢谢!

0 个答案:

没有答案