【发布时间】: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