Google+ signinCallback 被调用两次,且在过程中丢失 authresult

问题描述

在使用 Google+ API 进行用户登录时,有时我们会遇到 signinCallback 被调用两次的情况,并且在第二次调用中丢失了 authresult

原因分析

这个问题通常是由于以下原因之一导致的:

  1. 多个不同版本的 Google API 脚本同时存在。
  2. 在同一个页面上多次使用 gapi.auth.signIn() 方法。
  3. gapi.client.init() 中使用了 ux_mode: "popup"ux_mode: "redirect" 参数,但没有正确处理回调 URL 中的参数。

对于第一种情况,我们需要确保网站上只引入了一个版本的 Google API。如果你使用的是 Google+ API,则应该只包含 <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script> 这一行脚本。

对于第二种情况,我们需要确保在页面上只调用一次 gapi.auth.signIn() 方法。如果需要多次进行登录操作,应该考虑将其封装为一个方法并在需要的地方进行调用。

对于第三种情况,我们需要在 gapi.client.init() 调用中使用 ux_mode: "prompt" 参数,并在 signinCallback 回调函数中自行解析 URL 中的参数。

解决方案

针对上述三种情况,我们可以分别采取以下解决方案:

  1. 只引入一个版本的 Google API。
---- ----- ---
------- ----------------------------------------------------
------- --------------------------------------------------------- ----- ---------------

---- ----- ---
------- ---------------------------------------------------------------- ----- ---------------
  1. gapi.auth.signIn() 封装为一个方法并在需要的地方进行调用。
-------- ------- -
  ------------------
    --------- ---------------
    ---------- -----------------
    ------ -------
  ---
-

----------------------------------- -
  --------
---
  1. 使用 ux_mode: "prompt" 参数,并在 signinCallback 回调函数中自行解析 URL 中的参数。
-------- --------------- -
  ------------------
    ------- ---------------
    --------- -----------------
    -------------- ---------------
    ------ ------------- ---
    -------- --------
  ---------------- -- -
    -- ---
  ---
-

-------- -------------------------- -
  -- ----------- -- ------------------------ -
    -- -- ----------
  - ---- -
    -- -- --- ----
    --- ------ - ---
    --- ----------- - ---------------------------
    --- ----- - --------------------
    --- ------
    ----- ------- - ------------------------- -
      ------------------------------------ - -----------------------------
    -
    -- -------------- -
      ------------------- ------- ------ - - --------------
    - ---- -
      ------------------- ------- -------------
    -
  -
-

结论

在使用 Google+ API 进行用户登录时,我们需要避免引入多个不同版本的 Google API 脚本、多次调用 gapi.auth.signIn() 方法以及正确处理回调 URL 中的参数。采取相应的解决方案可以避免 signinCallback 被调用两次并且在过程中丢失 authresult

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/30286


猜你喜欢

  • Angular中在使用Grunt Build打包后出现"Unknown Provider"错误

    在Angular应用程序中使用依赖注入是非常重要的,它使得代码易于维护和测试。然而,在使用Grunt Build工具将前端应用程序打包时,可能会出现"Unknown Provider"错误。

    6 年前
  • OCaml 作为 Hack 和 Flow 的编程语言的优点

    OCaml 是一种强类型、静态类型、函数式编程语言,它已被广泛用于编写高性能系统和库。Hacklang 和 Flow 都是 Facebook 开发的静态类型检查工具,这两个工具都使用了 OCaml 作...

    6 年前
  • 如何将字符转换为其键码?

    在前端开发中,有时需要将按键的字符转换为其对应的键码,以便进行进一步处理。本文将介绍如何使用 JavaScript 将字符转换为其键码,并提供实用的示例代码。 什么是键码? 键码(keycode)是与...

    6 年前
  • 在 AngularJS 中访问另一个模块中定义的工厂

    在 AngularJS 中,模块(module)是将应用程序拆分成各个功能块的基本单位。每个模块可以包含控制器、服务、指令等组件。通常情况下,我们会将一些相关的组件打包到同一个模块中,以便管理和维护。

    6 年前
  • 在不使用 jQuery 的情况下注册 JavaScript 事件

    JavaScript 是现代 Web 开发中必不可少的一部分。处理用户交互需要在 HTML 元素上注册事件,以便在特定行为发生时执行相应的代码。虽然 jQuery 提供了方便的 API 来处理这些事件...

    6 年前
  • JavaScript 中能否动态设置 tabindex 属性?

    HTML 页面中的 tabindex 属性用于控制页面中可聚焦元素(如按钮、链接等)的顺序。在许多情况下,我们需要动态地更改 tabindex 值以实现一些交互效果,那么,在 JavaScript 中...

    6 年前
  • 在 expect() 断言失败时打印信息

    在前端开发中,我们经常使用断言库来测试代码的正确性。断言库提供了一组函数,以便我们检查某些条件是否成立,并在条件为假时抛出异常。其中一个流行的断言库是 Jest。当我们使用 Jest 进行测试时,有时...

    6 年前
  • 使用 gulp 命令启动 Node.js 服务器

    Node.js 是一个非常流行的 JavaScript 运行时,可用于构建各种 Web 应用程序。但是,在运行和测试应用程序之前,您需要启动本地服务器。 使用 gulp 命令可以快速轻松地启动 Nod...

    6 年前
  • JavaScript 回调函数是否都是异步的?如果不是,如何判断?

    JavaScript 中的回调函数是一种常见的编程技术,它用于在异步操作完成时通知程序执行下一步操作。回调函数可以是同步或异步的,这取决于它们被调用的方式和所使用的 API。

    6 年前
  • 检查控制台是否存在

    当您的应用程序依赖于控制台输出时,检查控制台是否存在变得至关重要。在前端开发中,我们可以使用JavaScript编写代码来检查控制台是否可用。 如何检查控制台是否存在? 我们可以使用以下代码片段来检查...

    6 年前
  • Three.js 中 wireframe material - 全部多边形 vs. 仅边缘

    Three.js 是一种流行的 JavaScript 库,用于在网页上创建3D图形。它包含了丰富的材质和渲染选项,其中包括 wireframe 材质。 Wireframe 材质是一种显示物体边缘的方法...

    6 年前
  • 监听 EADDRNOTAVAIL 错误及其解决方法

    在 Node.js 应用程序中,当我们尝试监听某个 IP 地址或端口时,可能会遇到 EADDRNOTAVAIL 错误。这意味着所请求的地址或端口不可用,通常是因为它正在被使用或已经被占用了。

    6 年前
  • Why has Object.observe() been deprecated

    简介 在2015年,Object.observe() 被从ECMAScript规范中删除。作为代替,开发者被鼓励使用 Proxy 对象来实现数据的变化监测。 本文将探讨 Object.observe(...

    6 年前
  • JavaScript: 获取对象的第一个和唯一属性名

    在 JavaScript 中,我们可以使用对象来存储和组织数据。在某些情况下,我们可能需要获取对象中的第一个或唯一一个属性名。本文将介绍几种实现方式和其应用场景。 方法一:使用 Object.keys...

    6 年前
  • AngularJS - ngOptions:如何按组名和标签排序

    在AngularJS中,ngOptions指令提供了一种方便的方式来创建选择框。但是,在某些情况下,您可能需要对选项进行分组并按组名和选项标签进行排序。本文将介绍如何使用ngOptions进行此操作,...

    6 年前
  • 如何在两个 div 之间绘制一条线?

    在网页开发中,有时需要在两个 div 元素之间绘制一条线。可能是为了增加页面的可读性或者提高交互效果。那么如何实现这个功能呢?本文将详细介绍。 方法一:使用伪元素 可以使用 CSS 的伪元素 :bef...

    6 年前
  • Javascript Promises vs Async Await. Difference?

    在Javascript中,Promises和Async Await都是处理异步操作的常见方法。然而,它们之间有一些重要的区别。本文将深入探讨这些区别,并提供示例代码以帮助读者更好地理解。

    6 年前
  • 在 CodePen 中使用巨大数组时,JavaScript 行为奇怪

    引言 在开发 Web 应用程序时,JavaScript 经常被用于处理数据。有时,开发人员需要处理大量的数据,例如大型图像或视频文件,或者非常大的数据集。在这种情况下,可能需要使用巨大的数组来存储和操...

    6 年前
  • 是否可以创建没有 DOM 元素的 HTML 画布?

    HTML canvas 是一个非常强大和灵活的前端技术,它允许我们通过 JavaScript 在浏览器中绘制各种形状、图案和动画。通常情况下,我们都是通过在 HTML 中添加 &lt;canvas&g...

    6 年前
  • 使用 D3 的 Tree Layout 和 NodeSize 实现节点之间的空隙

    在前端开发中,使用 D3.js 可以轻松地创建数据可视化图表。其中,D3 的 Tree Layout 用于将层次结构数据转换为可视化树形图表。但是,在默认情况下,相邻节点之间可能会重叠或过于接近,影响...

    6 年前

相关推荐

    暂无文章