我有一个多租户应用,我需要与Google API端点集成,比如说日历API。
应用程序的组织方式与Slack非常相似。您可以创建命名空间并邀请用户访问它。子域用于分隔名称空间,因此可能有:foo.domain.com
,bar.domain.com
和baz.domain.com
。
一个用户,可以属于多个名称空间,就像你可以属于不同团队的松弛一样。因此John
可以是foo
和bar
的成员。
问题是,当John
决定要foo
访问其日历信息时,Google会将授权链接到domain.com
而不是foo.domain.com
。当我尝试将他的日历访问bar
时,也没有刷新令牌,因为技术上John
已经授权访问...但我希望这些可以独立处理。以便John
能够撤消对foo.domain.com
的访问权限,但仍然可以bar.domain.com
访问其日历数据。
有没有办法为同一个应用创建同一个用户的独立授权?我无法在子域之间共享refresh_token
,因为它们可能在物理上是分开的,并且我无法为每个子域创建不同的应用,因为它们是动态生成的。
答案 0 :(得分:0)
身份验证的工作方式是它基于您在Google开发者控制台中创建的客户端。
如果John授予您的客户访问其日历数据的权限,则该客户端将可以访问其日历数据。 Google无法知道您的foo或bar子域名是否已被授予访问权限。
多个客户选项
您应该为每个不同的子域创建不同的客户端凭据。这可能是最合乎逻辑的做法。
单客户端选项
除此之外,你可以将信息存储在你的数据库的某个地方John已经授予foo的访问权限但不禁止并存储foo的刷新令牌而不是bar,如果他想为foo删除它,那么他可以这样做。您不必担心更新刷新令牌,因为用户在技术上可以拥有与单个客户端关联的最多50个刷新令牌。
如果用户撤销其撤销对所有内容的访问权限而不仅仅是一个应用程序,只需撤消即可。
答案 1 :(得分:0)
如果用户明确点击了“授权”按钮,Google的OAuth实现只会在响应中返回刷新令牌。这种情况总是在第一次提示用户进行授权时发生,但默认情况下,当相同的应用程序再次要求对相同的范围进行授权时,将跳过同意屏幕。
您可以覆盖此行为,并通过在授权网址中添加参数prompt=consent
强制用户再次查看同意屏幕:
https://developers.google.com/identity/protocols/OpenIDConnect#re-consent
这样做可确保每次都返回刷新令牌。请记住,给定的用户 - 应用程序对一次只能激活50个刷新令牌,之后旧的令牌将失效:
https://developers.google.com/identity/protocols/OAuth2#expiration