我已经使用 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 秒太短而没有时间查询谷歌,我会得到“假”返回而不是“真”返回。>
我如何确保无论发生什么,无论连接质量如何,因此页面加载速度如何,我都能获得用户连接的正确“真”或“假”值以便能够使用它如我所愿?
提前致谢,如果不清楚,很抱歉,这是一个简单的问题,但在困难的背景下。
答案 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();
}
};