Basic認証を行う簡単なサンプル
SinatraのFAQにBasic認証を行うサンプルがあったので試してみます。といっても、「set Rack::Auth::Basic」を呼び出すだけ。
require 'rubygems' require 'sinatra' # 認証を設定。 # ユーザー名が「foo」,「var」の場合のみアクセスを許可する。 use Rack::Auth::Basic do |username, password| username =~ /(foo|var)/ end # 後は普通にrouteを登録すればOK get( "/" ) { 'Hello world!' }
スクリプトを実行し、
http://127.0.0.1:4567/
にアクセスすれば、Basic認証のダイアログが表示されます。
特定のパスでのみ認証を有効化する
上の例では、サーバーのすべてのパスで認証が必要になります。特定のパスにアクセスする場合のみ認証を有効化したい場合は、独自に実装が必要です。
require 'rubygems' require 'sinatra' # このrouteを誰でも実行できる get '/any' do "誰でも閲覧できる" end # このrouteは認証されたユーザーのみ閲覧可能 get '/protected' do # 認証チェック @auth ||= Rack::Auth::Basic::Request.new(request.env) unless @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials[0] =~ /(foo|var)/ response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") throw(:halt, [401, "Not authorized\n"]) end "認証されたユーザーのみ閲覧できる" end
↑のスクリプトでは、
http://127.0.0.1:4567/any
にアクセスする場合は認証不要ですが、
http://127.0.0.1:4567/protected
を参照する場合は認証が必要になります。なお、サンプルでは、わかりやすいようにrouteの内部で認証チェックを行っていますが、Helperを使って認証機能を登録する感じで実装するのがスマートですね。SinatraのFAQではHelperを使う例が紹介されています。