【问题标题】:Authenticating iPhone application with Rails application使用 Rails 应用程序验证 iPhone 应用程序
【发布时间】:2013-08-01 02:59:13
【问题描述】:

我已经对此进行了很长时间的研究,但未能解决我的问题,所以我想我会问。我已经在 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 应用程序访问在 Rails 3 端受到保护的 JSON 数据。 iPhone 用户无需通过登录表单登录,也无需创建、更新或删除任何数据。它是严格只读的。谁能把我推向正确的方向?

【问题讨论】:

  • 您是否在 Rails 端使用设计?
  • 是的,我在导轨一侧使用设计。
  • 如果 API 是严格只读的(对于 show、index 等方法),为什么需要身份验证?您可以在控制器中指定仅对破坏性方法进行身份验证,例如创建/更新/销毁。如果您需要来自移动客户端的身份验证,我可以指导您使用设计提供的简单令牌身份验证。
  • 哈桑,谢谢。我忘了在控制器中指定仅对破坏性方法进行身份验证。我想对从移动客户端读取数据进行身份验证的原因是限制对我的 iphone 应用程序的访问。它只是列出事件,所以它不是任何人真正想要的。如果您确实有设计提供的简单令牌身份验证指南以及 iphone 应用程序如何使用它,那就太好了。正如您从我上面的代码中看到的那样,我之前已经尝试过。我在设计中设置了 token_authenticable 并传递了一个真实性令牌。

标签: iphone ios ruby-on-rails devise restkit


【解决方案1】:

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

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

 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 格式传递。

【讨论】:

  • 谢谢,我会试试这个,让你知道它是怎么回事。
  • 我试过这个,不幸的是它不能让它工作。第一个问题是当我在我的 ios 应用程序(用户名和密码)中设置我的帖子值时。当它这样做时,它会尝试创建一个事件,而不是发送身份验证参数、身份验证然后读取事件。这更有可能是因为我在我的 ios 应用程序中设置后值:[request setPostValue:@"email" forKey:@"username"]。我确实看到 iphone 应用程序正在传递参数。最后,我得到一个未经授权的 401 状态码,所以它是
  • 不,您不要使用您需要将其设置为身份验证标头的 post 值。见:httpwatch.com/httpgallery/authentication
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2013-03-31
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多