Domanda

Sto sviluppando un nuovo framework sperimentale per applicazioni web e ho deciso di dedicare un po' di attenzione a RESTful.Ho letto le nozioni di base e sento di avere una conoscenza abbastanza buona del concetto RESTful.

Ho un sistema attivo e funzionante, che utilizza rigorosamente gli URL per definire i "sostantivi" nel sistema e prendere i "verbi" dai metodi di richiesta HTTP.Sto utilizzando chiamate Javascript Ajax per fornire l'accesso ai metodi DELETE e PUT che i moduli HTML non possono fornire.(Mi rendo conto che queste misure non sono strettamente necessarie per essere RESTful, ma soddisfano il requisito "Uniform Interface").

Il problema riguarda l'apolidia e la possibilità di memorizzare nella cache con l'autenticazione.Il modello standard per l'autenticazione dell'utente sui siti Web prevede un evento di autenticazione di "accesso", dopo il quale (in caso di successo) un utente è "all'interno del muro" con una sessione sicura persistente e può vedere e fare cose sulle richieste successive che gli utenti non autenticati potrebbero non vedere.Questa persistenza dell'autenticazione sembra interrompere la funzionalità REST.La memorizzazione nella cache e l'apolidia sembrano essere interrotte, perché l'utente autenticato probabilmente vedrà un codice HTML diverso da quello che vedrà un utente non autenticato per la stessa richiesta (ad esempio, potrebbe esserci un modulo di accesso in una barra laterale per l'utente registrato). nostro utente).

L'utilizzo delle strategie www-authenticate per autenticare un utente solo sulle richieste che richiedono l'autenticazione sembra essere un passo nella giusta direzione, poiché non implica il concetto di una sessione sicura persistente.Tuttavia c'è ancora la questione di come far apparire l'utente finale come "loggato", in linea con ciò che tutti ci aspettiamo dai siti web.

Quindi, secondo il pensiero attuale, qual è il modo preferito per gestire l'autenticazione e l'autorizzazione di una pagina Web in modo rigorosamente RESTful, consentendo comunque le decorazioni di accesso nell'HTML?

È stato utile?

Soluzione

Questa persistenza di autenticazione sembra rompere il riposo

Invece di autenticare un utente, potresti pensare di creare una sessione.Ti verrà restituito un nuovo "ID sessione", insieme al codice di stato HTTP appropriato (200:Va bene, 403:Vietato, ecc.).

L'utente probabilmente vedrà HTML che è diverso da quello che un utente non autenticato vedrà per la stessa richiesta

Chiederai al tuo server REST:"Puoi procurarmi l'HTML (o qualsiasi risorsa) per questo ID sessione?".L'HTML sarà diverso in base all'"ID sessione".

Con questo metodo non esiste alcun muro per le "sessioni sicure persistenti".Stai semplicemente agendo in una sessione.

Il sostantivo (o la risorsa) rappresenterebbe la sessione effettiva, se si opta per questo metodo.

Altri suggerimenti

"Il modello standard per l'autenticazione dell'utente su siti web comporta una 'login' evento di autenticazione, dopo di che (in caso di successo) un utente è 'dentro il muro' con un persistente sessione sicura"

  1. Questo non è propriamente corretto. E 'in parte vero, ma solo per i siti web che inventano il loro autenticazione.

  2. Se si utilizza "l'autenticazione digest" il browser deve inviare le credenziali con ogni richiesta.

Digest di autenticazione - credenziali con ogni richiesta -. È totalmente RESTful

farlo.

Per rendere le cose un po 'più snella, si può calcolare il digest di autenticazione Nunzio in base al tempo in modo che sia un bene per un certo periodo di tempo (6 minuti, 0,1 ore è buono). Tutti pochi minuti una richiesta invierà uno stato di 401 e richiedono ricalcolo del digest.

Una possibilità per conservare cachability a intermediari per le pagine con gli elementi specifici per l'utente è quello di aggiungere il markup specifico per l'utente tramite Ajax. Servite ogni utilizzo della stessa pagina, tra cui alcuni JavaScript che farà una richiesta XHR a una risorsa che restituisce qualcosa di diverso in base al login utente. È quindi unire questo nella pagina sul lato client. La maggior parte della pagina sarà quindi cachable in quanto è lo stesso per ogni utente.

Un'altra opzione è quella di utilizzare ESI (Edge Side Includes). Con questi, la cache di per sé possibile unire diverse rappresentazioni per costruire il risultato finale.

ci penso in questo modo: Il "nome" in autenticazione degli utenti è una sessione. Così il vostro form di login utilizza una richiesta POST di "creare" una nuova sessione, e Logout utilizza una richiesta DELETE per "eliminare" la sessione.

Lo so cosa vuoi dire circa la persistenza di autenticazione di andare contro quiete, ma i biscotti (che danno l'illusione di persistenza) sono semplicemente una parte di ogni richiesta.

"Questa persistenza di autenticazione sembra rompere RESTful-ness. Caching e apolidia sembrano essere rotto, perché l'utente autenticato probabilmente vedrà HTML, che è diverso da quello che un utente non autenticato vedrà per la stessa richiesta"

E 'ok se la rappresentazione della risorsa è leggermente diverso in base alle informazioni di autenticazione. Le informazioni di autenticazione è parte del messaggio e quindi il messaggio è ancora "auto-descrittivo". Concettualmente si sta ancora l'accesso alla stessa risorsa, e il modificare ed eliminare i collegamenti sono consentiti transizioni, non pezzi aggiuntivi di dati. Controllare quali sono disponibili le transizioni in base a chi accede alla risorsa sembra valida a me.

Re: risposta di Daniel:

Se una sessione è un oggetto transitoria che viene rapidamente eliminato, questo non è molto cachable, come qualsiasi della cache si crea avrebbe solo una vita utile di forse un giorno, ma anche continuare a utilizzare lo spazio nella cache in ogni caso.

Non sarebbe meglio per creare l'utente come un oggetto, e l'autenticazione utilizzando l'autenticazione digerire, (o un biscotto se è necessario). in questo modo, ogni utente riceve il proprio nascondiglio persistente invece di una cache che dura un giorno e scompare.

Questo rende anche più senso logico per me, dal momento che si sta facendo una pagina di un aspetto diverso a seconda dell'utente, (l'aggiunta di 'Ciao [nome]' e simili) e la differenza tra il "login" e "disconnesso "gli stati dipende dal fatto che l'utente è incluso nel URL. Se una persona in particolare viene concesso l'accesso a quella specifica url utente dipende dal fatto che essi possono autenticarsi come tale utente.

Se il quadro RESTful è solo andare a essere utilizzato dall'applicazione web, e non sarà utilizzato come un'API per conto terzi, non vedo alcun motivo per cui non è possibile utilizzare lo stesso schema di autenticazione come il resto della vostra applicazione. Si potrebbe pensare a questa autenticazione come uno strato di livello inferiore al livello "applicazione". Il livello di applicazione potrebbe rimanere ancora apolidi in modo RESTful puro.

Naturalmente se si sta progettando di creare un'API RESTful web, è necessario dare a questo pensiero più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top