Sinatra Rack アプリを作成していて、認証に Warden を使用したいと考えています。私はherokuのツールベルトを使用しているので、アプリを実行するためにフォアマンを使用しています。これを機能させると思われるコードをいくつか見つけました。残念ながら、実際に Warden env オブジェクトにアクセスしようとすると、nil になります。
sinatra_warden gemを使用しようとしましたが、独自のバグもあります (これに関連している可能性があります)。
config.ru:
require './web.rb'
use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"
run MyApp
web.rb:
require 'sinatra'
require 'warden'
require 'data_mapper'
require './config/datamapper.rb'
require './config/warden.rb' # I've tried this inside of MyApp, still didn't work
class MyApp < Sinatra::Base
get '/test' do
env['warden'].authenticate! # env['warden'] is nil :(
end
end
config/warden.rb:
use Rack::Session::Cookie, :secret => ENV['SESSION_SECRET']
use Warden::Manager do |manager|
manager.default_strategies :password
manager.failure_app = MyApp.new
end
Warden::Manager.serialize_into_session { |user| user.id }
Warden::Manager.serialize_from_session { |id| User.get(id) }
Warden::Manager.before_failure do |env,opts|
# Sinatra is very sensitive to the request method
# since authentication could fail on any type of method, we need
# to set it for the failure app so it is routed to the correct block
env['REQUEST_METHOD'] = "POST"
end
Warden::Strategies.add(:password) do
def valid?
params["email"] || params["password"]
end
def authenticate!
u = User.authenticate(params["email"], params["password"])
u.nil? ? fail!("Could not log in") : success!(u)
end
end
バージョン:
- シナトラ: 1.1.0
- ウォーデン: 1.2.1
- ラック: 1.4.1
- ルビー: 1.9.3p194
- 職長: 0.60.0
私が説明したセットアップで Warden を使用する方法について何かアイデアはありますか?
(PS好奇心から、env変数とは正確には何ですか?)