如何使用远程Web应用程序对iOS / iPhone用户进行身份validation,并在将来对同一个Web应用程序的请求中重新使用身份validation票证?

我正在构build一个iOS应用程序,我需要能够对Rails 3应用程序的各种数据位进行身份validation请求。 Rails 3应用程序正在使用omniauth和像https://myapp.com/auth/facebook这样的URL,例如,通过Facebook对用户进行身份validation,一旦通过身份validation,就将身份validation存储在名为“auth”的安全cookie中。

我想知道的是如何从iOS / iPhone应用程序authentication我的用户,坚持authentication令牌并将其与未来的请求一起发送到Rails应用程序?


使用ASIHTTPRequest我正在考虑做这样的事情:

  1. 打开一个UIWebview,从我的 Web应用程序中加载一个特定于他们想要authentication的提供者的URL(例如myapp.com/auth/facebook for facebook或myapp.com/auth/yahoo for yahoo等)。

  2. 成功时,以某种方式parsing出来并将authenticationcookie存储在iOS应用程序中, 而不显示通过网站进行authentication时通常会看到的网页…而是closuresUIWebView并导航回iOS应用程序中的另一个UIVewController。

  3. 以某种方式将持久的身份validation令牌与将来的Web请求包含到Rails应用程序中。

  4. 我还希望允许用户允许iOS应用程序在本地存储这些信息,因此如果他们也select,则不必重新login到远程应用程序。


这种方法是否合适? 有没有更好的办法? 当然,如何实际执行上述?

谢谢 – wg

使用OAuth非常简单(很简单,不是这个词…),但是我制作了一个iOS应用程序和一个使用OAUth作为身份模式的java服务器,并且在整个循环之后,我终于获得了标识这个用户的标记和(因为只能使用签名的请求访问)可以安全地存储在手机(我只使用standardUserDefaults来存储它)。 只有你的应用程序(使用秘密)可以签署请求。

我不知道这是否适合你…

啊! 在通过networking识别之后,浏览器redirect一个特殊的URL(为我的应用程序注册),URL打开我的应用程序,在其参数中包含该标记,所以很容易在handleOpenURL的标识阶段之后检索标记。

  1. 一旦UIWebview已经与所述服务进行了authentication,就可以加载另一个URL(例如:通过authentication后服务返回的页面上的一个javascript)。

  2. 使用实现以下协议方法的UIWebViewDelegate对象捕获此请求:

     - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
  3. 从这里你有NSURLRequest对象。 你可以将请求的头文件提取到NSDictionary ,它将包含身份validationcookie的细节,令牌等,使用NSURLRequest的以下方法

     - (NSDictionary *)allHTTPHeaderFields 

对于我的应用程序,这是我正在做的。

我的应用程序正在使用devise与omniauthlogin和用户的东西。 devise自己可以生成一个唯一的标记,标记为token_authenticatable。 所以在我的login请求中,如果login成功,我回复一个JSON表示我的用户和我的用户令牌。 我将所有这些保存在手机内存中。

然后在每个请求中添加param auth_token = MY_USER_TOKEN。

这就是它。

我只是在Facebook身份validation问题,因为我使用Ios的Facebook SDK,所以我转发FB令牌到我的应用程序,validation它,然后只是返回所有以下请求相同的deviseauth_token。

好吧,我们走了,我不知道你的Web服务和所有的确切设置,但你可以做的是存储身份validation令牌的设备上使用SQLite或核心数据,我目前正在开发一个需要身份validation的应用程序,我所做的是将用户名和密码本地存储在设备上的SQLite数据库使用核心数据与数据库交互,然后每当我做一个API调用我使用存储的用户名和密码在服务器端使用获取authentication,但是我相信这是使用后期保存,只要networking服务器有很高的安全性,我不相信有任何安全隐患。 在我所了解的内容中,我将首次启动时对用户进行身份validation,并让用户能够在稍后阶段更改login凭据,但在身份validation后,我会将身份validation令牌发送回设备,并将其存储在数据库中,然后每当我需要使用Web服务进行身份validation时,我会发送带有POST请求的身份validation令牌给服务器。 这有道理吗?