2012-07-12 20 views
8

ho intenzione di implementare OAuth 2.0 e REST API con essoOAuth 2.0. Nessuna sessione? (Stateless)

per concedere autorizzazioni diverse per utenti e anche per scalare bene.

Per scalare bene, apolidi è più facile perché non c'è

NO file sessione di database, con sede in-memory con esso.


seguito è riportato come ho capito OAuth 2.

  1. OAuth Server dare un token di accesso a un utente.
  2. Il token di accesso dell'utente è memorizzato nel cookie.
  3. Quando l'utente accede all'API REST, l'utente invia con il token di accesso.
  4. Il server riceve una richiesta con token di accesso.
  5. Il server rileva se il token di accesso è valido e l'utente ha il permesso di fare richiesta.
  6. Fare o rifiutare in base al privilegio dell'utente.

Quindi non c'è bisogno di preoccuparsi di memorizzazione delle sessioni. Destra?

+0

Dai un'occhiata a questa libreria https://pypi.python.org/pypi/python-oauth2 – DarkAnthey

risposta

8

Quello che stai descrivendo qui è OAuth 2 Implicit Grant flow. OAuth 2 include anche altri tre flussi, ma poiché sembra che il proprietario del vostro prodotto (l'utente) stia iniziando richieste utilizzando il browser Javascript (si parlava di cookie), questo è il flusso da seguire.

Sul lato client, OAuth richiede solo l'archiviazione di access_token per l'accesso a risorse protette (e un refresh_token se si sta per scadere access_token).

+2

Per verificare contro token di accesso dovrà avere un lato server db.;) –

+0

Certo, sul lato server deve conoscere per ogni token di accesso per quale utente è stato rilasciato e quali ambiti sono stati concessi. Opzionalmente potrebbe anche ricordare e controllare il 'redirect_uri' consentito per una maggiore sicurezza. Se questo è ciò che intendeva con "archiviazione di sessione", ho frainteso la domanda;) –

+1

Dimentica la parte relativa a 'redirect_uri', è sbagliato. Dovrei andare a letto ;) –

4

Un'innovazione più recente è JWT - Token Web JSON.

Ecco un link per le specifiche: JWT - JSON Web Token

JWT è un metodo di utilizzo di gettoni Hashed utilizzando un metodo di hashing, come HMAC che sta per un Hash-based Message Authentication Code. Poiché il token è sottoposto a hash con una chiave segreta, il server può determinare se il token è stato manomesso.

Ecco un metodo esempio per creare un token hash per JWT:

public String createTokenForUser(User user) { 
     byte[] userBytes = toJSON(user); 
     byte[] hash = createHmac(userBytes); 
     final StringBuilder sb = new StringBuilder(170); 
     sb.append(toBase64(userBytes)); 
     sb.append(SEPARATOR); 
     sb.append(toBase64(hash)); 
     return sb.toString(); 
    } 

Ecco un esempio di decodificare un token per assicurare che non è stato manomesso:

public User parseUserFromToken(String token) { 
    final String[] parts = token.split(SEPARATOR_SPLITTER); 
    if (parts.length == 2 && parts[0].length() > 0 && parts[1].length() > 0) { 
     try { 
      final byte[] userBytes = fromBase64(parts[0]); 
      final byte[] hash = fromBase64(parts[1]); 

      boolean validHash = Arrays.equals(createHmac(userBytes), hash); 
      if (validHash) { 
       final User user = fromJSON(userBytes); 
       if (new Date().getTime() < user.getExpires()) { 
        return user; 
       } 
      } 
     } catch (IllegalArgumentException e) { 
      //log tampering attempt here 
     } 
    } 
    return null; 
} 

Ecco un articolo con un esempio più completo: Stateless Authentication

Problemi correlati