12

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

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

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

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

选项?

4

3 回答 3

2

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应该相当于在真实设备中访问后一个。

光环

于 2013-03-16T12:31:32.627 回答
0

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

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

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

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

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

于 2013-03-18T12:23:17.557 回答
0

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

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

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

于 2013-03-19T14:20:45.640 回答