通过 gapi.signin2.render 按钮的 Google OAuth 未在反应应用程序中点击回调

Posted

技术标签:

【中文标题】通过 gapi.signin2.render 按钮的 Google OAuth 未在反应应用程序中点击回调【英文标题】:Google OAuth via gapi.signin2.render button not hitting callbacks in react app 【发布时间】:2017-03-21 16:13:36 【问题描述】:

我使用最新的 Google 平台网络客户端 api (https://apis.google.com/js/platform.js) 上的 gapi.signin2.render 方法在我的 react 组件中正确呈现了 Google 登录按钮。

但是,就我的一生而言,我无法让它正确地调用我的成功或失败回调。

按钮呈现,点击按钮打开账户验证窗口,点击谷歌账户关闭窗口,但没有回调。

function myCallback(obj) 
  console.log(obj);


gapi.signin2.render('my-signin2', 
  scope: 'https://www.googleapis.com/auth/plus.login',
  width: 200,
  height: 50,
  longtitle: true,
  theme: 'dark',
  onsuccess: myCallback,
  onfailure: myCallback
);

我不知道我在这里缺少什么。非常感谢任何帮助!

【问题讨论】:

嘿。我对 Angular 有一个非常相似的问题。你有运气吗? 【参考方案1】:

docs 告诉你添加这个:

<div class="g-signin2" data-onsuccess="onSignIn"></div>

但这不适用于 React。我发现从div 中删除data-onsuccessclass (className) 可以解决问题。所以如果你有这样的事情:

  useEffect(() => 
    window.gapi.signin2.render('gs2', 
      'scope': 'https://www.googleapis.com/auth/plus.login',
      'width': 200,
      'height': 50,
      'longtitle': true,
      'theme': 'dark',
      'onsuccess': onGoogleSignIn
    );
  , []);

  const onGoogleSignIn = user => 
    console.log('user', user);
  

那么你的 google 按钮的 jsx 可以是这样的:

<div id="gs2"></div>

请注意,我删除了class 并添加了id,因为gapi.signin2.render 正在寻找id

需要注意的是,现在您失去了样式。不幸的是,将className="g-signin2" 添加回div 实际上会中断回调。

【讨论】:

【参考方案2】:

当您创建客户端 ID 时,您将 url 设置为 ,让我们说 'localhost'。现在你运行你的代码,让我们说'localhost:8080'。 您的“myCallback”没有运行,因为没有从 google api 返回的数据,数据被发送到您指定的可信 URL,即“localhost”。 这个想法很简单,请求可以来自任何地方,但是 google api 将数据发送到您信任的 url 作为安全步骤,如果请求来自那里,您会得到它,如果不是有人试图使用您的客户 ID。

【讨论】:

localhost 实际上在 Google 文档中用作示例:developers.google.com/identity/sign-in/web/server-side-flow

以上是关于通过 gapi.signin2.render 按钮的 Google OAuth 未在反应应用程序中点击回调的主要内容,如果未能解决你的问题,请参考以下文章

通过触摸移动按钮

通过单击按钮交替更改圆形按钮背景和文本

通过在多个按钮上滑动手指来选择多个按钮

如何通过按下按钮返回或按钮主页停止播放声音

如何通过关注其中一个按钮来为按钮组设置颜色[重复]

如何通过统一单击UI按钮来传递值