2017-09-11 172 views
0

我無法使用Google signOut()在我登錄的oAuth會話中籤名。無法登錄Google OAuth2

舉個例子,我已經粘貼直接從谷歌快速啓動現場採取下面的代碼... https://developers.google.com/google-apps/calendar/quickstart/js

我把它保存到一個網站上1.htm文件,並在嘗試推動Google API。

當我從我的API控制檯使用OAuth 2.0客戶端ID(未在附加代碼中顯示)時,我可以登錄並查看我的日曆事件。但是,單擊註銷按鈕時,我不會註銷。

enter image description here

點擊退出後,右,下面的代碼運行肯定...

enter image description here

但後來,它不籤我。從控制檯運行,我看到它仍然認爲我登錄... enter image description here

我正在聽的任何變化對簽到我們signOut狀態... enter image description here

但隨後回調是永遠命中signOut()... enter image description here

最後,如果我嘗試從開發者控制檯整個事情...

  1. 展會gapi.auth2說我我登錄
  2. 手冊登出命令
  3. 顯示gapi.auth2說,我仍然在 enter image description here

登錄如何這段代碼進行修改,以使signOut()工作?

<!DOCTYPE html> 
<html> 
<head> 
    <title>Google Calendar API Quickstart</title> 
    <meta charset='utf-8' /> 
</head> 
<body> 

<p>Google Calendar API Quickstart</p> 

<!--Add buttons to initiate auth sequence and sign out--> 
<button id="authorize-button" style="display: none;">Authorize</button> 
<button id="signout-button" style="display: none;">Sign Out</button> 

<pre id="content"></pre> 

<script type="text/javascript"> 
    // Client ID and API key from the Developer Console 
    var CLIENT_ID = 'MY OAUTH CLIENT ID'; 

    // Array of API discovery doc URLs for APIs used by the quickstart 
    var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest"]; 

    // Authorization scopes required by the API; multiple scopes can be 
    // included, separated by spaces. 
    var SCOPES = "https://www.googleapis.com/auth/calendar"; 

    var authorizeButton = document.getElementById('authorize-button'); 
    var signoutButton = document.getElementById('signout-button'); 

    /** 
    * On load, called to load the auth2 library and API client library. 
    */ 
    function handleClientLoad() { 
     gapi.load('client:auth2', initClient); 
    } 

    /** 
    * Initializes the API client library and sets up sign-in state 
    * listeners. 
    */ 
    function initClient() { 
     gapi.client.init({ 
      discoveryDocs: DISCOVERY_DOCS, 
      clientId: CLIENT_ID, 
      scope: SCOPES 
     }).then(function() { 
      // Listen for sign-in state changes. 
      gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus); 

      // Handle the initial sign-in state. 
      updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get()); 
      authorizeButton.onclick = handleAuthClick; 
      signoutButton.onclick = handleSignoutClick; 
     }); 
    } 

    /** 
    * Called when the signed in status changes, to update the UI 
    * appropriately. After a sign-in, the API is called. 
    */ 
    function updateSigninStatus(isSignedIn) { 
     if (isSignedIn) { 
      authorizeButton.style.display = 'none'; 
      signoutButton.style.display = 'block'; 
      listUpcomingEvents(); 
     } else { 
      authorizeButton.style.display = 'block'; 
      signoutButton.style.display = 'none'; 
     } 
    } 

    /** 
    * Sign in the user upon button click. 
    */ 
    function handleAuthClick(event) { 
     gapi.auth2.getAuthInstance().signIn(); 
    } 

    /** 
    * Sign out the user upon button click. 
    */ 
    function handleSignoutClick(event) { 
     gapi.auth2.getAuthInstance().signOut(); 
    } 

    /** 
    * Append a pre element to the body containing the given message 
    * as its text node. Used to display the results of the API call. 
    * 
    * @param {string} message Text to be placed in pre element. 
    */ 
    function appendPre(message) { 
     var pre = document.getElementById('content'); 
     var textContent = document.createTextNode(message + '\n'); 
     pre.appendChild(textContent); 
    } 

    /** 
    * Print the summary and start datetime/date of the next ten events in 
    * the authorized user's calendar. If no events are found an 
    * appropriate message is printed. 
    */ 
    function listUpcomingEvents() { 
     gapi.client.calendar.events.list({ 
      'calendarId': 'primary', 
      'timeMin': (new Date()).toISOString(), 
      'showDeleted': false, 
      'singleEvents': true, 
      'maxResults': 10, 
      'orderBy': 'startTime' 
     }).then(function (response) { 
      var events = response.result.items; 
      appendPre('Upcoming events:'); 

      if (events.length > 0) { 
       for (i = 0; i < events.length; i++) { 
        var event = events[i]; 
        var when = event.start.dateTime; 
        if (!when) { 
         when = event.start.date; 
        } 
        appendPre(event.summary + ' (' + when + ')') 
       } 
      } else { 
       appendPre('No upcoming events found.'); 
      } 
     }); 
    } 

</script> 

<script async defer src="https://apis.google.com/js/api.js" 
     onload="this.onload=function(){};handleClientLoad()" 
     onreadystatechange="if (this.readyState === 'complete') this.onload()"> 
</script> 

回答

1

嘗試使用revoking token HTTP/REST方法:

以編程吊銷的令牌,應用程序發出請求 到https://accounts.google.com/o/oauth2/revoke和包括令牌 作爲參數:

curl -H "Content-type:application/x-www-form-urlencoded" \ 
     https://accounts.google.com/o/oauth2/revoke?token={token} 

令牌可以是訪問令牌或刷新令牌。如果令牌是 訪問令牌並且它具有相應的刷新令牌,則更新 令牌也將被撤銷。

+0

這是行得通的。不過,我想通過JS API來完成。這是如何完成的? –

+0

嘗試使用GoogleAuth.disconnect()的JavaScript示例[此處](https://developers.google.com/identity/protocols/OAuth2UserAgent);其中GoogleAuth = gapi.auth2。getAuthInstance(); – noogui

+0

謝謝。這工作。奇怪的signOut不起作用。看起來很簡單。 –