使用Rails应用程序验证iPhone应用程序

使用Rails应用程序验证iPhone应用程序,iphone,ios,ruby-on-rails,devise,restkit,Iphone,Ios,Ruby On Rails,Devise,Restkit,我已经在这方面做了很长时间的研究,但还不能解决我的问题,所以我想我会问。我在这里搜索了stackoverflow和其他文章中的其他问题,但它们似乎没有让我找到正确的方向 这就是我要做的。我有一个Rails3应用程序,它只提供JSON格式的数据。数据将只由1名用户输入,因此访问权限将非常有限。我正在使用Desive,以便通过身份验证对其进行保护 我还有一个iPhone应用程序可以访问这些数据。由于Rails 3应用程序具有用户名/密码保护,因此iPhone应用程序需要一种通过应用程序进行身份验证的

我已经在这方面做了很长时间的研究,但还不能解决我的问题,所以我想我会问。我在这里搜索了stackoverflow和其他文章中的其他问题,但它们似乎没有让我找到正确的方向

这就是我要做的。我有一个Rails3应用程序,它只提供JSON格式的数据。数据将只由1名用户输入,因此访问权限将非常有限。我正在使用Desive,以便通过身份验证对其进行保护

我还有一个iPhone应用程序可以访问这些数据。由于Rails 3应用程序具有用户名/密码保护,因此iPhone应用程序需要一种通过应用程序进行身份验证的方法

我在Desive中查看了令牌身份验证,但似乎无法使其正常工作。我有一个加载符号,它只是旋转,不返回任何数据。我还研究了http基本身份验证。再说一次,我一点运气都没有。在iPhone端,我使用的是AsitpRequest。以下是我通过真实性令牌发布的内容:

//the url variable below is defined in my code but I did not paste that part
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"auth token" forKey:@"authenticity_token"];
[request addRequestHeader:@"Content-Type" value:@"application/json"];
[request setDelegate:self];
[request startAsynchronous];
当我尝试http基本身份验证时,我传递了一个用户名和密码,但在同样的问题下,这不起作用,并且没有返回数据。我确信我遗漏了一些东西,但我找不到使这项工作正常进行所需的信息。我看了一下RestKit,但它似乎比我需要的要多得多


我只需要iPhone应用程序访问JSON数据,它在Rails 3端受到保护。iPhone用户无需通过登录表单登录,也无需创建、更新或删除任何数据。它是严格只读的。有人能把我推向正确的方向吗?

最简单的方法是使用基本身份验证

在rails端的api/应用程序控制器中添加

 before_filter :check_auth


  def check_auth
    authenticate_or_request_with_http_basic do |username,password|
      resource = User.find_by_email(username)
      if resource.valid_password?(password)
        sign_in :user, resource
      end
    end
  end
在iOS端,您应该在请求对象上设置授权标头:

ASIHTT支持这种开箱即用的方式。祝你好运

[request setUsername:@"username"];
[request setPassword:@"password"];
或者您可以将它们添加到请求的URI中

NSURL *url = [NSURL URLWithString:@"http://username:password@allseeing-i.com/top_secret/"];
这将允许使用基本身份验证登录,其他控制器将从会话中获取您的用户

然后在ios端,您可以像使用任何基本身份验证系统一样传递凭据


我建议在生产中使用SSL/HTTPS,否则凭据将以纯文本或base64形式传递。

您是否在rails端使用Deviate?是的,我在rails端使用Deviate。如果API是严格只读的(对于show、index等方法),为什么需要身份验证?您可以在控制器中指定仅对破坏性方法(如创建/更新/销毁)进行身份验证。如果您需要从移动客户端进行身份验证,我可以引导您使用一种简单的令牌身份验证来设计优惠。哈桑,谢谢。我忘了在控制器中指定仅对破坏性方法进行身份验证。我想通过身份验证从移动客户端读取数据的原因是为了限制对我的iphone应用程序的访问。它只是列出了一些事件,所以这不是任何人真正想要的。如果你有一个简单的令牌认证指南,可以设计提供的服务,以及iphone应用程序如何使用它,那就很好了。正如您从上面的代码中看到的,我之前已经尝试过这个。我在Desive中设置了token_authenticatable,正在传递一个真实性token。谢谢,我将尝试此功能,并让您知道它是如何运行的。我尝试了此功能,不幸的是它无法正常工作。第一个问题是当我在ios应用程序中设置post值(用户名和密码)时。执行此操作时,它会尝试创建一个事件,而不是发送身份验证参数、进行身份验证然后读取事件。这更有可能是因为我正在ios应用程序中设置postValue:[请求setPostValue:@“email”forKey:@“username”]。我确实看到iphone应用程序正在传递参数。最后,我得到了一个401状态码unauthorized,所以它是no-u-don-use-post-value,您需要将它设置为身份验证头。见: