Google OAuth2 API按子域分离令牌

Google OAuth2 API按子域分离令牌,oauth,google-oauth,Oauth,Google Oauth,我有一个多租户应用程序,我需要与Google API端点集成,比如日历API 应用程序的组织方式很像Slack。您可以创建名称空间并邀请用户使用它。子域用于分隔名称空间,因此可以有:foo.domain.com、bar.domain.com、和baz.domain.com 一个用户可以属于多个名称空间,就像在slack中可以属于不同的团队一样。因此,John可以是foo和bar的成员 问题是,当John决定让foo访问他的日历信息时,谷歌将授权链接到domain.com,而不是foo.domai

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

应用程序的组织方式很像Slack。您可以创建名称空间并邀请用户使用它。子域用于分隔名称空间,因此可以有:
foo.domain.com
bar.domain.com
、和
baz.domain.com

一个用户可以属于多个名称空间,就像在slack中可以属于不同的团队一样。因此,
John
可以是
foo
bar
的成员

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


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

身份验证的工作方式是基于您在Google developer console中创建的客户端

如果John授予您的客户端访问其日历数据的权限,则该客户端将有权访问其日历数据。谷歌无法知道是你的foo或bar子域被授予了访问权

多客户端选项

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

单客户端选项

除此之外,您还可以将信息存储在数据库中的某个地方,John已授予对foo而非bar的访问权限,并为foo而非bar存储刷新令牌,如果他想为foo删除该令牌,则他可以这样做。您不必担心更新刷新令牌,因为从技术上讲,一个用户最多可以拥有50个与单个客户端关联的刷新令牌


如果用户执行revoke操作,只需使用revoke进行观察,它将撤销对所有内容的访问,而不仅仅是对单个应用程序的访问。

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

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

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


感谢您的快速回答,DaImTo。。。不幸的是,我认为这两种方法都行不通。。。我无法共享信息(单客户端选项),因为不同的子域可能在物理上是分离的,无法在它们之间进行通信,我也无法执行多客户端选项,因为子域是在注册过程中动态创建的,似乎我无法通过编程生成这些子域:(这是您唯一的选择。Oauth通常是这样工作的。用户向客户机进行身份验证。我仍然认为,如果您在数据库中正确设置了单客户机选项,它就可以工作。