2010-08-13 17 views

Odpowiedz

88

Sinatra nie ma wbudowanej obsługi uwierzytelniania. Istnieje kilka klejnotów dostępnych, ale większość z nich została zaprojektowana do uwierzytelniania użytkowników (np. Na stronie internetowej). W przypadku interfejsu API wyglądają na przesadne. Łatwo jest stworzyć własną. Po prostu sprawdź parametry żądań na każdej z tras, aby sprawdzić, czy zawierają prawidłowy klucz API, a jeśli nie, zwróć błąd 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 

Nic po wywołaniu error się stanie, jeśli metoda valid_key? zwraca false - error wzywa halt wewnętrznie, który zatrzymuje się z wnioskiem kontynuowaniem.

Oczywiście nie jest idealnym rozwiązaniem powtarzanie sprawdzenia na początku każdej trasy. Zamiast tego można utworzyć małe rozszerzenie, które dodaje warunków do swoich tras:

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 

Jeśli chcesz tylko uwierzytelnianie na wszystkich trasach, użyj before Handler:

before do 
    error 401 unless params[:key] =~ /^xyz/ 
end 

get "/" do 
    {"e" => mc**2}.to_json 
end 
+7

Todd Yandell, bardzo dziękuję za szczegółową odpowiedź i za poświęcony czas. Naprawdę doceniam. To naprawdę pomaga. Imran – Saim

+0

Utworzenie małego przedłużenia wydaje się być przesadą, wystarczający jest filtr przedostatni, ponieważ ten ostatni ma opcję wyboru tras. Możesz również powiedzieć, że z wnętrza filtru przez request.path_info. – Robert

2

http://www.secondforge.com/blog/2014/11/05/simple-api-authentication-in-sinatra/ ma nieco bardziej szczegółowy odpowiedź, która używa tokenów użytkownika.

Jest to o jeden krok bardziej skomplikowany niż klucz API, ale jest niezbędny, jeśli twoje API potrzebuje uwierzytelnienia, aby zalogować się do użytkownika, aby wykonać takie czynności, jak edytowanie nazwy/adresu e-mail/hasła lub uzyskiwanie dostępu do informacji dla poszczególnych użytkowników. (tj. "prywatne" działania API). Można również odwołać/wygaśnie tokeny użytkowników, aby ludzie się wylogować, itp

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 

(Warto zauważyć, że jest to bardziej powszechne, aby przeczytać referencje od nagłówka HTTP zamiast ciała JSON, ale autor wspomina, że .)

Powiązane problemy