Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby(Rails/Sinatra)中实现客户机-服务器API和授权?_Ruby_Api_Authentication_Sinatra - Fatal编程技术网

如何在Ruby(Rails/Sinatra)中实现客户机-服务器API和授权?

如何在Ruby(Rails/Sinatra)中实现客户机-服务器API和授权?,ruby,api,authentication,sinatra,Ruby,Api,Authentication,Sinatra,我需要一个关于如何在ruby中实现“客户机-服务器”web应用的建议。我们高度赞赏任何指南和最佳实践。我对Ruby方式和所需的gems都感兴趣,因为它是一个理想的平台,并且对实现这些东西的一般方式和逻辑感兴趣 很遗憾,我不是一个优秀的ruby程序员,也不是一个经验丰富的系统设计师,所以我真的需要你的帮助,因为我仍然希望这件事最终会大放异彩 应用程序的当前外观应如下所示: class ApplicationController < ActionController::API incl

我需要一个关于如何在ruby中实现“客户机-服务器”web应用的建议。我们高度赞赏任何指南和最佳实践。我对Ruby方式和所需的gems都感兴趣,因为它是一个理想的平台,并且对实现这些东西的一般方式和逻辑感兴趣

很遗憾,我不是一个优秀的ruby程序员,也不是一个经验丰富的系统设计师,所以我真的需要你的帮助,因为我仍然希望这件事最终会大放异彩

应用程序的当前外观应如下所示:

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处理数据
API应用程序:看起来最好的工具是Sinatra。问题是:

  • 如何以清晰的方式组织API?Rails为模型和控制器提供了很好的REST路径设置和文件夹结构。有什么建议或宝石,以提高API建设到期
  • 如何维护访问权限?Warden看起来不是一个好的选择,因为API客户端本身就是web应用程序。所以我需要某种身份验证令牌。怎么可能呢?某种自定义OAuth提供程序?问题是,我不喜欢通过API存储和传递会话cookie,每个请求都传递某种访问令牌。这也

  • 其他应用程序:主要是基于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密钥(令牌),然后将控制器逻辑限制为仅接受该密钥允许的数据操作。您可以通过节点层管理会话。编辑:这是授权,不是身份验证。