我正在为网站添加谷歌登录按钮。在文档中,谷歌提供了两个选项,一个"基本"按钮:
https://developers.google.com/identity/sign-in/web/sign-in
和使用signin2.render()
:的"自定义"按钮
https://developers.google.com/identity/sign-in/web/build-button
我遇到的问题是这两个按钮表现出不同的行为。如果我使用任一按钮登录,按钮的"标题"将从"登录"更改为"已登录",以反映登录状态。但是,如果我现在刷新页面,则基本按钮将保留标题"已登录",而自定义按钮将其标题改回"登录",这表明(错误地)登录状态在页面刷新过程中发生了更改。
如果我通过运行在浏览器控制台中手动检查刷新后的登录状态
auth = gapi.auth2.getAuthInstance()
auth.isSignedIn.get()
我得到true
作为返回,表明刷新确实没有改变登录状态,这与按钮标题的更改相反。
所以我的问题是:如何让自定义按钮的行为像基本按钮一样,这样它的标题在刷新时就不会改变?我喜欢的基本按钮的另一个(相关的,我认为)行为是,在每次页面加载时(如果用户登录)都会调用按钮的"onsuccess"回调,而自定义按钮则不会这样做。因此,我也想更改自定义按钮上的这种行为,使其与基本按钮的行为相匹配。如有任何建议,我们将不胜感激!
我传递给渲染的参数如下:
function renderButton() {
gapi.signin2.render('mybutton', {
'scope': 'profile email',
'width': 125,
'height': 40,
'longtitle': false,
'theme': 'light',
'onsuccess': onSuccess,
'onfailure': onFailure
});
}
您能提供传递给按钮的参数吗?你能确认JS控制台中没有任何错误,也没有任何400/403/404/4xx请求吗?
我已经使用以下代码测试了这个功能,它似乎运行得很好(您必须用实际的CLIENT_ID替换YOUR_CLIENT_ID)。
<head>
<meta name="google-signin-client_id" content="YOUR_CLIENT_ID">
</head>
<body>
<script>
function onSuccess(googleUser) {
console.log('onSuccess!');
}
function onCustomSuccess(googleUser) {
console.log('onCustomSignIn!');
}
function signOut() {
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
console.log('User signed out.');
});
}
function onLoad() {
gapi.signin2.render('custom_signin_button', {
'onsuccess': onCustomSuccess
});
}
</script>
<div class="g-signin2" data-onsuccess="onSuccess"></div>
<div id="custom_signin_button"></div>
<a href="#" onclick="signOut();">Sign out</a>
<script src="https://apis.google.com/js/platform.js?onload=onLoad" async defer></script>
</body>
</html>
编辑:将基本作用域声明为head的元标记是最好的解决方案。
<meta name="google-signin-scope" content="profile email">