Sinatra не имеет встроенной поддержки аутентификации.Есть несколько доступных драгоценных камней, но большинство из них предназначены для аутентификации пользователя (например, для веб-сайта).Для API они кажутся излишними.Это достаточно легко сделать самостоятельно.Просто проверьте параметры запроса в каждом из ваших маршрутов, чтобы увидеть, содержат ли они действительный ключ API, и если нет, верните ошибку 401.
helpers do
def valid_key? (key)
false
end
end
get "/" do
error 401 unless valid_key?(params[:key])
"Hello, world."
end
# $ irb -r open-uri
# >> open("http://yourapp.com/api/?key=123")
# OpenURI::HTTPError: 401 Unauthorized
Ничего после вызова error
не произойдет, если вашvalid_key?
метод возвращает false - error
вызывает halt
внутренне, что останавливает продолжение запроса.
Конечно, не идеально повторять проверку в начале каждого маршрута.Вместо этого вы можете создать небольшое расширение, которое добавляет условия к вашим маршрутам:
class App < Sinatra::Base
register do
def check (name)
condition do
error 401 unless send(name) == true
end
end
end
helpers do
def valid_key?
params[:key].to_i % 2 > 0
end
end
get "/", :check => :valid_key? do
[1, 2, 3].to_json
end
end
Если вы просто хотите аутентификацию на всех ваших маршрутах, используйте обработчик before
:
before do
error 401 unless params[:key] =~ /^xyz/
end
get "/" do
{"e" => mc**2}.to_json
end