2011-11-09 1 views
15

Ho avuto questo server REST (scritto da me stesso) che è protetto da una semplice autenticazione HTTP.Accesso protetto al server REST autenticato tramite Backbone.js?

Ora ho riscritto l'app utilizzando backbone.js e non sono sicuro su come procedere per l'autenticazione del mio client. Se lo faccio in JS user/pass sarebbe visibile.

Quindi, come devo modificare il mio server o il mio lato client JS per essere sicuro?

In precedenza ho appena dato l'utente & passaggio in PHP per ogni richiesta al server REST, per favore guidami, grazie.

risposta

2

Va bene ho avuto una discussione con il mio collega e si avvicinò con l'idea migliore Finora:

Crea un controller semplice nel lato client (sito) e chiamalo RESTAPI, fungerà solo da wrapper per il tuo server REST attuale.

Quando un utente accede al sito, viene creata la sua sessione get. Il controller RESTAPI conosce le credenziali per il server REST effettivo autenticato HTTP e colpisce REST Server per conto di Backbone.

Esempio: Se devo prendere

/messaggi/inviati

da REST Server, ora invece mi ha colpito questo url nella collezione dorsale

sito/restapi/messaggi/inviati

RESTAPI Con anche il troller controlla innanzitutto che l'utente richiedente abbia una sessione corretta sul sito e che gli sia consentito di recuperare la risorsa o meno.

Quindi nessuna preoccupazione circa i cookie insicuri o lasciando il pass REST Server nella pianura JS o con qualsiasi altro metodo oscuro :)

+1

Non rompe l'intera RESTFULness del server? Voglio dire, se hai intenzione di seguire questa strada, puoi anche fare una sessione di gestione sul server. Non fraintendermi, sono ancora all'oscuro se passo le credenziali ogni volta, archiviarle sul client per passare ogni volta non è necessariamente l'idea più brillante. – thenetimp

+0

Non c'è niente di sbagliato nel trasferire le credenziali in ogni richiesta. In REST, ogni richiesta dovrebbe essere auto descrittiva (per rimuovere la necessità di sessioni nel server).Se una risorsa è protetta, le credenziali fanno parte della "descrizione" della richiesta e, in quanto tale, devono essere inviate con essa. Puoi semplicemente chiedere all'utente le sue credenziali e passarle su ogni richiesta successiva. Per OP, non utilizzare le sessioni, per favore. Stai distruggendo la bellezza REST con esso. Non hai bisogno di sessioni e non utilizzandole stai mantenendo il tuo sistema molto più scalabile. – miguelcobain

+0

Puoi fornire un esempio del codice backbone.js che hai scritto per questa implementazione? Sto avendo problemi a farlo funzionare. Puoi vedere i miei progressi in [questa domanda] (http://stackoverflow.com/questions/14752326/adding-http-basic-authentication-header-to-backbone-js-sync-function-prevents-mo) – MusikPolice

29

HTTP L'autenticazione di base è soggetta a attacchi di tipo eavesdropping e man-in-the-middle. Si consiglia di utilizzare HTTPS.

Tuttavia, se questa non è un'opzione, è sempre possibile inviare un cookie al client e inserire il nome utente/password per impedire che venga visualizzato nel file JS. Va da sé che la password dovrebbe essere almeno criptata/hash per motivi di sicurezza. Quindi, l'onere sarà sul lato server per ottenere i dettagli di autenticazione dal cookie.

Ora, se non si ha alcun controllo sulla modifica del codice lato server, si rimane praticamente senza altra opzione se non seppellire i dettagli delle credenziali in un metodo globale ajaxSend() che invierà i dettagli nome utente/password ad ogni Richiesta AJAX. Potresti semplicemente metterlo in qualche altro file .js e renderlo difficile da trovare, ma sei praticamente limitato a quella forma di sicurezza. Anche se i cookie non rendono la vita più sicura. (Sarebbe bello se la password fosse hash/cifrata).

L'altra cosa che si può fare è avere una forma di sicurezza leggermente più complicata: avere il server che invii un nonce a ogni risposta: il nonce verrebbe "firmato" dal server usando la chiave segreta del server e si può utilizzalo per "criptare" il nome utente/password sul lato client per ogni richiesta. Il tuo server dovrebbe quindi decrittografare costantemente le credenziali. Questo è meno incline a man-in-the-middle ma non è infallibile.

HTTPS ti salverà da ciascuno di questi se è un'opzione per te.

Spero che questo aiuti.

UPDATE(come da commento): L'essenza del ristoratore-ness è l'assenza di stato sul server. No, nessuna sessione! Quindi è necessario inviare le credenziali dell'utente con OGNI richiesta che il client fa del server. Se si dispone di una pagina di accesso, è molto difficile essere veramente riposanti poiché non vi è alcuna risorsa chiamata login. Tuttavia, ecco cosa si può fare:

  1. visite utente di accesso pagina, immette le credenziali e clic 'login'
  2. invia richiesta POST al server con queste credenziali - probabilmente a/Login
  3. che il server restituisce il risorsa richiesta per la quale era necessaria l'autenticazione E impostare il cookie con le credenziali valide da utilizzare nella richiesta 'successiva'
  4. Ogni richiesta successiva verrà indirizzata alla risorsa corrispondente in un particolare URL con una particolare azione (GET, PUT, POST , ELIMINA...). Il server dovrebbe verificare i dati di autenticazione dal cookie e decidere se l'utente è autenticato ed eseguire ulteriori autorizzazioni per concedere l'accesso in caso di necessità.

Ogni richiesta deve identificarsi senza avere il server di mantenere la sessione - che è lo spirito di apolidia (e riposante-ness;)

+0

Grazie per la panoramica approfondita e sicuramente aiuta. Ma, scusate, ho dimenticato di menzionare (modificato la domanda ora) che ho pieno accesso al server e posso cambiarlo in modo che la mia configurazione sia infallibile. Qualche suggerimento su questo? Puoi scrivere un'altra risposta o modificarla se lo desideri. – BlackDivine

+1

@BlackDivine - gli stessi passaggi tieni :) Ho mostrato 3 modi di farlo - solo client ('ajaxSend'), solo server (cookie) e ibridi (costante crittografia/decrittografia usando nonce del server) – PhD

+0

Mi piace l'opzione Cookie più per Al momento, puoi confermare che questo apporach è migliore? Che creiamo sessioni sul server, ogni volta che un utente accede correttamente, la sessione viene creata sul server di riposo e finché la sessione è attiva l'utente può utilizzare l'API REST. Ora invierà il login POST tramite ajax creerà la sessione per l'utente sul server o sul mio sito web? Poiché ho 2 server, 1 è REST il sito Web di altri host che esegue l'app backbone. Grazie molto! – BlackDivine

0

Se si ha accesso al codice lato server REST, è possibile ridisegnare l'autenticazione REST. La prima volta, per accedere, inserisci il nome utente/password su https, a sua volta ottieni un id di sessione che può essere utilizzato nelle successive richieste passandolo come cookie.