Sinatra hat keine eingebaute Authentifizierungsunterstützung. Es gibt zwar einige Edelsteine, aber die meisten sind für die Benutzerauthentifizierung (d.h. für eine Website) gedacht. Für eine API scheinen sie ein Overkill zu sein. Es ist einfach genug, seine eigene zu machen. Überprüfen Sie einfach die Request-Params in jeder Ihrer Routen, um zu sehen, ob sie einen gültigen API-Schlüssel enthalten, und wenn nicht, geben Sie einen 401-Fehler zurück.
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
Nichts nach dem Aufruf von error
wird passieren, wenn Ihr valid_key?
Methode gibt false zurück - error
ruft auf. halt
intern, was die Fortsetzung der Anfrage verhindert.
Natürlich ist es nicht ideal, die Prüfung zu Beginn jeder Strecke zu wiederholen. Stattdessen können Sie eine kleine Erweiterung erstellen, die Bedingungen zu Ihren Routen hinzufügt:
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
Wenn Sie nur eine Authentifizierung für alle Ihre Routen wünschen, verwenden Sie eine before
Handler:
before do
error 401 unless params[:key] =~ /^xyz/
end
get "/" do
{"e" => mc**2}.to_json
end