2017-09-11 126 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不起作用。看起来很简单。 –