【问题标题】:Google+ oauth2 callback triggered multiple timesGoogle+ oauth2 回调多次触发
【发布时间】:2015-01-30 23:58:17
【问题描述】:

我有以下sn-p的代码:

var myParams = { 
'clientid' : 'XXXXX.apps.googleusercontent.com', 
'cookiepolicy' : 'single_host_origin', 
'callback' : _.bind(function(response){ this._loginGoogleCb(response); }, this), 
            'scope' : 'https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/plus.profile.emails.read', 
            'requestvisibleactions' : 'http://schemas.google.com/AddActivity' 
        }; 
gapi.auth.signIn(myParams); 

第一次单击按钮并执行此代码时,没有问题。
但是,当我第二次单击该按钮时,回调(并且只有回调)会被执行两次。
每次执行此代码时,对 Google 服务器(以及相关回调)的请求数都会增加 1。

我仔细检查过,调用函数本身在重复时只会执行一次。
按钮单击本身不是问题。

知道可能是什么问题吗?

【问题讨论】:

  • 是否可以为您的页面设置一个小提琴,以查看您所面临的问题到底是什么......或者您如何确认它是对服务器的回调,它随着时间的推移而增加点击..更多代码 sn-p 也会有所帮助..据我所知,当您使用 javascript 进行 Oauth 时,它是一次授权,因此当您第一次进行 Oauth 时,它会显示您的同意屏幕基本上接受或拒绝..从第二次开始弹出仍然出现,但你不需要做任何事情..它会拿起并获取访问令牌..所以每次都会弹出弹出窗口
  • 我在这里创建了一个小提琴:jsfiddle.net/g1mjLkgp 但由于来源不匹配,这可能不会有太大帮助。该问题已“解决”,因为用户在注销后总是会返回主页并刷新页面。然而,这是一个可悲的问题解决方案,但它现在解决了。

标签: javascript oauth oauth-2.0 google-plus google-oauth


【解决方案1】:

从this文章可以看出,有三种不同的状态方式:

  • 空
  • 提示
  • 自动

在授权对象中:

{
  "id_token": string,
  "access_token": string,
  "expires_in": string,
  "error": string
  "status": { /* object */
    "google_logged_in" : boolean,
    "signed_in" : boolean,
    "method" : string /* null, PROMPT, or AUTO */
  }
}

发生的情况是,当您第一次登录时,只会触发其中一种状态方法(“PROMPT”),但是当您再次按下按钮时会触发两种状态方法(“PROMPT”和“自动”)。

处理这些状态方法的示例“signinCallback”代码可以在here找到。

另外,如果你多次调用下划线的绑定函数,那么绑定函数也会被多次调用。因此,您看到“对 Google 服务器(和相关回调)的请求数量随着 1 的增加而增加”的原因。我建议将这个调用封装在另一个函数中进行绑定,并包含一个保护条件来阻止它被多次调用。

【讨论】:

  • 感谢您的回答。好吧,我有回调代码,但让我担心的是,它被触发的次数越来越多,每次我在没有刷新页面的情况下退出后重新登录。在检查状态之前,我可以使用 console.log 轻松检查。
  • 您是否在重新登录时检查了授权对象中的“错误”变量(尽管我怀疑是否有错误,无论如何都值得检查)。后续登录中“方法”的价值是什么?此外,它被触发的次数越来越多的事实听起来是回调代码被多次重新注册的症状;你确定你只注册一次回调?
  • 是的,没有错误,后续调用都有状态方法“PROMPT”。看来我确实多次注册了回调,但我不确定如何只注册一次。正如我在问题中的代码所示,它只是我每次想再次登录时传递给gapi.auth.signIn(myParams); 的一组参数。
  • 好吧,那你为什么要使用下划线的绑定呢?我怀疑每次调用它时,您都会重新注册处理程序。为什么不删除对绑定的调用并仅引用处理程序(正如我在回答中提到的链接问题中所做的那样)。
  • 我将作用域绑定到我管理所有逻辑的 Marionette 控制器对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多