Синатра - АФИ - проверка подлинности
мы собираемся разработать небольшое приложение API в Sinatra. Какие параметры аутентификации доступны для защиты вызовов API?
2 ответа:
Sinatra не имеет встроенной поддержки аутентификации. Есть некоторые драгоценные камни доступны, но большинство из них предназначены для аутентификации пользователей (т. е. для веб-сайта). Для API, они, кажется, как Overkill. Это достаточно легко сделать самостоятельно. Просто проверьте параметры запроса в каждом из ваших маршрутов, чтобы узнать, содержат ли они действительный ключ 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
http://www.secondforge.com/blog/2014/11/05/simple-api-authentication-in-sinatra/ имеет немного более подробный ответ, который использует пользовательские токены.
Это на один шаг сложнее, чем ключ API, но необходимо, если ваш API нуждается в аутентификации для входа в систему пользователя, чтобы делать такие вещи, как редактирование имени/электронной почты/пароля или доступ к информации для каждого пользователя. (т. е." частные " действия API). Вы также можете отменить/истечь срок действия пользовательских токенов, чтобы позволить людям выйти из системы и т. д.
class App < Sinatra::Base before do begin if request.body.read(1) request.body.rewind @request_payload = JSON.parse request.body.read, { symbolize_names: true } end rescue JSON::ParserError => e request.body.rewind puts "The body #{request.body.read} was not JSON" end end post '/login' do params = @request_payload[:user] user = User.find(email: params[:email]) if user.password == params[:password] #compare the hash to the string; magic #log the user in else #tell the user they aren't logged in end end end
(стоит отметить, что чаще всего читаются учетные данные из заголовка HTTP вместо тела JSON, но автор упоминает об этом.)