谷歌OAuth子域名

15

我已在网站(example.com)上实现了Google oAuth。除了来自我的站点子域名(我有成千上万个子域名)的授权之外,一切都正常运作。当用户尝试通过子域名进行授权时,例如

fr.example.com
product1.example.com
product2.de.example.com

我从谷歌那里接收到一个错误信息 -

The redirect URI in the request did not match a registered redirect URI

如何解决这个问题?

5个回答

14
其他回答已经澄清了问题的原因是Google的OpenAuth不支持通配符子域名。但是,您所问的是如何解决它?好吧,根据这个电子邮件线程,您有两个选择:
  1. 为所有子域提供单个OAuth2处理端点。也就是说,您将拥有一个主域和端点,通过该端点您可以对所有子域进行身份验证。当身份验证完成后,您会重定向回子域。据说有一个OpenAuth状态参数,您可以在其中编码子域名。这就是我所做的,在这里是代码:https://github.com/debiki/debiki-server/blob/master/app/controllers/LoginWithOpenAuthController.scala

  2. 您可以使每个子域独立注册到Google。

选择哪种选项取决于要求用户批准哪个品牌。主域还是子域?

1
你可以让每个子域名独立地向Google注册。如何做到? - Jon Abrams
就我所知,在Google开发者工具中配置OpenAuth时,您还需要指定服务器上的OpenAuth端点。然后,列出您想要使用的子域,例如:https://sub.domain.com/authenticate/googlehttps://sub2.domain.com/authenticate/google等等。如果您需要自动执行此操作,则可能会很复杂。我不知道谷歌是否有任何API可以自动添加OpenAuth端点。 - KajMagnus
2
我并没有这样做。相反,当用户在*.domain.com上时,例如sub5.domain.com,我会将他/她重定向到login.domain.com并通过该域名登录。因此,我在Google OpenAuth中列出的唯一端点是https://login.domain.com/authenticate/google。当有人登录时,Google总是会询问他/她是否信任那个域名,而不是sub5。通过cookie和服务器端缓存以及重定向,我确保用户在sub5上登录。 - KajMagnus
如果您需要子域或API支持,请在问题跟踪器中添加+1 https://issuetracker.google.com/issues/35898945 - squirtgun

12

这是因为Google的OAuth不支持通配符子域名匹配。您可以在此处查阅更多文档。


链接的页面没有提到子域名;您还记得在哪里看到Google的OAuth不支持子域名吗? - KajMagnus
2
@KajMagnus,它确实支持子域名,但不支持通配符子域名匹配。基本上,redirect_uri必须与开发者控制台中注册的值之一完全匹配。因此,您可以为您的子域名添加一堆redirect_uri,然后它应该可以工作。 - anfab
谢谢。 (通配符子域名是我想到的。) - KajMagnus
3
你知道通过Google API是否可以添加重定向URI,还是必须通过网页界面进行操作? - Michiel de Mare
我也遇到了子域名中下划线和连字符的问题。虽然它们在技术上是有效的,但 Google OAuth 系统似乎不允许它们出现在授权重定向 URI 中。我在文档中没有找到任何关于此的信息。 - richplane

2

重定向URI必须与Google Developers控制台中此项目列出的值完全匹配(包括http或https方案、大小写和尾随'/')。因此,如果您在开发人员控制台中未添加子域,则不支持子域。


1
供您参考:https://developers.google.com/accounts/docs/OAuth2WebServer#formingtheurl - Owen Cao

0
那是因为Google的OAuth不支持通配符子域名匹配。你可以重定向所有子域名的一个静态页面,在进行身份验证或获取OAuth的访问令牌后,然后返回您的子域名页面附带访问令牌。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接