【问题标题】:Need refresh token without using consent screen in G Suite需要刷新令牌而不使用 G Suite 中的同意屏幕
【发布时间】:2019-05-29 22:30:34
【问题描述】:

我们使用 G Suite API 和我们的 Micro 服务进行文档编辑,我们有不同的数据中心和不同的数据库。现在一旦用户来到我的应用程序并尝试第一次打开文档,然后谷歌给出同意屏幕,我可以获得刷新令牌和访问令牌,并存储到一个数据中心。

但问题是,如果用户来自另一个实例,该实例使用具有不同数据库的不同数据中心,并且用户尝试使用旧凭据打开文档,那么谷歌不会给出任何同意屏幕,所以我没有获得用户的刷新令牌。

1) 那么有没有办法在不使用同意屏幕的情况下获取刷新令牌?

2) 有什么方法可以识别用户是否来自不同的子域,那么我需要为此提供同意屏幕吗?

【问题讨论】:

    标签: google-drive-api google-oauth google-docs-api google-workspace


    【解决方案1】:

    即使用户已经授权您的应用,也可以使用prompt=consent 选项强制重新提示进行身份验证。

    https://developers.google.com/identity/protocols/OAuth2WebServer#creatingclient

    【讨论】:

    • 感谢您的快速回复,但这个用例的问题是,如果我使用此选项,那么每次都会提示用户同意。
    • 所以你改变你的代码,所以它只在第一次使用时使用'prompt=consent'。后续使用默认为 'prompt=none'
    【解决方案2】:

    您可以使用 hd 参数 [1] 识别用户的域,并且在域管理员通过从 GSuite 市场 [2] 安装您的应用程序配置域范围委派后,您可以在没有同意屏幕的情况下请求刷新令牌。

    [1]https://developers.google.com/identity/protocols/OpenIDConnect#hd-param

    [2]https://support.google.com/a/answer/172482?hl=en

    【讨论】:

      【解决方案3】:

      当您请求 OAuth 流 (access_type=offline`) 时,会向您的应用程序返回一个刷新令牌。这只会发生一次(获得刷新令牌)。您的应用程序应保存刷新令牌以备将来需要。

      在您的用例中,您的一个系统完成了身份验证,并且用户已移至另一个系统。您需要使用prompt=consent, access_type=offline 重新进行身份验证。如果不重新认证,您将不会获得另一个 Refresh Token。

      去年 11 月,我在这个问题上花了很多时间。这是一个link,其中有很多关于这个问题的细节。

      【讨论】:

      • 感谢您的快速响应,但此用例的问题是用户再次移动到第一个系统,然后从该系统用户获取由于另一个系统中新生成的刷新令牌而已过期的刷新令牌.那么,有没有办法覆盖它?
      • 在这种情况下,您需要保存刷新令牌,然后与您的各种系统共享该令牌。在客户端 ID 令牌中将是用户的身份。使用电子邮件地址作为您在共享系统(memcache 等)中的 ID。保存刷新令牌。然后当用户到达系统时,检查 ID 并获取刷新令牌。还要跟踪访问令牌的 expires_at。
      • 感谢@john Hanley,但我们出于安全考虑,因此不允许将此信息放入缓存中并与其他应用程序共享该缓存。
      • @Ravi - 您只有两个选择:1) 保存刷新令牌 2) 在每个系统上验证用户。您可能不喜欢它,但您必须设计您的系统以支持 OAuth 的要求。由于您无法缓存令牌,因此您唯一的选择是要求在每个系统上进行身份验证。由于这会使刷新令牌无效,因此最好将每个系统设计为自己的 OAuth 客户端 ID(这意味着每个系统都有自己的一组 OAuth 令牌和身份)。
      • 您说“由于新生成的刷新令牌已过期的刷新令牌”。请求第二个刷新令牌不会使现有的刷新令牌无效。目前,Google 允许每个帐户项目大约有 25 个有效的刷新令牌。
      【解决方案4】:

      任何应用程序只能为用户拥有一个有效的刷新令牌。正如@John 所说,您可以在请求中使用prompt=true&access_type=offline 请求新的刷新令牌。但是每次上一个都会失效。

      根据您对其他答案的 cmet,我假设创建一个新的微服务将令牌返回给正在使用的令牌是不可能的(这将是我的建议)

      您要求“确定用户是否来自不同的子域”...
      如果这些应用程序是为 gmail.com 帐户的最终用户提供的,您可以将它们视为不同的应用程序,并在开发者控制台上配置不同的项目。
      启用新 API 时会有点痛苦,我建议从复制到所有需要的应用程序的脚本中执行此操作。

      如果您的最终用户来自使用 GSuite 的公司,您可以将您的应用程序安装为域范围的应用程序(手动安装或从 GSuite Marketplace 安装)。在这种情况下,您可以只使用客户端身份验证来获取 id_token,将令牌发送到服务器并使用服务帐户在任何给定服务中模拟用户,而无需担心来自他们的任何令牌。

      【讨论】:

        猜你喜欢
        • 2019-07-18
        • 2018-08-07
        • 2019-12-29
        • 2018-09-19
        • 1970-01-01
        • 2020-05-20
        • 2019-04-11
        • 2017-01-18
        • 2019-07-14
        相关资源
        最近更新 更多