我正在通过JS使用谷歌登录,看来我的代码获取数据两次.我不确定为什么会这样.
当我点击"使用Google登录"按钮时,它会向用户吐出(console.log(result))数据.然后出现提示,要求我选择我的帐户(我登录了几个谷歌帐户).当我点击我想要的帐户时,代码会再次吐出该用户数据.
为什么会这样?这是一个问题,因为在我吐出数据的地方,我想做一个ajax调用来验证用户,然后重定向它们.所以从本质上说,它试图这样做两次 - 这并不酷,如果我不想使用凭据登录google在第一次转发时回传?
(function() {
var po = document.createElement('script');
po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/client:plusone.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(po, s);
})();
function googleLogin() {
var additionalParams = {
'callback': googleCallback
};
gapi.auth.signIn(additionalParams);
}
function googleCallback(authResult) {
if (authResult['status']['signed_in']) {
gapi.client.load('oauth2', 'v2', function() {
gapi.client.oauth2.userinfo.get().execute(function(resp) {
console.log(resp);
})
});
} else {
console.log('Sign-in state: ' + authResult['error']);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:如果我退出所有Google帐户(除了一个且只有一个),谷歌的调用仍然是重复的.这次它登录,我看到console.log()两次输出数据.访问令牌是相同的.
更新2: console.log(resp)输出两次
更新3:更多说明:

javascript google-api google-authentication google-api-client google-oauth
我正在使用谷歌登录混合流来验证用户,但我有一个奇怪的错误:当用户退出(authResult['error'] == 'user_signed_out')时,会signInCallback被调用两次!当用户登录时不会发生这种情况,因此我认为它不会与(相当烦人的)"欢迎回来[用户]"提示相关联.
我的代码看起来像这样:
function signInCallback(authResult) {
console.log("signIn callback called, using " + authResult['status']['method'] + " method");
console.log("authResult = ");
console.dir(authResult);
if (authResult['code']) {
// do things....
}else if(authResult.error == "user_signed_out"){
// do other things...
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在控制台上得到的: console log http://img4.hostingpics.net/pics/968420Capture1.jpg 查看大图
我正在使用的HTML代码:
<div id="signinButton" style="display:<?=(isset($_SESSION['userinfo'])) ? 'none' : 'inline-block'?>">
<span class="g-signin"
data-scope="<?=join(' ',$scopes)?>"
data-clientid="<?=$client_id?>"
data-redirecturi="<?=$redirect_uri?>"
data-accesstype="<?=$access_type?>"
data-cookiepolicy="<?=$cookie_policy?>"
data-callback="signInCallback"
data-approvalprompt="<?=$approval_prompt?>"
data-state="<?=$_SESSION['state']?>"
></span>
</div>
Run Code Online (Sandbox Code Playgroud)
我在两个不同的浏览器上使用两个不同的Google帐户.我最初认为这是由于(谷歌存储在一个cookie中google_account_id和用户状态,如G_USERSTATE_H3 : 'google_account_id#1=0&google_account_id#2=1').但是我在两个浏览器上清除了所有cookie,并且只用了一个浏览器和一个谷歌帐户运行我的测试.我还是得到了这个bug.
这是一个非常讨厌的bug.此外,谷歌Chrome处理得相当好,但是Firefox完全被吓坏了并且执行了三次回调,然后,用户无法登录(他已登录1秒,并立即重新注销).
有人可以帮帮我吗?
更新:这是Google JS Api的包含方式:
<script>
// Asynchronous …Run Code Online (Sandbox Code Playgroud) javascript google-api google-login google-oauth google-api-js-client