使用来自iOS + Bonjour的Google Oauth2网络流(Yikes!)

时间:2013-03-13 03:34:59

标签: ios oauth-2.0 bonjour google-oauth

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

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

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

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

选项?

3 个答案:

答案 0 :(得分:2)

更新于19/03/2013

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

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

否则我没有看到服务器的角色在这里播放,只是为了oauth目的。作为下面列出的第二种方法,即使在严重防御的防火墙后面,设备也可以直接与谷歌服务器通信。 (将传递令牌抛出标题栏)。

所以可能需要一些肯定。

localhost服务器是否像集线器一样从Google驱动器兑现文件,然后重新分发到iOS设备?或者在这里想要实现什么样的网络架构?

==

更新于18/03/2013

根据官方文件 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应该相当于在真实设备中访问后者。

答案 1 :(得分:0)

你能试试这种方法吗?将以下内容添加到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并将重定向网址更改为http://trialapp.com/

  • "应用程序类型:Web应用程序"。
  • Via"您的网站或主机名(更多选项)":

我们正在做的是将您的本地子网IP地址映射到别名域名。因此Google不应再认为这是本地地址。看看这是否有效?

答案 2 :(得分:0)

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

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

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