Мы собираемся разработать небольшое приложение API в Синатре. Какие параметры аутентификации доступны для защиты вызовов API?
Sinatra - API - аутентификация
Ответ 1
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
Ответ 2
http://www.secondforge.com/blog/2014/11/05/simple-api-authentication-in-sinatra/ содержит несколько более подробный ответ, в котором используются токены пользователя.
Это на один шаг сложнее, чем ключ API, но необходим, если для вашего API требуется аутентификация для входа в систему, чтобы пользователь мог выполнять такие действия, как редактирование имени/электронной почты/пароля или доступ к информации для каждого пользователя. (т.е. действия "private" 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, но автор упоминает это.)
Ответ 3
Обновить
В настоящее время аутентификация на основе токенов становится популярной. Я бы порекомендовал использовать реализацию ruby стандарта JWT от ruby-jwt для простой аутентификации и авторизации.
gem 'jwt'