【问题标题】:GoogleAuth.isSignedIn.get(); is false instead of trueGoogleAuth.isSignedIn.get();是假而不是真
【发布时间】:2021-04-17 15:55:02
【问题描述】:

我已经使用 OAuth 2.0 在我的网站上实现了“使用 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>

在此代码中,状态等于 false。但是当我执行命令 GoogleAuth.isSignedIn.get();在控制台中,state 等于 true。

这一切都发生在用户应该登录时!

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

为了澄清,这是我特别想做的事情:

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

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

我们来解决我的问题:

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

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

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

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

【问题讨论】:

    标签: javascript oauth-2.0 google-api


    【解决方案1】:

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

    您必须等待调用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();
        }
    };
    

    【讨论】:

    • 此解决方案不适合我,请在此解决方案之后查看我的答案。我更好地解释了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多