Sinatra Warden使用现有的Ruby on Rails应用程序,使用Devise

时间:2011-04-18 09:32:18

标签: ruby-on-rails-3 authentication devise sinatra warden

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

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

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

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

请记住,我对Rack不太熟悉:)。

1 个答案:

答案 0 :(得分:10)

我能够让它运转起来。主要有几个方面:

  • 让Devise使用Rails(Devise是一个Rails应用程序,不起作用 没有它)
  • 在Rack级别设置映射(路由)以支持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以获取完整的解决方案。