我正在构建一个iOS应用程序,要求用户使用服务器端Web流通过Oauth2授权Google API。我目前打开一个UIWebView来启动oauth2流程。
这在模拟器中工作正常,因为我将重定向URI设置为http://localhost
并在我的本地计算机上运行服务器。
但是,我还想在连接到桌面上运行的服务器的同时对设备进行测试。为了做到这一点,我已经让应用程序发现我的桌面地址(本地子网IP或bonjour地址,如http://foo.local.
)以连接到服务器。但是,Google Oauth2流程表示它不能将本地URI用作重定向网址。
这有什么办法吗?如果可能的话,我不想乱用我的本地网络设置或IOS设备的代理请求。理想情况下,我也希望能够使用bonjour服务来发现服务器,因为我们有一个开发人员团队,我们的应用程序允许您选择本地网络上您想要连接的服务器。
选项?
答案 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/
我们正在做的是将您的本地子网IP地址映射到别名域名。因此Google不应再认为这是本地地址。看看这是否有效?
答案 2 :(得分:0)
我最终采用以下方法解决了这个问题。
在我的UIWebView中,我拦截了所有加载请求并修改了URL。基本上,我将redirect_uri设置为public(也在api控制台上注册),但是当UIWebView尝试加载该重定向URI(在多次重定向之后)时,我重写该URL而不是指向我的mac上的回调本地网络。
显然,在服务器端解析令牌时需要考虑这一点。