【问题标题】:Using Google Oauth2 webflow from iOS + Bonjour (Yikes!)使用来自 iOS + Bonjour 的 Google Oauth2 webflow(太棒了!)
【发布时间】:2013-02-28 20:57:53
【问题描述】:

我正在构建一个 iOS 应用程序,该应用程序要求用户使用服务器端 Web 流通过 Oauth2 授权 Google API。我目前打开一个 UIWebView 来启动 oauth2 流程。

这在模拟器中运行良好,因为我将重定向 URI 设置为 http://localhost 并且在我的本地计算机上运行了一个服务器。

但是,我想在设备上进行测试,同时仍连接到在我的桌面上运行的服务器。为此,我让应用程序发现我的桌面地址(本地子网 IP 或 bonjour 地址,如http://foo.local.)以连接到服务器。但是,Google Oauth2 流程说它不能使用本地 URI 作为重定向 url。

有没有办法解决这个问题?如果可能的话,我不想弄乱我的本地网络设置或来自我的 IOS 设备的代理请求。理想情况下,我还希望能够使用 bonjour 服务来发现服务器,因为我们有一个开发团队,而且我们的应用程序允许您选择要连接到本地网络上的哪个服务器。

选项?

【问题讨论】:

    标签: ios oauth-2.0 bonjour google-oauth


    【解决方案1】:

    2013 年 3 月 19 日更新

    如果服务器是必须的中间人,那么我认为最简单的方法是获取域名并将服务器公开。 www.godaddy.com 或任何域名提供商将以每年 15 美元左右的价格获得一个域名(如果有折扣会更低)。

    然后搜索如何获取动态 DNS 并将 redirect_uri 设置为已选择的域名。

    否则,如果仅出于 oauth 目的,我看不到服务器在此处扮演的角色。作为下面列出的第二种方法,即使在严密防御的防火墙后面,设备也可以直接与谷歌服务器通信。 (令牌将通过抛出标题栏)。

    所以这里可能需要澄清一下。

    本地主机服务器是否会充当集线器,从谷歌驱动器兑现文件,然后重新分发到 iOS 设备?或者想在这里实现什么样的网络架构?

    ==

    2013 年 3 月 18 日更新

    根据官方文档 https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi

    oauth 有两种方式。使用 localhost 作为重定向只是一种方法。

    另一个是使用这个字符串

    urn:ietf:wg:oauth:2.0:oob
    

    替换具有本地主机的请求。

    例如上一个请求的 localhost 为(注意:区别在以'redirect_uri='开头的中间行)

        https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&
    redirect_uri=http://localhost:9004&
    response_type=code&client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com
    

    现在可以改成

        https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&
    redirect_uri=urn:ietf:wg:oauth:2.0:oob&
    response_type=code&client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com
    

    所以在模拟器中访问前一个的url应该相当于在真机中访问后一个。

    光环

    【讨论】:

    • 不幸的是,Google 不允许您在 api 控制台中输入非公共 URL 作为重定向 URI
    • 编辑了我的答案,试试这个:D
    • 仍然不确定这是否有效 - 您将什么 url 设置为 redirect_uri?
    • agh.... 似乎我从不同的方向理解了这个问题。只需针对您的问题发布另一个答案。希望这个有帮助:D
    • 我仍然需要重定向到服务器。当我使用 urn:ietf:wg:oauth:2.0:oob 作为redirect_uri 时,它如何知道我要重定向到的服务器地址的url?
    【解决方案2】:

    你能试试这个方法吗?将以下内容添加到 Mac OSX 中的 /etc/hosts 文件中 -

    192.168.33.100   trialapp  trialapp.com #put your local IP address instead of 192.168.33.100
    

    转到 Google API console 为您的新客户端 ID 设置并将重定​​向 URL 更改为 http://trialapp.com/

    • “应用程序类型:Web 应用程序”。
    • 通过“您的站点或主机名(更多选项)”:

    我们所做的是将您的本地子网 IP 地址映射到别名域名。所以谷歌应该不再认为这是一个本地地址。看看这是否有效?

    【讨论】:

    • 我在手机上使用什么作为重定向 URI?
    • 在你使用http://trialapp.com/的手机中,因为这个url应该被路由到你的本地子网地址
    • 如何将 trialapp 路由到我的 mac?我的手机只会正常解析trialapp.com,它不使用我的macs主机文件...
    【解决方案3】:

    我最终通过以下方法解决了这个问题。

    在我的 UIWebView 中,我拦截了所有加载请求并修改了 URL。基本上,我将 redirect_uri 设置为公共的(也在 api 控制台上注册),但是当 UIWebView 尝试加载该重定向 URI(在多次重定向之后)时,我重写该 URL 以指向我的 mac 上的回调本地网络。

    显然,在服务器端解析令牌时需要考虑到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      相关资源
      最近更新 更多