2013-08-19 30 views
6

Buduję API z Sinatrą (używając Angulara po stronie klienta i chcę, aby inni mieli dostęp do API) i posiadam również dostawcę OAuth. Zastanawiam się, jaka jest najlepsza droga do pokonania (pracuję nad istniejącymi klejnotami lub rozwijam własne rozwiązanie w Warden lub coś takiego).Uwierzytelnianie dla aplikacji API REST API Sinatra

Zużyte urządzenie i odźwierny do uwierzytelniania i oauth wcześniej z Rails, zastanawiając się, jakie najlepsze rozwiązanie dla Sinatry.

Idealnie nie chcę widoków ani nie mogę rozszerzać/modyfikować działań istniejącego rozwiązania, ponieważ wchodzę z nim w interakcję wyłącznie jako interfejs API.

+2

możesz chcieć sprawdzić winogronę https://github.com/intridea/grape – zotherstupidguy

Odpowiedz

0

Zobacz Sinatra API Authentication.

Szybkie podsumowanie:

  • Sinatra nie ma wbudowanego w uwierzytelniania.
  • Najlepiej zbudować auth (patrz link).
  • Dostępne są klejnoty, ale prawdopodobnie nie będzie ich potrzebować do czegoś tak prostego jak API.
1

Właśnie niedawno zrobił to samo przy użyciu następującej odpowiedzi z S/O

What is a very simple authentication scheme for Sinatra/Rack

Oznacza to model obsługi, ale zamiast używania, że ​​ja po prostu ustawić hasło użytkownika i administratora w moim pliku konfiguracyjnym. Potem miałem formularz logowania, który właśnie wziął hasło. Gdy użytkownik wprowadzi to hasło, sprawdziłem je w ustawieniach i ustaw sesję ['user'] na: admin lub: user zgodnie z tym, który był dopasowany (lub zero, jeśli żaden). Następnie na każdej z moich tras zadzwoniłem do auth:: user lub auth:: admin.

1

Interfejsy API zwykle akceptują żądanie logowania i wysyłają token uwierzytelniający, który należy przekazywać w każdym wywołaniu. Jest to bardzo podobne do sesji opartych na plikach cookie, w których przeglądarka automatycznie przekazuje plik cookie uzyskany podczas pierwszej wizyty w witrynie.

Z tego co widziałem w docs Sinatry, można zrobić system uwierzytelniania sesji opartej takiego:

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 

Teraz wszystko, co trzeba zrobić w kliencie jest przejść z powrotem token cookies zwrócony w odpowiedzi na pierwszą wizytę przy żądaniu funkcji API. Można to zrobić za pomocą dowolnej biblioteki klienta WWW obsługującej magazyny plików cookie (np. Libcurl) lub ręcznie wstawiając plik cookie sesji do nagłówka żądania. Funkcja Rack::Minitest obsługuje również pliki cookie, dzięki czemu można przetestować interfejs API za pomocą minitestu.