2009-06-02 8 views
13

Sto attraversando un periodo difficile per trovare esempi chiari e concisi su come implementare uno schema di autenticazione basato sui servizi utilizzando i token. Per quanto posso dire, i passaggi fondamentali sono i seguenti:Autenticazione basata sui servizi mediante token

  1. client richiede username/password utente
  2. client passa username/password per provider di identità
  3. controlli Provider nome utente/password e invia indietro un token se l'utente è valido
  4. Il client fa qualcosa con il token?

Il terzo e il quarto passaggio sono dove mi sto bloccando. Presumo che il "token" in questo caso sia solo una stringa crittografata che il client può decodificare o una stringa casuale che viene memorizzata da qualche parte (cioè un database) a cui il client può verificare, ma non sono proprio sicuro cosa dovrebbe fare il client con il token o perché è addirittura necessario un token - non è sufficiente un semplice ID utente?

risposta

25

Suppongo che il "token", in questo caso solo deve essere sia un criptato stringa che il cliente può decifrare o qualche stringa casuale che viene memorizzata da qualche parte (ad esempio un database) che il cliente può quindi verificare, ma non sono proprio sicuro di cosa sia il client che si supponga faccia del token o perché è addirittura necessario un token - non è sufficiente un ID utente semplice ?

No, il token è un "biglietto da corsa". Proprio come un token della metropolitana. Il cliente lo presenta al gatekeeper quando richiede il servizio. In questo caso il provider esegue la propria autenticazione, quindi il client presenta il token al provider. In alcuni casi il provider potrebbe delegare l'autenticazione, ad esempio in the STS model, nel qual caso il provider potrebbe consegnare il token a terzi per l'autenticazione e persino l'autorizzazione.

Dal punto di vista del servizio, questo token deve:

  • hanno un "shelf life". Altrimenti, il token sarebbe infinitamente riutilizzabile. Quindi, sul lato server, è possibile memorizzare il token in un negozio basato sulla sessione, dove si otterrà il timeout gratuitamente. Oppure puoi costruire una semplice tabella hash con scadenza.
  • essere associati esclusivamente al titolare. In molti casi il provider utilizza qui un'approssimazione e afferma che il token può essere utilizzato solo dall'indirizzo IP richiedente originale.

Quindi al passaggio 3, il provider deve controllare nome utente e password. Se ciò si verifica, quindi creare un token (hash), che fa riferimento a una voce in un dizionario o Hashtable. Gli oggetti in Hashtable sono strutture contenenti il ​​nome utente, l'indirizzo IP, probabilmente il tempo di emissione originale, forse i ruoli associati al nome utente e qualsiasi altra cosa si desidera memorizzare. Il fornitore di servizi rimanda questo token - l'hash, non la struttura - al client, tipicamente come un Set-Cookie. Quando il client restituisce il token (come cookie) sulle richieste successive, il provider controlla il dizionario per vedere se il token è disponibile, non ha scaduto, corrisponde all'indirizzo IP richiedente, è autorizzato per la risorsa richiesta, ecc. Se tutto è ok, onora la richiesta.


EDIT 2013 Giugno

Sono passati diversi anni ormai, e questa risposta è ancora ricevendo voti. Suggerirei che le persone guardino il token OAuth 2.0 Framework e i token Bearer.

Fondamentalmente fanno solo ciò che è descritto qui.

Se si vuole una buona implementazione esempio, si può guardare Apigee's Usergrid. Funziona in questo modo:

  1. utente si autentica

    POST https://api.usergrid.com/token -d '{"username":"Joe","password":"Sec4et!","grant_type" : "password"}'

  2. utente riceve un access_token in risposta

  3. L'utente effettua chiamate successive con l'intestazione Authorization: Bearer XXXXXXXXXX w qui XXXXX viene sostituito con il token al portatore. Questo token ha un time-to-live impostato dal server usergrid.

+0

Uno dei presupposti è che si presume che chiunque abbia un token sia chi dice di essere. C'è un modo consigliato per renderlo più sicuro? –

+0

Un getcha che ho trovato è un utente che cambia tra più indirizzi IP per richieste diverse, quindi l'originale e le richieste successive provenivano da diversi IP. http://serverfault.com/questions/470931/user-http-requests-coming-from-multiple-ip-adresses – dan

+0

come afferma wikipedia - OAuth 2.0 non è sicuro: "OAuth 2.0 non supporta la firma, la crittografia, il binding del canale o la verifica del client. Fa affidamento completamente su SSL per un certo grado di riservatezza e autenticazione del server. [14] [15] OAuth 2.0 ha avuto numerosi livelli di sicurezza difetti esposti nelle implementazioni. [16] Il protocollo stesso è stato descritto come intrinsecamente insicuro dagli esperti di sicurezza e un contributore principale alle specifiche ha dichiarato che gli errori di implementazione sono quasi inevitabili. [17] [18] "Quindi dovremmo davvero usarlo? http://en.wikipedia.org/wiki/OAuth –

1

Un token tipico è un hash casuale memorizzato sul lato server. Il cliente lo restituisce con le sue richieste. Ciò che ti dà è che non devi passare la password tutto il tempo, il che è ovviamente tutto per il bene, e il token può essere invalidato ogni volta che vuoi senza dover cambiare la password.

1

Ho trovato questa documentazione per Amazon S3 utile quando stavo esaminando lo stesso problema.

Authenticating REST Requests

Il principio generale è che non si vuole essere di passaggio intorno al vostro nome utente e password per ogni chiamata di servizio successiva come questo non sarebbe che sicuro.

Hai menzionato il semplice passaggio del nome utente al servizio, ma di nuovo questo non sarebbe molto sicuro.

Si potrebbe pensare di utilizzare lo stato di sessione per archiviare il fatto che un utente è stato autenticato, tuttavia questo contro uno dei principi generali di REST in base al quale tutto dovrebbe essere senza stato.

+0

Un collegamento migliore è: http: //docs.amazonwebservices .com/AmazonS3/latest/index.html? RESTAuthentication.html –

0

Servizio Web con sessioni ... hmmm non è come dovrebbe essere. I servizi Web non sono pensati per mantenere lo stato.
Mi sono guardato intorno sul web e molti esempi e articoli parlano di SSL/TLS + nome utente/password. Sarebbe bello sostituire il nome utente/password con l'infrastruttura "API key", ma non ho idea di come "architettare" una cosa del genere ...