【问题标题】:gapi.auth.signOut(); not working I'm lostgapi.auth.signOut();不工作我迷路了
【发布时间】:2017-06-16 09:13:18
【问题描述】:

下面是我用来登录谷歌的代码。我在 login.php 上有一个带有 id 授权按钮的元素。当点击它登录就好了。

我的头文件中有一个注销链接。当我单击注销时,它会调用 gapi.auth.signOut(); 然后它会破坏会话并重定向回 l​​ogin.php

据我所知,这种情况发生了,但它只是将用户直接用谷歌登录到我们的网站。当我们的一些用户从 google 切换到 facebook 登录时,这很痛苦。

提前感谢您的帮助。

function handleClientLoad() {
    gapi.client.setApiKey(apiKey);
    window.setTimeout(checkAuth, 1);
}

function checkAuth() {
    gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult);
}

function handleAuthResult(authResult) {
    var authorizeButton = document.getElementById('authorize-button');


    if (authResult && !authResult.error) {
        //authorizeButton.style.visibility = 'hidden';
        makeApiCall();
    } else {
        //authorizeButton.style.visibility = '';
        authorizeButton.onclick = handleAuthClick;
    }
}

function handleAuthClick(event) {
    gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, handleAuthResult);
    return false;
}

function signOut() {
    gapi.auth.signOut();
}


function makeApiCall() {

    gapi.client.load('oauth2', 'v2', function() {
        var request = gapi.client.oauth2.userinfo.get();

        request.execute(function(logResponse) {

            var myJSON = {
                "myFirstName": logResponse.given_name,
                "myLastName": logResponse.family_name,
                "name": logResponse.name,
                "socialEmailAddress": logResponse.email
            };

            gapi.client.load('plus', 'v1', function() {

                var request = gapi.client.plus.people.get({
                    'userId': 'me'
                });
                request.execute(function(logResponse2) {
                    //alert(JSON.stringify(logResponse));
                    myJSON['profilePicture'] = logResponse2.image.url;
                    myJSON['socialId'] = logResponse2.id;
                    //alert(JSON.stringify(myJSON));
                    $.ajax({
                        type: "POST",
                        url: "includes/login-ajax.php",
                        data: "function=googleLogin&data=" + JSON.stringify(myJSON),
                        dataType: "html",
                        success: function(msg) {

                            if (msg == 1) {

                                //window.location = "settings.php";
                            }
                        }
                    });
                });
            });
        });
    });
}

【问题讨论】:

    标签: oauth oauth-2.0 google-plus google-oauth


    【解决方案1】:

    确保您已在登录按钮代码中将 cookie-policy 设置为 none 以外的值。例如:

    function handleAuthClick(event) {
      gapi.auth.authorize(
        {
          client_id: clientId, 
          scope: scopes, 
          immediate: false, 
          cookie_policy: 'single_host_origin'
        },
        handleAuthResult);
      return false;
    }
    

    请注意,如果您从 localhost 运行,注销将不起作用。

    【讨论】:

    • 非常感谢您的回答。我花了很多时间来弄清楚为什么它对我不起作用。问题是我使用了 localhost。
    • 还是不行。我有一个链接到 php 页面的注销链接。我在该页面中有以下内容。
    • +1 - 我不知道从 localhost 运行退出是行不通的。一直在敲我的头一个小时。谢谢! (我希望 Google 会在他们的网站上记录这一点)
    • 那么如何测试signOut()
    • 从不是本地主机的测试网络服务器测试signOut(),一种简单的方法是使用ngrok
    【解决方案2】:

    奇怪的问题,但通过呈现登录按钮(隐藏)解决了我的问题,即使用户已通过身份验证。

    在此处查看完整的问题/答案https://stackoverflow.com/a/19356354/353985

    【讨论】:

    • 这解决了您的问题,因为呈现登录按钮会启动回调例程,必须在退出函数起作用之前调用该例程。您可以通过在元标记中包含对回调函数的引用来完成同样的事情:,其中“signinCallback”是您的 javascript 函数的名称检查用户是否登录或退出。
    • 你对回调例程是正确的。我一定会尝试元方式。
    【解决方案3】:

    我今天遇到了同样的问题。我一直在寻找解决方案。唯一对我有用的可靠解决方案是通过撤销 here

    的解释

    我将 access_token 存储在 session 中,这是在 revoke 期间需要的

    下面是我的代码,你可能会觉得它很有用

          function logout() {
             var access_token = $('#<%=accessTok.ClientID %>').val();
             var provider = $('#<%=provider.ClientID %>').val();
        if (access_token && provider) {
            if (provider == 'GPLUS') {
                var revokeUrl = 'https://accounts.google.com/o/oauth2/revoke?token=' +
                    access_token;
    
                // Perform an asynchronous GET request.
                $.ajax({
                    type: 'GET',
                    url: revokeUrl,
                    async: false,
                    contentType: "application/json",
                    dataType: 'jsonp',
                    success: function (nullResponse) {
                        // Do something now that user is disconnected
                        // The response is always undefined.
                    },
                    error: function (e) {
                        // Handle the error
                        // console.log(e);
                        // You could point users to manually disconnect if unsuccessful
                        // https://plus.google.com/apps
                    }
                });
            }
            else if (provider == 'FB') {
                FB.getLoginStatus(function (response) {
                    if (response.status === 'connected') {
                        FB.logout();
                    }
                });
            }
        } else {
    
        }
    }
    

    【讨论】:

    • 我也遇到了这种情况,而且我的头发都快掉光了。如果你仔细想想,它实际上是谷歌部分的主要安全漏洞。
    • 在 3 年后再次遇到同样的问题并找到了我的答案,gapi.auth.signOut() 没有注销,如果这是同步的,至少根据他们的文档应该有,想知道为什么这不是接受,因为这似乎是唯一可行的解​​决方案。
    • 这项工作似乎更早的工作不再工作了,不确定是否有办法让用户像 fb 那样从应用程序中注销,宁愿 gplus 从首选登录中退出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2015-02-07
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多