【问题标题】:Using OAuth for both development and production environments在开发和生产环境中使用 OAuth
【发布时间】:2014-11-20 07:21:47
【问题描述】:

我已经看到关于 SO 的其他问题(hereherehere),但我对任何解决方案都不满意,所以我再问一次。我正在启动一个 Web 应用程序,它将利用来自多个提供商(Google、Facebook、Twitter、Yahoo)的 OAuth 进行身份验证。我正在努力寻找适用于本地开发环境和生产环境的配置。

我发现的主要解决方案是在每个提供者中注册多个应用,为每个提供者接收不同的消费者密钥和秘密:

“我的应用程序生产” - 带有到 http://www.myapp.com/callback 的回调 URI

“我的应用程序开发” - 带有到 http://local.myapp.com/callback 的回调 URI

在您的本地主机文件中添加一个条目,将local.myapp.com 指向127.0.0.1,并为您的应用程序进行一些配置,以根据环境使用正确的消费者密钥,您就可以开始了,对吧?

但我的应用程序是 responsive,我需要从多个其他设备(例如我的 iPhone 和 iPad)测试在我的 PC 上运行的开发环境,这两个设备都无法解析开发回调 URI。

假设我的网络上已经有一个 DNS 服务器,并且可以在那里添加 local.myapp.com 的条目而不是我的本地主机文件,现在可以从网络上的任何设备访问我的开发实例。

但我的开发团队都在同一个本地网络上运行。现在local.myapp.com 指向每个人的同一个IP。让我们回到在每个开发人员的计算机上设置主机文件,以便他们都可以在他们的工作站内独立工作。现在没有人可以再次从他们的 iPhone 测试他们的开发实例了。对于每个开发人员来说,向提供者注册应用程序以便他们可以指定唯一的回调 URI 似乎几乎不是正确的答案。

通常,当我为一个看似简单的问题提供复杂的解决方案时,通常意味着我在做一些根本错误的事情。我是否遗漏了有关 OAuth 的某些内容,它不打算像这样使用吗?我很想完全放弃 OAuth,只使用 OpenID(无需注册应用程序,并且可以从应用程序内指定回调 URI),但随后我失去了 Facebook 和 Twitter 中的两个大热门。我真的不需要任何用户的数据,如果它可用,那就太好了。有人可以说服我重新使用 OAuth 吗?

【问题讨论】:

  • 只是为了测试对吧?为什么不将每个 Web 应用程序都作为虚拟目录?
  • 我并没有真正理解你的意思。你能详细说明一下吗?
  • 您找到解决方案了吗?我正在为完全相同的事情而苦苦挣扎; oauth 提供商不允许在源中使用通配符,所以我不能拥有 alice.dev.myapp.combob.dev.myapp.com 但如果所有开发人员共享 dev.myapp.com 我不知道如何将平板电脑和手机指向正确的开发人员。为每个开发人员创建一个 oauth 入口点似乎是唯一的方法。
  • 我在下面添加了我的手动解决方案。但我很想知道您是否找到了更好的方法。

标签: oauth twitter-oauth google-oauth facebook-oauth


【解决方案1】:

我发布了以下关于我编写的 Rails 应用程序的答案:

OAuth2 in development and production

这是一个名为 figaro 的 gem,它为谷歌 OAuth2 的每个环境配置做了。

【讨论】:

  • 这看起来像是一个用于管理属性文件的精美工具。当 OAuth 回调转到 local.myapp.com 时,如何通过 iPhone 测试在我的 PC 上运行的应用程序?
【解决方案2】:

我不能代表 FB 或 Twitter,但在 Google 的 Oauth 实现中,您可以注册多个 oauth 回调 URL。因此,您只需要在您的应用程序中设置一些逻辑来感知它处于测试模式,然后使用适当的回调 URL 启动 Oauth 流程。有一些缺点,例如实时和测试刷新令牌之间的冲突,但它们是可控的。

在我的应用程序中,我有一个单例来管理所有这些。当我的应用需要启动 Oauth 流程时,它会使用请求 URL 和任何其他显着数据(例如调试标志)调用单例,并且单例返回正确的回调 URL、客户端 ID 等。

【讨论】:

  • 当然,我可以处理逻辑以了解它是生产还是开发,并使用正确的消费者密钥/秘密。但是,在我的 iPhone 中使用我的 iPhone 无法解析的回调 uri 在 dev 中进行测试呢?我需要在开发中的移动设备上进行测试。
  • 所以这是一个 DNS 问题?使用 AWS Route 55 之类的东西并在那里注册您的开发服务器,以便公开解析。可以将 iPhone 配置为使用代理服务器吗?如果是这样,也许您还可以使用一些代理路由规则来解决您的问题。如果有帮助,我会很乐意在我管理的一个域上设置一个开发服务器作为子域。
【解决方案3】:

我还没有找到一种让开发人员能够访问所有相关设备的手动方法:

  1. 通过本地网络的 DHCP 系统根据他们的 MAC 地址为每个开发者的机器分配一个固定 IP,或者(不太推荐)让他们选择一个 IP 并希望得到最好的结果
  2. (可选*)根据该 IP 在本地网络中为每个开发人员的计算机分配一个 DNS 主机名
  3. 使用开发者机器的主机名在每个提供者上为开发者注册一个 oauth 条目。
  4. 每个开发人员都将他们的应用程序配置为使用他们唯一的 oauth 开发令牌。

假设网络中的所有设备都依赖于相同的 DHCP 和 DNS 服务器,那么您就可以从网络上的任何设备访问 alice.dev.myapp.combob.dev.myapp.com

请注意,您将分别管理每个其他环境的 oauth 配置,但采用相同的方法。

可能有一些工具可以自动注册开发人员的机器 IP 和主机名,以缓解这部分难题。在每个开发者的每个提供者上注册 oauth 配置是最繁琐的步骤。

更新

*如果您使用 xip.io url 例如,您可以跳过 DNS 部分。 10.0.0.123.xip.io 如果您知道 Alice 是 10.0.0.123,但您仍然希望修复该 IP,因为您不想在第 4 步中不断更新 oauth 令牌的 url。

【讨论】:

    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2020-09-09
    • 2013-09-14
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多