Zamierzamy opracować małą aplikację API w Sinatrze. Jakie są dostępne opcje uwierzytelniania w celu zabezpieczenia wywołań interfejsu API?Sinatra - API - Uwierzytelnianie
Odpowiedz
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
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 .)
- 1. Uwierzytelnianie dla aplikacji API REST API Sinatra
- 2. Jak wykonać naprawdę proste uwierzytelnianie Sinatra LDAP?
- 3. Sinatra zbudować dokumentację API REST
- 4. Uwierzytelnianie API REST
- 5. Uwierzytelnianie ASP.NET Web API
- 6. Uwierzytelnianie API Youtube - Iphone
- 7. Uwierzytelnianie interfejsu API Dysk Google
- 8. Uwierzytelnianie interfejsu API danych Google
- 9. Laravel 5.2 Uwierzytelnianie przez API
- 10. Sinatra + Bundler?
- 11. Jak przetestować moje JSON API z Sinatra + rspec
- 12. Uwierzytelnianie za pomocą Onedrive SDK/API (lub dowolnego interfejsu API)
- 13. Najlepszy sposób na uwierzytelnianie w API .NET WCF Web API
- 14. Uwierzytelnianie dla nowego interfejsu API Twittera 1.1
- 15. PowerShell HTTP POST REST API uwierzytelnianie podstawowe
- 16. Uwierzytelnianie interfejsu API i możliwość hackowania
- 17. Uwierzytelnianie społeczne AngularJS i Web Api
- 18. Uwierzytelnianie systemu Windows i Asp.Net Web API
- 19. Uwierzytelnianie dla twitter API i Reszta Zadzwoń
- 20. Uwierzytelnianie za pomocą Facebooka poprzez Rails API
- 21. Uwierzytelnianie interfejsu API Soundcloud bez przeglądarki internetowej
- 22. Jak zaimplementować uwierzytelnianie dla interfejsu API REST?
- 23. Uwierzytelnianie Symfony2 przez REST API innej firmy
- 24. Uwierzytelnianie API LinkedIn za pomocą Java
- 25. Sinatra access-control-allow-origin dla folderu publicznego sinatra
- 26. Aplikacja Sinatra w klejnocie
- 27. Konflikt Mechanize & Sinatra
- 28. Dlaczego sinatra to DSL?
- 29. Sinatra Zmienna Zakres
- 30. Push serwera Sinatra?
Todd Yandell, bardzo dziękuję za szczegółową odpowiedź i za poświęcony czas. Naprawdę doceniam. To naprawdę pomaga. Imran – Saim
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