向 iOS 应用程序公开 Rails/Devise 身份验证

Posted

技术标签:

【中文标题】向 iOS 应用程序公开 Rails/Devise 身份验证【英文标题】:Exposing Rails/Devise Authentication to iOS application 【发布时间】:2012-02-08 19:27:02 【问题描述】:

我有一个 Rails 3.1 应用程序,它使用 Devise for Authentication 和一个带有电子邮件、密码等的简单用户模型。我需要能够从 iphone 应用程序进行身份验证。如何公开此功能?广泛的答案很好,因为我不确定我的选择是什么。

【问题讨论】:

所有设计控制器都响应 json 和 xml,使得 REST 接口成为可能 老实说,我也有同样的问题。我了解 REST,并且我的 API 运行良好。但我无法理解从 ios 设备登录的概念。 (我使用 RestKit 作为框架,如果有帮助的话)。有人可以通过必要的步骤让 iOS 设备通过 rails 应用程序进行身份验证,然后不断调用 REST 调用来获取信息吗?你如何存储会话?你可以吗?您是否需要通过调用传递用户凭据?你可以使用某种令牌吗?您如何格式化呼叫以获取信息?帮助对我也很有帮助! @Wayfarer 没错。我认为 Web 服务需要在成功通过身份验证后将某种令牌传递给设备,设备可以使用该令牌在任何通信中识别自己,但我不确定这在实际中如何工作。显然,用户模型可以为每个用户存储某种独特的令牌,在身份验证后共享,但我不确定提供这种服务的机制。 【参考方案1】:

最快的方法是简单地启用http_authenticatable 并通过HTTP Basic Auth 传递用户名和密码。虽然这是最简单的方法,但这意味着您必须以明文形式存储用户密码,并将其与您提出的每个请求一起发送。

更好的选择是令牌身份验证,您可以通过参数或 HTTP Basic Auth 传递它(在这种情况下,您可以将密码设置为“X”,将令牌设置为用户名)。这样做的好处是您最初可以使用用户名/密码来获取令牌,然后将其用于任何进一步的身份验证。

使用最少代码量进行令牌身份验证的最简单方法是在 Devise 中启用 HTTP 身份验证并设置一个要求用户登录的新控制器,它所做的只是输出reset_authentication_token 的结果。获得令牌后,您可以将其传递给任何未来的 HTTP 身份验证请求以登录它们。

【讨论】:

如果您尝试从网站登录,是否启用 http_authenticable 然后下拉可怕的用户名/密码字段?我仍然需要用户通过网站和干净的界面登录。 @Zachary Anker 感谢您的回答。您能否确认我理解这一点...设备会点击somesite.com/users/sign_in,将用户名和密码作为 POST 请求的表单参数传递。 Rails 会检查这些细节,如果正确会返回一个令牌。然后设备将存储该令牌并在未来的任何通信中使用它。那么 rails 是从哪里获得令牌的呢?它是否为每个用户生成一个唯一的令牌。令牌是否过期? @Wayfarer 不应该。只要它是 html 等导航格式,就不应弹出 HTTP 身份验证对话框。如果您不想让它出现,您也可以在返回身份验证令牌的控制器中自己实现密码检查。 @1ndivisible 您需要编写自己的控制器来处理它,/users/sign_in/ 将是不会返回令牌的设计控制器。设计句柄设置令牌并生成一个唯一的。除非您添加一些自定义的东西来处理它,否则它不会过期。您将调用user.reset_authentication_token!,然后使用user.authentication_token 获取身份验证令牌。 @Zachary Anker 因此,从设备进行身份验证将访问单独的 URI,例如 api/users/sign_in/?

以上是关于向 iOS 应用程序公开 Rails/Devise 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Rails, Devise, Postmark Gem - 使用邮戳模板设计邮件

Rails 4、Devise 和 Mandrill 电子邮件

Rails、Devise、Role Model 和 CanCanCan - 定义能力

Rails Devise:获取当前登录用户的对象?

在生产模式中无意中破坏了Rails Devise会话

Rails/Devise 会话中的warden 数据由啥组成?