5

現在のRubyonRails 3 WebアプリケーションとそのWebサービス(API)を分割しようとしています。私のWebアプリケーションはHerokuで実行されており、アプリケーション内に名前空間付きルートとしてAPIを実装しています。たとえば/events、HTMLページを/api/v1/events返し、JSONデータを返します。

いくつかのベストプラクティスに従って、それらを2つの異なるアプリケーションに分割したいと思います。APIアプリケーションを実装するためにSinatraを選択しました。これで、認証が不要な単純なリクエストで機能するようになりました。

私のRubyonRails 3アプリケーションは、Deviseを使用してユーザーを認証しています。Facebookアカウントでログインする機能もあります。今私が達成したいのは、Wardenを使用したSinatraベースのAPIを介したユーザーの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 に答える