无法签署Google OAuth2

时间:2017-09-11 22:53:13

标签: javascript google-calendar-api google-oauth google-oauth2

我无法使用Google signOut()在我登录的oAuth会话中签名。

例如,我已粘贴以下代码直接从Google快速入门网站获取... 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

我正在听取对signIn状态的任何更改... enter image description here

但是对于signOut()来说,回调永远不会被击中...... enter image description here

最后,如果我从开发者控制台尝试整个事情......

  1. 显示gapi.auth2表示我已登录
  2. 手动退出命令
  3. 显示gapi.auth2表示我仍然登录 enter image description here
  4. 如何修改此代码以使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>
    

2 个答案:

答案 0 :(得分: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}
  

令牌可以是访问令牌或刷新令牌。如果令牌是   一个访问令牌,它有一个相应的刷新令牌,刷新   令牌也将被撤销。

答案 1 :(得分:0)

另一种选择是将其添加到网页中:

<a href="#" onclick="signOut();">Sign out</a>
<script>
  function signOut() {
    var auth2 = gapi.auth2.getAuthInstance();
    auth2.signOut().then(function() {
      console.log('User signed out.');
    });
  }
</script>

https://developers.google.com/identity/sign-in/web/sign-in中的更多信息