我们使用带有Micro服务的G Suite API进行文档编辑,并且我们拥有不同的数据中心和不同的数据库。现在,一旦用户来到我的应用程序并尝试第一次打开文档,然后Google给出同意屏幕,我便可以基于该屏幕获取刷新令牌和访问令牌并将其存储到一个数据中心。
但是问题是,如果用户来自另一个实例,该实例使用具有不同数据库的不同数据中心,并且用户尝试使用旧凭据打开文档,那么Google不会给出任何同意屏幕,因此我无法获得用户的刷新令牌。
1)那么,有什么方法可以在不使用同意屏幕的情况下获取刷新令牌?
2)有什么方法可以识别用户是否来自不同的子域,那么我需要为此提供同意屏幕?
答案 0 :(得分:0)
即使用户已经授权了您的应用,也可以使用prompt=consent
选项来强制重新提示进行身份验证。
请参见https://developers.google.com/identity/protocols/OAuth2WebServer#creatingclient
答案 1 :(得分:0)
您可以使用hd参数[1]来识别用户的域,并且在域管理员通过从GSuite Marketplace [2]安装应用程序配置了域范围的委派后,无需同意屏幕即可请求刷新令牌。
[1] https://developers.google.com/identity/protocols/OpenIDConnect#hd-param
答案 2 :(得分:0)
当您请求OAuth流(access_type = offline`)时,刷新令牌将返回到您的应用程序。这仅发生一次(获取刷新令牌)。您的应用程序应保存“刷新令牌”以备将来使用。
在您的用例中,您的系统之一完成了身份验证,并且用户已移至其他系统。您将需要使用prompt=consent, access_type=offline
重新进行身份验证。如果不重新进行身份验证,您将不会获得另一个刷新令牌。
去年11月,我在这个问题上花了很多时间。这是link,其中包含有关此问题的许多详细信息。
答案 3 :(得分:0)
任何应用程序只能为用户提供一个有效的刷新令牌。您可以使用@ {John}在请求中使用prompt=true&access_type=offline
来请求新的刷新令牌。但是,每次上一个都会失效。
根据您对其他答案的评论,我假设创建一个新的微服务以将令牌返回给正在使用的微服务是不可能的(这是我的建议)
您问“确定用户是否来自不同的子域” ...
如果这些应用程序适用于gmail.com帐户的最终用户,则可以将它们视为不同的应用程序,并在开发人员控制台上配置不同的项目。
启用新的API时会有些痛苦,我建议使用复制到所有所需应用程序的脚本进行操作。
如果最终用户来自使用GSuite的公司,则可以将应用程序安装为域范围的应用程序(手动安装或从GSuite Marketplace安装)。在这种情况下,您可以仅使用客户端身份验证来获取id_token,将令牌发送到服务器,并使用服务帐户来模拟任何给定服务中的用户,而不必担心来自他们的任何令牌。