【问题标题】:Google API: Authorized JavaScript OriginsGoogle API:授权的 JavaScript 来源
【发布时间】:2014-08-01 16:53:02
【问题描述】:

我正在为我们的网络服务实现 Google+ 登录,并偶然发现了“授权的 JavaScript 起源”。我们的客户将网址作为我们主域的子域,或作为自定义域名。由于登录页面位于该子域(或自定义域)下,并且为了使 Google+ Sing-In 按钮工作,该自定义域/子域应(手动)输入“授权的 JavaScript 来源”列表(同时使用 http 和 https)。

有没有人知道自动执行此操作的方法(可能通过某些 API)? 如果没有,那你是怎么做到的?

【问题讨论】:

标签: javascript google-api google-plus


【解决方案1】:

不确定是否有用于此的 API。乍一看,我没有看到。另一种选择(除了一直手动添加域)是在每个站点上使用隐藏的 iframe - 这个 iframe 将来自您的域,并且是唯一调用谷歌服务的东西。主要站点将与 iframe (postMessage) 通信,告诉它要向 google 发送什么。当然,这会带来安全风险(任何人都可以将您的 iframe 加载到他们的页面中并代表您做坏事),因此您需要确保 iframe 代码拒绝执行任何操作,除非它在已知良好的域。

【讨论】:

  • 谢谢罗伯特。经过几次迭代,这是我能看到的唯一重要的解决方案——我正在使用一个带有 Google+ 登录按钮的 iframe,在经过 Google 身份验证后,它会在服务器上存储一个安全令牌,然后向父登录发出 postMessage页面,此时检查相同安全令牌的可用性,如果找到,则登录用户。安全检查也到位。到目前为止看起来不错。
【解决方案2】:

您还可以使用所有子域在尝试使用 Google 登录时指向的通用 URL。然后将此 URL 重定向到您的实际 Google 登录路径。不必以这种方式处理 iframe。

【讨论】:

  • 你能解释一下吗?
【解决方案3】:

我终于让它工作了,但是可能需要一些修复。

因此,服务器是许多域和子域 (childs) 的主机,它们都需要 google 登录,并且有一个主域 (parent)。

我在 parent 上实现了一个通用登录页面,childs 通过window.open() 作为弹出窗口打开此页面。由于客户端在弹出窗口中,auth2 很可能无法打开另一个弹出窗口,因此 parent 将使用 {ux_mode: 'redirect'} 参数作为 gapi.auth2.SignInOptions 进行 google auth。

进程将继续到您作为另一个gapi.auth2.SignInOptions 参数提供的回调页面,该参数是redirect_uri,位于父级上。

在此页面上,Google 可能为您提供了金色 id_token,您必须在您的服务器上验证此令牌。这是您应该使用此信息在您的服务器上创建一个令牌的主要转折点,parent 要求服务器创建,但将其发送到客户端的 child(对于例如通过查询参数)以供以后使用。

我很乐意听取有关安全漏洞的任何建议或任何可以稍微简化流程的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多