我有一个 ruby 应用程序,它基本上是一个 API 服务器——可以对该服务器的 IP 地址和端口进行调用——以访问这个应用程序。
现在,我希望将其转换为具有身份验证并遵循 REST 结构的常规 ruby Web 应用程序。
最简单/最快的方法是什么?
我还希望核心 Ruby 代码(实际上为 API 提供支持)与 REST 绑定/身份验证模型分开——以便可以单独更新核心代码。
我有一个 ruby 应用程序,它基本上是一个 API 服务器——可以对该服务器的 IP 地址和端口进行调用——以访问这个应用程序。
现在,我希望将其转换为具有身份验证并遵循 REST 结构的常规 ruby Web 应用程序。
最简单/最快的方法是什么?
我还希望核心 Ruby 代码(实际上为 API 提供支持)与 REST 绑定/身份验证模型分开——以便可以单独更新核心代码。
就个人而言,我建议使用 Rails 和Rabl。如果您关心 API 的版本控制(提示:您会的),那么Version Cake gem 也是绝对必须的。当第三方 API 从他们的脚下改变时,人们通常不喜欢它。
对于身份验证,我建议使用用户 ID 和令牌的组合,作为标头(即X-YOURAPP-TOKEN = ryan-a003c850e1
)或作为操作的参数传入。然后通过在 上拆分此令牌-
并找到用户记录,然后检查该用户的 API 密钥是否与令牌的其余部分匹配来完成“身份验证”。如果是这样,那么应该对用户进行身份验证。将用户记录存储在实例变量@current_api_user
中,以便可以在控制器中访问它。
您的控制器设置在一个层次结构中,其中您有一个BaseController
包含此身份验证逻辑(作为 a before_filter
),然后其他控制器继承自该控制器。如果您有任何其他助手,他们也会进入此控制器。显然,我假设您此时对 Rails 有所了解。
对于授权,请使用CanCan。它的 README 和 Wiki 是有关如何使用它的重要信息来源。您可能需要对您的 API 进行授权,即使您在最初的帖子中没有这样说。
使用与此类似的设置是我为 Spree 构建 API 的方式,您可以在此处查看:https ://github.com/spree/spree/tree/master/api 。
其他人会推荐在 Rails上使用Sinatra ,在 Rabl 上使用Active Model Serializers。其他人仍然会建议您使用超媒体 API而不是传统的 REST 接口。甚至有一本书关于如何做到这一点。
老实说,这取决于您决定使用什么。