Синатра - API - Аутентификация - PullRequest
58 голосов
/ 13 августа 2010

Мы собираемся разработать небольшое приложение API в Синатре. Какие варианты аутентификации доступны для защиты вызовов API?

Ответы [ 3 ]

89 голосов
/ 14 августа 2010

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 голосов
/ 16 декабря 2014

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, но авторупоминает об этом.)

1 голос
/ 01 февраля 2019

Обновление

В настоящее время аутентификация на основе токенов становится популярной.Я бы рекомендовал использовать реализацию ruby ​​стандарта JWT по ruby-jwt для простой аутентификации и авторизации.

gem 'jwt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...