GoogleAuth.isSignedIn.get();是假而不是真

时间:2021-04-17 15:55:02

标签: javascript oauth-2.0 google-api

我已经使用 OAuth 2.0 在我的网站上实现了“with google”登录按钮。

我在使用 GoogleAuth.isSignedIn.get() 时遇到问题;应该在用户登录时返回 true,否则返回 false。

这是我的代码:

<html>
<head>
    <meta name="google-signin-client_id" content="XXXXXXXXXXXXXX">
    <script src="https://apis.google.com/js/platform.js?onload=onLoad" async defer></script>
</head>
<body>
    <a href="#" onclick="signOut();">Déconnexion</a>
    <script>
        function onLoad(){
            gapi.load('auth2', function(){
                gapi.auth2.init();
                GoogleAuth = gapi.auth2.getAuthInstance();
                GoogleAuth.isSignedIn.listen(signinChanged);
                state = GoogleAuth.isSignedIn.get();
            });
        }

        var signinChanged = function (val) {
            console.log('Signin state changed to ', val);
        };

        function signOut(){
            gapi.auth2.getAuthInstance().signOut();
            window.location.replace('xxxxxxxxxxx.xx/google/login.php');
        }
    </script>
</body>
</html>

使用这里的代码,state 等于 false。但是当我执行命令 GoogleAuth.isSignedIn.get();在控制台中,state 等于 true。

当用户应该登录时,所有这一切都会发生!

如何使 state 等于 true 而不是 false?因为我现在不知道用户是否登录...

澄清一下,这是我特别想做的:

用户使用 Google 身份验证按钮登录我的网站。如果登录成功,他将被重定向到登录失败时应该无法访问的页面。

在登录过程之外,我希望能够使用 Ajax 运行 PHP 脚本来创建 PHP 会话变量,以便让服务器知道用户已登录,并使他们保持在线状态。

这里是我的问题:

目前连接有效,我知道如何使用 ajax 运行脚本。我不知道该怎么做是询问 Google 用户是否已连接到他的帐户。目前,无论用户是否登录,我都有上面的代码返回“false”。通过挖掘,我意识到如果我通过将超时设置为 1 秒来使用 setTimeout() 函数向 Google 询问登录状态,当用户登录时我会得到“真”,而当他没有登录时我会得到“假”。< /p>

问题是这个系统依赖于登录的用户,因为如果 1 秒太短而没有时间查询谷歌,我会得到“假”返回而不是“真”返回。

我如何确保无论发生什么,无论连接质量如何,因此页面加载速度如何,我都能获得用户连接的正确“真”或“假”值以便能够使用它如我所愿?

提前致谢,如果不清楚,很抱歉,这是一个简单的问题,但在困难的背景下。

1 个答案:

答案 0 :(得分:0)

我的猜测是,当您在 GoogleAuth.isSignedIn.get() 函数中调用 gapi.load 时,用户尚未登录。因为页面刚刚加载,用户还没有完成登录。

您必须等待 signinChanged 函数被调用才能获得正确的状态。

我认为以下内容将为您带来正确的状态:

var signinChanged = function(val) {
    console.log('Signin state changed to ', val);
    var state = GoogleAuth.isSignedIn.get();
    console.log(state);
};

如果您需要在登录后处理一些代码,您必须等待 signinChanged 被调用,值为 true,例如:

var signinChanged = function(val) {
    console.log('Signin state changed to ', val);
    if (val){
        // user is logged in, execute my code here
        callbackToMyCode();
    }
};
相关问题