【问题标题】:Google OAuth2 API Separate Tokens by SubdomainGoogle OAuth2 API 按子域分隔令牌
【发布时间】:2018-03-29 00:04:51
【问题描述】:

我有一个需要与 Google API 端点集成的多租户应用程序,比如说日历 API。

应用程序的组织方式很像 Slack。您可以创建命名空间并邀请用户加入其中。子域用于分隔命名空间,因此可能有:foo.domain.combar.domain.combaz.domain.com

一个用户可以属于多个命名空间,就像在 slack 中您可以属于不同的团队一样。所以John 可以是foobar 的成员。

问题是,当John 决定让foo 访问他的日历信息时,Google 会将授权链接到domain.com 而不是foo.domain.com。当我也尝试让bar 访问他的日历时,没有刷新令牌,因为技术上John 已经授权访问......但我希望这些被独立对待。这样John 就能够撤销对foo.domain.com 的访问权限,但继续让bar.domain.com 访问他的日历数据。

有没有办法为同一个用户创建对同一个应用程序的独立授权?我无法跨子域共享refresh_token,因为它们可能在物理上是分开的,并且我无法为每个子域创建不同的应用程序,因为它们是动态生成的。

【问题讨论】:

    标签: oauth google-oauth


    【解决方案1】:

    身份验证的工作方式是基于您在 Google 开发者控制台中创建的客户端。

    如果约翰授予您的客户访问他的日历数据的权限,那么该客户将有权访问他的日历数据。 Google 无法知道您的 foo 或 bar 子域是否已被授予访问权限。

    多客户端选项

    您可能应该为每个不同的子域创建不同的客户端凭据。这可能是最合乎逻辑的做法。

    单一客户端选项

    除此之外,您还可以将信息存储在数据库中某个位置,John 已授予对 foo 但未授予 bar 的访问权限,并为 foo 但不为 bar 存储刷新令牌,如果他想为 foo 删除它,那么他可以这样做。您不必担心保持刷新令牌更新,因为从技术上讲,用户可以拥有多达 50 个与单个客户端关联的刷新令牌。

    如果用户撤消了它会撤消对所有内容的访问权限,而不仅仅是单个应用程序,只需使用 revoke 即可。

    【讨论】:

    • 感谢 DaImTo 的快速回答...不幸的是,我认为这两种方法都行不通...我无法共享信息(单客户端选项),因为不同的子域可能在物理上是分开的并且无法在它们之间进行通信,也无法执行“多客户端”选项,因为子域是在注册期间动态创建的,而且似乎我无法以编程方式生成它们:(
    • 这些是您唯一的选择。它是 Oauth 的一般工作方式。用户向客户端进行身份验证。我仍然认为,如果您在数据库中正确设置,单客户端选项可能会起作用。
    【解决方案2】:

    如果用户明确点击“授权”按钮,Google 的 OAuth 实施只会在响应中返回刷新令牌。这总是在第一次提示用户授权时发生,但默认情况下,当同一个应用程序再次要求对相同范围进行授权时,会跳过同意屏幕。

    您可以覆盖此行为,并通过在您的授权 URL 中添加参数 prompt=consent 来强制用户再次看到同意屏幕:

    https://developers.google.com/identity/protocols/OpenIDConnect#re-consent

    这样做将确保每次都返回一个刷新令牌。请记住,给定的用户-应用程序对一次只能有 50 个处于活动状态的刷新令牌,之后旧令牌将失效:

    https://developers.google.com/identity/protocols/OAuth2#expiration

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 2013-05-02
      • 2018-02-20
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多