Oauth gapi.auth.signOut();不工作I';我迷路了

Oauth gapi.auth.signOut();不工作I';我迷路了,oauth,oauth-2.0,google-plus,google-oauth,Oauth,Oauth 2.0,Google Plus,Google Oauth,下面是我使用谷歌登录的代码。我在login.php上有一个带有id authorize按钮的元素。单击后,它会正常登录 我的头文件中有一个注销链接。当我单击注销时,它调用gapi.auth.signOut()然后它破坏会话并重定向回login.php 据我所知,这种情况会发生,但它只是将用户直接登录到我们的谷歌网站。这是一种痛苦,因为我们的一些用户从谷歌转向facebook登录 提前感谢您的帮助 function handleClientLoad() { gapi.client.setA

下面是我使用谷歌登录的代码。我在login.php上有一个带有id authorize按钮的元素。单击后,它会正常登录

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

据我所知,这种情况会发生,但它只是将用户直接登录到我们的谷歌网站。这是一种痛苦,因为我们的一些用户从谷歌转向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";
                            }
                        }
                    });
                });
            });
        });
    });
}

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

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

请注意,如果您是从本地主机运行,注销将不起作用。

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


参见此处的完整问题/答案

我今天遇到了同样的问题。我一直在寻找解决办法。对我来说,唯一可靠的解决方案是通过撤销

我在会话中存储了撤销期间所需的访问令牌

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

      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 {

    }
}
函数注销(){
var access_token=$('#').val();
var provider=$('#').val();
if(访问\u令牌和提供程序){
如果(提供程序=='GPLUS'){
var revokeUrl=https://accounts.google.com/o/oauth2/revoke?token=' +
接入令牌;
//执行异步GET请求。
$.ajax({
键入:“GET”,
url:revokeUrl,
async:false,
contentType:“应用程序/json”,
数据类型:“jsonp”,
成功:函数(空响应){
//现在用户已断开连接,请执行某些操作
//响应总是未定义的。
},
错误:函数(e){
//处理错误
//控制台日志(e);
//如果失败,您可以指示用户手动断开连接
// https://plus.google.com/apps
}
});
}
else if(提供程序=='FB'){
FB.getLoginStatus(函数(响应){
如果(response.status===“已连接”){
FB.logout();
}
});
}
}否则{
}
}

非常感谢您的回答。我花了很多时间想明白为什么它对我不起作用。问题是我使用了localhost。它仍然不起作用。我有一个链接到php页面的注销链接。我在那一页有以下内容//注销google gapi.auth.signOut()+1-我不知道从localhost运行注销不会起作用。我的头撞了一个小时了。谢谢(我希望谷歌能在他们的网站上记录这一点)那么如何测试
signOut()
呢?从不是本地主机的测试web服务器测试
signOut()
,一种简单的方法是使用。这解决了您的问题,因为呈现signin按钮会启动回调例程,必须在signOut函数运行之前调用回调例程。您可以通过在meta标记中包含对回调函数的引用来完成同样的事情,其中“signinCallback”是检查用户是否登录或注销的javascript函数的名称。您对回调例程的看法是正确的。我一定会尝试meta的方法。我也经历过这种情况,我正在把我的头发撕下来。如果你想一想,这实际上是谷歌的一个重大安全隐患。在3年后再次遇到同样的问题并找到了我的答案,gapi.auth.signOut()没有注销&至少根据他们的文档,这是同步的,想知道为什么这一点没有被接受,因为这似乎是唯一可行的解决方案。这一解决方案似乎在更早的时候起作用,不再起作用,不确定是否有办法允许用户像fb那样从应用程序中注销,宁愿将GPLU从首选登录中删除