2013-08-19 19 views
6

Sto costruendo un'API con Sinatra (utilizzando Angular per il lato client e voglio che altri abbiano accesso all'API) e che sia anche un provider OAuth. Mi sto chiedendo quale sia la strada migliore da seguire (eliminare le gemme esistenti o tirare fuori la propria soluzione da Warden o qualcosa del genere).Autenticazione per l'app API Sinatra REST

Hanno già utilizzato devise e doorkeeper per l'autenticazione e oauth con Rails, chiedendosi quale sia la soluzione migliore per Sinatra.

Idealmente non voglio le viste o posso estendere/modare le azioni di una soluzione esistente, poiché sto interagendo con essa puramente come API.

+2

si potrebbe voler controllare uva https://github.com/intridea/grape – zotherstupidguy

risposta

0

Vedere Sinatra API Authentication.

Rapido riepilogo:

  • Sinatra non ha built-in auth.
  • È meglio creare un'autenticazione (vedere il collegamento).
  • Ci sono gemme disponibili, ma probabilmente non ti serviranno per qualcosa di semplice come un'API.
1

io abbiamo appena fatto la stessa cosa con la seguente risposta da S/O

What is a very simple authentication scheme for Sinatra/Rack

implica un modello di utente, ma invece di usare quello, ho solo impostare una password utente e admin nel mio file di configurazione. Poi ho avuto un modulo di accesso che ha appena preso una password. Quando l'utente inserisce la password, l'ho verificata rispetto a quella nelle impostazioni e ho impostato la sessione ['utente'] su: admin o: utente in base a qualsiasi corrispondenza (o nulla se nessuno). Quindi su ciascuno dei miei percorsi, ho chiamato auth:: user o auth:: admin di conseguenza.

1

Le API accettano normalmente la richiesta di accesso e inviano un token di autenticazione che è necessario trasferire in ogni chiamata. Questo è molto simile alle sessioni basate sui cookie in cui il browser restituisce automaticamente il cookie acquisito durante la visita iniziale al sito.

Da quello che ho visto nei documenti di Sinatra, si potrebbe fare un sistema di autenticazione basata sulla sessione in questo modo:

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 

Ora tutto quello che dovete fare il vostro cliente è quello di passare di nuovo il token biscotto restituita in risposta alla visita iniziale quando si richiede una funzione API. Questo può essere fatto con qualsiasi libreria client web che supporti archivi di cookie (come libcurl) o inserendo manualmente il cookie di sessione nell'intestazione della richiesta. La funzionalità Rack::Minitest supporta anche i cookie, quindi puoi testare la tua API con minitest.