gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:12 27 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8年前关闭。




我需要关于如何在 ruby​​ 中实现“客户端-服务器”网络应用程序的建议。任何指南和最佳实践都受到高度赞赏。我对 Ruby 方式和所需的 gem 感兴趣,因为它是一个理想的平台,以及实现这些东西的一般方式和逻辑。

我不是一个优秀的 ruby​​ 程序员,也不是一个有多年经验的熟练系统设计师,所以我真的需要你的帮助,因为我仍然希望这件事最终会大放异彩。

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

DB + Auth DB <-> API 应用 <-> 其他应用:

  • DB - 一个数据库或一组数据库,其中一个 DB 用于一组用户(区域)。
  • 身份验证数据库 - 另一个包含个人用户数据和登录信息的数据库,即使主数据库将在区域之间拆分,也可能是单个数据库。
  • API 应用程序——这个东西维护了所有关于数据、访问控制和翻译的逻辑,可能为所有应用程序提供一个翻译基础。
  • 其他应用程序 - 一堆不同的应用程序,与 API 绑定(bind),这可能是数据提供者,它使用有关某些用户的一些数据和不同类型的 UI 来访问 API。所有的应用程序都不能拥有自己的用户相关信息存储,并且只能通过 API 处理数据。

  • API 应用:看起来制作它的最佳工具是 Sinatra。问题是:
  • 如何以清晰的方式组织API? Rails 为模型和 Controller 提供了很好的 REST 路径设置和文件夹结构。任何提高 API 构建体验的技巧或 gem ?
  • 如何维护访问权限? Warden 看起来不是一个好的选择,因为 API 客户端本身就是 Web 应用程序。所以我需要某种身份验证 token 。怎么可能呢?某种自定义 OAuth 提供程序?问题是,我不喜欢通过 API 存储和传递 session cookie 的想法,每个请求都传递某种访问 token 。这也

  • 其他应用:主要是基于 Web 的 UI。这部分的逻辑选择是 Rails。主要问题是如何实现客户端身份验证检查。 Devise 很酷,但是有没有可能让它与 token 一起工作,或者它是更合适的工具吗?

    最佳答案

    好的,这会有点长:

    如果你已经熟悉 Rails,你可以看看 Rails API gem .该项目力求从 Rails 中移除基于 JSON 的 RESTful API 不需要的额外内容。

    这听起来可能很顺利,但它也有缺点。首先,您已经阅读了基本 Rails 功能所需的一切,您可能已经习惯了,例如respond_to .这可能有点棘手,但是当您找出最初提供的 Rails 模块通常捆绑在 ActionController::Base 中的功能时,就非常简单了。 .

    话虽如此,让我举一个例子,说明我上周出于好奇做了一个小型 API 项目:

    初始情况

    我们有一个主要完成的 Rails 应用程序。一切正常,但它基本上是单片的。一切都由 Rails 框架提供服务。对我们来说幸运的是,所有模型逻辑都捆绑在一个名为 core 的 gem 中。 .该应用程序实质上允许登录的客户创建可通过最终用户 View 进行搜索的产品。

    目标是为此提供一个 RESTful API,它可以更有效地处理并发和更大的数据文件(即 CSV、XLS)。

    Rails API 介绍

    设计目标让我了解 Rails API gem。基本安装与 Rails 类似,只是脚本名为 rails-api , IE。:

    rails-api new jsonapi

    对我来说,这里的优势是我可以使用 core来自其他应用程序,但没有什么能阻止我将自己的模型引入 jsonapi应用。

    话虽如此,您可以执行所有标准的 Rails 功能,例如路由等。它遵循相同的约定。再说一次,标准路由最初只对 JSON 使用react,这有时会让人有点困惑。

    我举一个处理产品的API Controller的例子:
    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

    这没什么特别的。唯一需要注意的是第二行 ActionController::HttpAuthentication::Token明确包括在内。这样您的 API 就可以由 HTTP token 保护。如果您想了解有关保护 API 的更多信息,我建议您使用 Ryan Bates 的 Guide on Railscasts .

    本质上,您在 ApplicationController 中提供了一个 before 过滤器。像这样:
    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

    再次注意第二行,您必须包含 ControllerMethods手动,否则没有 Controller 知道 authenticate_or_request_with_http_token .

    延期

    您可能知道基于 Rails 约定扩展 API。它的工作方式完全相同,除了默认情况下有意丢失某些内容。我建议添加 JBuilder ( Railscast ),如果您需要在 JSON 模板中具有更大的灵活性。

    很好,但是客户呢?

    就个人而言,客户有很多选择。最终我发现这归结为你最喜欢什么。我个人可以推荐一个小 node.js Rails API 之上的层,然后基于 backbone.js 获取单页应用程序在它面前。你也可以试试 AngularJS如果你喜欢。您还可以围绕它构建另一个 Rails 应用程序,并从您的 Controller 操作中调用 API。

    它还取决于您要定位的平台——iOS/Android 的 native 应用程序。

    我做出的选择是 node.js +backbone。它目前对我当时和项目最有意义。节点层本质上持有与 API 通信所必需的 token ,而主干应用程序有一个小型库来与节点层通信。然而,它可能是一把双刃剑,具体取决于您的 API 的复杂程度。对于一个小例子,这似乎没问题,但是为了将来自主干应用程序的调用传递到 Rails API,可能会有很多代码重复。

    验证

    对于身份验证,您可以制作基于客户的 API key ( token ),然后将 Controller 逻辑限制为仅接受该 key 允许的数据操作。您可以通过节点层管理 session 。编辑:这是授权,而不是身份验证。实际上没有什么能阻止您将 Authlogic 与 Rails API 一起使用 - 我还没有测试过它,但它应该可以工作。

    我承认我还没有完成这部分 - 我希望其他人可以回答这个架构问题 :-)

    我希望我能提供一些见解。

    P.S.:如果你想测试你的 API,我强烈推荐 httpie (这很棒!)

    关于ruby - 如何在 Ruby (Rails/Sinatra) 中实现客户端-服务器 API 和授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14644606/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com