2013-08-19 6 views
6

Я строю API с Sinatra (используя Angular для клиентской стороны и хочу, чтобы у других был доступ к API), а также он был поставщиком OAuth. Мне интересно, какой лучший маршрут взять (сработайте с существующими драгоценными камнями или сверните собственное решение с Warden или что-то еще).Аутентификация для приложения API REST Sinatra

Использовали устройство и привратник для аутентификации и oauth раньше с Rails, задаваясь вопросом, какое лучшее решение для Sinatra.

В идеале я не хочу взглядов или не могу расширять/модифицировать действия существующего решения, так как я взаимодействую с ним исключительно как API.

+2

Возможно, вы захотите проверить виноград https://github.com/intridea/grape – zotherstupidguy

ответ

0

См. Sinatra API Authentication.

Краткое резюме:

  • Синатра не имеет встроенного в авт.
  • Лучше всего построить auth (см. Ссылку).
  • Имеются драгоценные камни, но вам, вероятно, не понадобятся они для чего-то простого API.
1

Я только недавно сделал то же самое, используя следующий ответ от S/O

What is a very simple authentication scheme for Sinatra/Rack

Это подразумевает модель пользователя, но вместо того, чтобы использовать это, я просто установить пользователя и пароль администратора в моем файле конфигурации. Затем у меня была форма входа в систему, которая просто взяла пароль. Когда пользователь вводит этот пароль, я проверил его против того, что был в настройках, и установил сеанс ['user'] на: admin или: пользователь в соответствии с тем, что он согласовал (или nil, если нет). Затем на каждом из моих маршрутов я вызывал auth:: user или auth:: admin соответственно.

1

API, как правило, принимают ваш запрос на вход и отправляют вам токен аутентификации, который необходимо передать в каждом вызове. Это очень похоже на сеансы на основе файлов cookie, в которых ваш браузер автоматически передает куки-файлы, которые были приобретены при первоначальном посещении веб-сайта.

Из того, что я видел в документации Синатры, вы могли бы сделать на основе сеанса системы аутентификации, как это:

enable :session 
disable :show_exceptions 

use Rack::Session::Pool, 
    key: 'session_id' 

post '/login' do 
    user = User.login_success(params) 
    halt 401 if user.nil? 
    session[:user] = user 
    200 
end 

get '/fun' do 
    user = session[:user] 
    halt 401 if user.nil? 
    halt 403 if !user.has_permission_for '/fun' 
    "fun was had" 
end 

Теперь все, что вам нужно сделать в вашем клиенте, чтобы передать обратно маркер печенья возвращенное в ответ на первоначальный визит при запросе функции API. Это можно сделать с любой веб-клиентской библиотекой, которая поддерживает хранилища файлов cookie (например, libcurl) или путем вставки cookie сеанса в заголовок запроса вручную. Функциональность Rack::Minitest также поддерживает файлы cookie, поэтому вы можете протестировать свой API с помощью minitest.

Смежные вопросы