Google+使用JavaScript回调问题登录

syl*_*ama 10 javascript callback google-api google-plus google-oauth

我正在开发一项功能,允许用户使用他们的Google帐户登录我的网站.

我的代码基于Google文档(其他signIn()选项位于元标记中).

function login() {
  gapi.auth.signIn({'callback':
    function (authResult) {
      if (authResult['status']['signed_in']) {
        console.log('Okay');
      }else {
        console.log('Error');
      }
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

当我调用login()时,会出现Google弹出窗口,我批准了我的应用程序的条款,一切正常.

但回调被调用两次:

  • 第一种情况:如果我从未批准过应用程序权限,那么当我批准权限时,将在弹出窗口打开时调用回调.所以它会写"错误"和"好的".
  • 第二种情况:如果我已经批准了权限,它会写两次"好".

'approvalprompt': 'force'在signIn()函数中添加了选项.回调函数不再被调用两次,但它会强制用户批准应用程序的权限,即使之前已批准.所以它不是用户友好的.

是否有友好的用户方式来批准应用程序的权限一次没有两个回调?

谢谢.

Dre*_*lor 8

我在这里遇到同样的问题,但是我通过按钮点击处理程序调用gapi.auth.signIn().回调仍然被调用两次.我注意到两个authResult对象之间的一件事是authResult.status.method在第一次调用中是'AUTO'(在弹出窗口出现之前)并且在窗口被自动关闭之后在第二次调用中是'PROMPT'授权.

我现在正在探索的解决方案是忽略AUTO实例并仅处理回调的PROMPT实例.由于"状态"对象上的文档中缺少详细信息,因此在我撤消Google中的权限后,我不确定这是如何工作的.


pop*_*ing 6

我面临同样的问题:如果用户已经授予权限,则签名回调两次; 局部变量方法(initializedGoogleCallback)对我不起作用,因为它仅在用户已经授予访问权限时调用回调一次,但如果用户是新用户则不调用它.经过一些研究(我特别是使用g + auth在网站上挖掘)后,我发现所有人都使用了这些,'approvalprompt': 'force'并且他们已经授权用户每次都重新批准"离线访问"政策.即使我按照设置我的应用程序(https://developers.google.com/+/web/signin/javascript-flow)的谷歌示例即使它没有提及它,它也使用"force"参数.目前它似乎是唯一的解决方案,如果你想使用javascript流(这意味着你需要一个个人风格的登录按钮)


Pan*_*tik 4

尝试在某个局部变量中注册第一个调用,然后处理它

这个快速解决方案可以帮助我:

function login() {
  var initializedGoogleCallback = false
  gapi.auth.signIn({
    'callback': function (authResult) {
       if (!initializedGoogleCallback) {
         // after first call other will be ignored
         initializedGoogleCallback = true;
         if (authResult['status']['signed_in']) {
           console.log('Okay');
         } else {
           console.log('Error');
         }
       }
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

您也可以在调用gapi.auth.signIn之前添加以下代码

window.removeEventListener('load')
Run Code Online (Sandbox Code Playgroud)