2012-07-12 32 views
8

voy a poner en práctica OAuth 2.0 y API REST con élOAuth 2.0. No hay sesión? (Sin estado)

conceder permisos por diferentes usuarios y también a escala bien.

Para escalar bien, sin estado es más fácil porque no hay

NO archivo, base de datos de la sesión, con base en memoria con él.


A continuación se muestra cómo entiendo OAuth 2.

  1. OAuth Servidor dar un token de acceso a un usuario.
  2. El token de acceso del usuario se almacena en una cookie.
  3. Cuando el usuario accede a la API REST, el usuario lo envía con el token de acceso.
  4. El servidor recibe la solicitud con el token de acceso.
  5. Servidor para averiguar si el token de acceso es válido y el usuario tiene permiso para hacer la solicitud.
  6. Hacer o rechazar en función del privilegio del usuario.

por lo que no tiene que preocuparse de almacenamiento de sesión. ¿Derecha?

+0

Eche un vistazo a esta biblioteca https://pypi.python.org/pypi/python-oauth2 – DarkAnthey

Respuesta

8

Lo que está describiendo aquí, es el OAuth 2 Implicit Grant flow. OAuth 2 también incluye otros tres flujos, pero como parece que el propietario de su recurso (el usuario) está iniciando solicitudes utilizando el lado del navegador Javascript (estaba hablando de cookies), este es el flujo que debe tomar.

En el lado del cliente, OAuth sólo le requiere para almacenar el access_token para acceder a Recursos protegidas (y una refresh_token si vas para un vencimiento access_token).

+2

Para comprobar el token de acceso tendrá que tener un db lado del servidor.;) –

+0

Claro, en el lado del servidor debe saber por cada token de acceso en nombre del usuario que se emitió y qué ámbitos se otorgaron. Opcionalmente, también podría recordar y verificar el 'redirect_uri' permitido para una mejor seguridad. Si eso es lo que quería decir con "almacenamiento de sesiones", entendí mal la pregunta;) –

+1

Olvídese de la parte sobre el 'redirect_uri', está mal. Debería irme a la cama ;) –

4

Una innovación más reciente es JWT - JSON Web Token.

Aquí hay un enlace a la especificación: JWT - JSON Web Token

JWT es un método de uso de fichas con algoritmo hash utilizando un método de hash como HMAC que significa un mensaje basado en hash código de autenticación. Debido a que el token es hash usando una clave secreta, el servidor puede determinar si el token ha sido alterado.

Aquí es un procedimiento de ejemplo para crear un contador hash para 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(); 
    } 

Aquí es un ejemplo de decodificación de un contador para asegurar que no fue manipulado:

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; 
} 

Aquí se presenta una artículo con un ejemplo más completo: Stateless Authentication

Cuestiones relacionadas