Использовать дайджест-аутентификацию HTTP для одного маршрута

Я хотел бы использовать HTTP Digest аутентификацию для конкретного маршрута в моем модульном приложении Sinatra.

Примеры, приведенные на веб-сайте рецептов sinatra, просто описывают, как включить дайджест-аутентификацию для всего приложения. Решение, предложенное для того, чтобы заставить это работать для определенных маршрутов, состоит в создании двух отдельных приложений (одно с дайджест-аутентификацией, а другое без), помещая защищенные и незащищенные маршруты в их соответствующие приложения.

Это потребует что-то вроде следующего:

require 'sinatra/base'

class Protected < Sinatra::Base
  use Rack::Auth::Basic, "Protected Area" do |username, password|
    username == 'foo' && password == 'bar'
  end

  get '/' do
    "secret"
  end
end

class Public < Sinatra::Base
  get '/' do
    "public"
  end
end

Это кажется излишним для меня.

Есть ли способ защитить отдельный маршрут в модульном приложении sinatra без необходимости создания совершенно нового приложения?

В FAQ есть пример, который ссылается на создание экземпляра Rack::Auth::Basic::Request и передачу в окружение, но выполнение чего-то подобного с использованием дайджест-аутентификации будет сильно отличаться и будет представлять собой гораздо большую процедуру ручной аутентификации.

Вот базовый пример аутентификации:

def authorized?
  @auth ||=  Rack::Auth::Basic::Request.new(request.env)
  @auth.provided? && 
    @auth.basic? && 
    @auth.credentials &&
    @auth.credentials == ['admin', 'admin']
end

У кого-нибудь есть мысли о том, как это можно сделать?

1 ответ

Использование перед фильтрами. Вам нужно другое поведение для одного и того же маршрута?

Другие вопросы по тегам