2

我已经对此进行了很长时间的研究,但未能解决我的问题,所以我想我会问。我已经在 stackoverflow 和其他文章上搜索了其他问题,但它们似乎并没有让我朝着正确的方向前进。

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

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

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

//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 用户无需通过登录表单登录,也无需创建、更新或删除任何数据。它是严格只读的。谁能把我推向正确的方向?

4

1 回答 1

0

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

在 Rails 端的 api/application 控制器中添加

 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 端,您应该在请求对象上设置 Authorization 标头:

ASIHTTP 开箱即用地支持这一点。祝你好运。

[request setUsername:@"username"];
[request setPassword:@"password"];

或者您可以将它们添加到您的请求的 URI。

NSURL *url = [NSURL URLWithString:@"http://username:password@allseeing-i.com/top_secret/"];

这将允许使用基本身份验证登录,进一步的控制器将从会话中获取您的用户

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

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

于 2013-08-02T00:16:48.850 回答