如何在Ruby(Rails/Sinatra)中实现客户机-服务器API和授权?
我需要一个关于如何在ruby中实现“客户机-服务器”web应用的建议。我们高度赞赏任何指南和最佳实践。我对Ruby方式和所需的gems都感兴趣,因为它是一个理想的平台,并且对实现这些东西的一般方式和逻辑感兴趣 很遗憾,我不是一个优秀的ruby程序员,也不是一个经验丰富的系统设计师,所以我真的需要你的帮助,因为我仍然希望这件事最终会大放异彩 应用程序的当前外观应如下所示:如何在Ruby(Rails/Sinatra)中实现客户机-服务器API和授权?,ruby,api,authentication,sinatra,Ruby,Api,Authentication,Sinatra,我需要一个关于如何在ruby中实现“客户机-服务器”web应用的建议。我们高度赞赏任何指南和最佳实践。我对Ruby方式和所需的gems都感兴趣,因为它是一个理想的平台,并且对实现这些东西的一般方式和逻辑感兴趣 很遗憾,我不是一个优秀的ruby程序员,也不是一个经验丰富的系统设计师,所以我真的需要你的帮助,因为我仍然希望这件事最终会大放异彩 应用程序的当前外观应如下所示: class ApplicationController < ActionController::API incl
class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Token::ControllerMethods
[...]
before_filter :restrict_access
[...]
def restrict_access
authenticate_or_request_with_http_token do |token, options|
# see if key is valid.
end
end
end
DB+Auth DB API应用程序其他应用程序:
- DB-一个数据库或一组数据库,其中一个数据库用于一组用户(区域)李>
- Auth DB-一个包含个人用户数据和登录信息的数据库,可能是单个的,即使主数据库将在区域之间拆分
- API应用程序-这个东西维护了数据、访问控制和翻译的所有逻辑,可能所有应用程序都有一个翻译库
- 其他应用程序-一堆不同的应用程序,与API捆绑在一起,这可能是数据提供商,他们用一些关于某个用户的数据戳API,以及不同类型的UI。所有应用程序都不能拥有自己的用户相关信息存储,只能通过API处理数据
其他应用程序:主要是基于web的UI。此部件的逻辑选择是Rails。主要问题是如何实现客户端身份验证检查。Desive很酷,但它是否可以与token一起使用,或者它是否更适合作为工具?好的,这将需要更长的时间: 如果您已经熟悉Rails,那么可以看看。该项目致力于从Rails中去除基于JSON的RESTful API不需要的额外缺陷 这听起来很顺利,但也有缺点。首先也是最重要的一点是,您已经阅读了rails基本功能所需的一切,您可能已经习惯了这些功能,例如,
respond\u to
。这可能有点棘手,但当您发现最初是哪个rails模块提供了通常捆绑在ActionController::Base
中的rails中的功能时,就非常简单了
话虽如此,让我举一个例子,说明我上周出于好奇为一个小型API项目所做的工作:
初始情况
我们有一个主要完成的Rails应用程序。这一切都很好,但它基本上是单片的。Rails框架提供一切服务。幸运的是,所有的模型逻辑都捆绑在一个名为core
的gem中。该应用程序本质上允许登录的客户创建可通过最终用户视图进行搜索的产品
我们的目标是为此提供一个RESTful API,它可以更有效地处理并发性和更大的数据文件(即CSV、XLS)
介绍Rails API
设计目标让我想到了Rails API gem。基本安装工作原理与Rails类似,但脚本名为Rails api
,即:
rails-api new jsonapi
我在这里的优势是,我可以使用其他应用程序中的core
,但没有什么能阻止我将自己的模型引入jsonapi
应用程序
也就是说,您可以做所有标准的Rails事情,比如路由等等。它遵循相同的约定。同样,标准路由最初只对JSON作出反应,这有时会有点混乱
让我举一个处理产品的API控制器的示例:
class ProductsController < ApplicationController
include ActionController::HttpAuthentication::Token
before_filter :find_product, :except => [:create, :index]
def index
render :json => @products
end
def create
@product = product.new params[:product]
if @product.save
render :json => @product, :status => :created
else
render :json => @product.errors, :status => :unprocessable_entity
end
end
def show
render :json => @product
end
def update
if @product.update_attributes params[:product]
render :json => @product, :status => :ok
else
render :json => @product.errors
end
end
def destroy
if @product.destroy
render :json => @product, :status => :ok
else
render :json => {:note => I18n.t("messages.deletion_impossible")}, :status => :unprocessable_entity
end
end
protected
def find_product
@product = Product.find params[:id]
end
end
再次注意第二行,您必须手动包括控制器方法
,否则控制器将不知道使用\u http\u令牌验证\u或\u请求\u
延伸
您可能知道基于Rails约定扩展API。它的工作方式完全相同,只是有些东西在默认情况下是故意丢失的。如果您需要JSON模板中更大的灵活性,我建议添加()
很好,但是客户呢?
就个人而言,客户有很多选择。最终我发现这取决于你最喜欢什么。我个人可以推荐Rails API之上的一个小层,然后在它前面得到一个单页应用程序。如果你愿意,你也可以试试。您还可以围绕它构建另一个Rails应用程序,并从控制器操作中调用API
这还取决于你想把目标定位在什么平台上——想到的是iOS/Android的本机应用程序
我选择了node.js+backbone。这对我当时和这个项目来说是最有意义的。节点层基本上持有与API通信所需的令牌,主干应用程序有一个小型库与节点层进行通信。不过,这可能是一把双刃剑,具体取决于API的复杂程度。对于一个小例子来说,这似乎很好,但是仅仅为了将主干应用程序的调用传递到Rails API,可能会有大量代码重复
认证
对于身份验证,您可以创建基于客户的API密钥(令牌),然后将控制器逻辑限制为仅接受该密钥允许的数据操作。您可以通过节点层管理会话。编辑:这是授权,不是身份验证。