【问题标题】:Google oauth subdomainsGoogle oauth 子域
【发布时间】:2014-08-12 02:25:32
【问题描述】:

我已在网站 (example.com) 上实施了 Google oAuth。一切正常,除了来自我网站上子域的身份验证(我有数千个子域)。当用户尝试通过子域进行授权时,例如

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

我收到来自 Google 的错误 -

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

如何解决?

【问题讨论】:

    标签: oauth oauth-2.0 google-oauth


    【解决方案1】:

    这是因为 Google 的 OAuth 不支持通配符子域匹配。更多文档可以参考here

    【讨论】:

    • 链接页面未提及子域;您还记得您在哪里读到 Google 的 OAuth 不支持子域吗?
    • @KajMagnus 它确实支持子域,只是不支持通配符子域匹配。本质上,redirect_uri 必须与开发人员控制台中注册的值之一完全匹配。所以你可以为你的子域添加一堆redirect_uri,它应该可以工作。
    • 谢谢。 (通配符子域是我想到的。)
    • @anfab 你知道是否可以通过google api添加redirect_uris,还是必须通过网络界面?
    • 我也遇到过子域中的下划线和连字符问题。尽管它们在技术上是有效的,但 Google OAuth 系统似乎不允许它们在授权的重定向 URI 中使用。我在这方面的文档中没有找到任何内容。
    【解决方案2】:

    重定向 URI 必须与 Google Developers Console 中为此项目列出的值之一完全匹配(包括 http 或 https 方案、大小写和结尾的“/”)。因此,如果您不在开发者控制台中添加子域,它将不支持。

    【讨论】:

    【解决方案3】:

    其他答案已经澄清了问题的原因是Google的OpenAuth不支持通配符子域。但是,您要问的是如何解决?好吧,你有两个选择,根据this email thread

    1. 为所有子域提供单个 OAuth2 处理端点。也就是说,您将拥有一个主域和端点,您还可以通过它们对子域进行身份验证。完成身份验证后,您将重定向回子域。据说有一个 OpenAuth state 参数,您可以在其中对子域名进行编码。这就是我所做的,这是代码:https://github.com/debiki/debiki-server/blob/master/app/controllers/LoginWithOpenAuthController.scala

    2. 您可以让每个子域独立地向 Google 注册。

    您将选择哪个选项取决于要求 Google 用户批准的品牌。主域,还是子域?

    【讨论】:

    • “您可以让每个子域独立地向 Google 注册”如何?
    • 据我记得,当您在 Google Developer Tools 中配置 OpenAuth 时,您还会在服务器上指定一个 OpenAuth 端点。然后,列出您要使用的子域,例如:https://sub.domain.com/authenticate/googlehttps://sub2.domain.com/authenticate/google 等。如果您需要自动执行此操作,这可能会很复杂。我不知道 Google 是否有任何 API 可以自动添加 OpenAuth 端点。
    • 我没有这样做。相反,当用户使用*.domain.com 时,例如sub5.domain.com,我将他/她重定向到login.domain.com 并通过该域登录。所以我在 Google OpenAuth 中列出的唯一端点是 https://login.domain.com/authenticate/google。当有人登录时,Google 总是询问他/她是否想信任 那个 域,而不是 sub5。通过 cookie 和服务器端缓存和重定向,我确保用户在 sub5 登录。
    【解决方案4】:

    那是因为谷歌的 OAuth 不支持通配符子域匹配。您可以重定向所有子域的一个静态页面,并在验证或获取 OAuth 的访问令牌后,然后您返回带有访问令牌的子域页面。

    【讨论】:

      【解决方案5】:

      在授权的 JavaScript 来源字段中,输入您的应用的来源。您可以输入多个来源以允许您的应用在不同的协议、域或子域上运行。您不能使用通配符。在下面的示例中,第二个 URL 可以是生产 URL。

      http://localhost:8080 或 https://myproductionurl.example.com

      https://developers.google.com/identity/sign-in/web/server-side-flow

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-15
        • 1970-01-01
        • 2013-08-28
        • 2015-06-10
        • 2018-06-11
        • 1970-01-01
        • 2015-01-15
        相关资源
        最近更新 更多