5

我正在尝试拆分我当前的 Ruby on Rails 3 Web 应用程序和它的 Web 服务 (API)。我的 web 应用程序在 Heroku 上运行,并将 API 实现为我的应用程序中的命名空间路由。例如/events返回一个 HTML 页面并/api/v1/events返回一个 JSON 数据。

根据一些最佳实践,我想将它们分成两个不同的应用程序。我选择了 Sinatra 来实现 API 应用程序。它现在适用于不需要身份验证的简单请求。

我的 Ruby on Rails 3 应用程序正在使用 Devise 对用户进行身份验证。还可以使用 Facebook 帐户登录。现在我想要实现的是通过我的基于 Sinatra 的 API 使用 Warden 对用户进行 HTTP 基本身份验证(包括注册)。

最好的方法是什么?或者也许我可以使用与 Warden 不同的东西?

请记住,我对 Rack 不是很熟悉 :)

4

1 回答 1

10

我能够让它工作。有几个主要方面:

  • 让 Devise 与 Rails 一起工作(Devise 是一个 Rails 应用程序,没有它就无法工作)
  • 在机架级别设置映射(路由)以支持 Rails 和 Sinatra
  • 在 Rails 和 Sinatra 之间共享会话
  • 设置 Warden 并使其对 Sinatra 可用

以下是 /config.ru 中最相关的代码部分:

    #

    # ...

    # Rest with Rails
    map "/" do
      run MyApp::Application
    end

    # Anything urls starting with /slim will go to Sinatra
    map "/slim" do

      # make sure :key and :secret be in-sync with initializers/secret_store.rb initializers/secret_token.rb
      use Rack::Session::Cookie, :key => '<< see, initializers/secret_store.rb >>', :secret => '<< copy from initializers/secret_token.rb >>'

      # Point Warden to the Sinatra App
      use Warden::Manager do |manager|
        manager.failure_app = AppMain
        manager.default_scope = Devise.default_scope
      end

      # Borrowed from https://gist.github.com/217362
      Warden::Manager.before_failure do |env, opts|
        env['REQUEST_METHOD'] = "POST"
      end

      run AppMain
    end

请参阅http://labnote.beedesk.com/sinatra-warden-rails-devise以获得完整的解决方案。

于 2011-11-02T03:47:10.927 回答