2012-03-01 21 views
10

Tengo un servicio REST en mi servidor web, escrito en php. Me preguntaba cuál sería la mejor autenticación (además de la autenticación básica de acceso http). He lanzado auth basado en token, y me gustaría preguntar si alguien podría explicar los pasos principales.autenticación basada en token en php

  • En un GET: ¿Es visible el token? (¿no es inseguro?)
  • ¿Cómo puedo hacer que el token solo sea válido por un tiempo específico?
  • ...

Cliente: Android/Browser; Servidor: Apache, PHP5

+0

hacen ámbito tan oculto a través de método POST –

+6

lo que sería el sentido de un servicio Restfull si sólo pudiera utilizar el poste;) he implementado PUT, POST, GET, DELETE, de Por supuesto, hay una funcionalidad diferente para cada método http –

+0

para ocultar la visibilidad de su token –

Respuesta

12

Se puede hacer de cualquier manera, y los valores en una solicitud GET no son realmente más visibles que los valores en una solicitud POST. Si alguien puede "ver" (es decir, interceptar) la solicitud, puede ver todo lo que está enviando. Al final, una solicitud HTTP es simplemente un grupo de encabezados HTTP posiblemente seguidos por un cuerpo. La URL se envía en la primera línea GET /foo/bar HTTP/1.1, otros valores solo se envían en líneas siguientes.

Depende de usted dónde espera que se envíe su token de autenticación. Puede necesita para ser un parámetro de consulta que se anexa a cada petición:

GET /foo/bar?user=123456&token=abcde... 

Para utilizar realmente el protocolo HTTP como se pretende, sin embargo, se debe utilizar el encabezado Authorization HTTP:

Authorization: MyScheme 123456:abcde... 

El contenido de este encabezado es totalmente de usted. Por lo general, especifica un método de autorización como Basic, seguido de lo que desee para la autenticación. Esto puede ser simplemente el nombre de usuario y la contraseña, un hash de ellos, un token opaco que el cliente ha obtenido en algún momento o cualquier otra cosa realmente.

Recomendaría un sistema de token o un sistema de firma de solicitudes, siendo este último muy preferido. En un sistema de firma de solicitudes, el cliente debe obtener un token de usted. A continuación, envía un hash de este token y ciertas características de la solicitud para autenticar la solicitud, p. sha1(Token + Timestamp + Request URL + Request Body). Su servidor puede validar esto sin que el cliente tenga que enviar el token en texto sin formato en cada solicitud.

¿Cómo puedo hacer que el token solo sea válido por un tiempo específico?

Guarda el token del lado del servidor con una marca de tiempo de caducidad y lo compara.

+0

Gracias, creo que ahora tengo la idea básica. Solo algunas preguntas más al respecto: 1. Cuando el cliente obtiene el token, este será un "archivo json simple", por ejemplo, que contenga "TOKEN_A". 2. Si el cliente solo envía un hash, incluida la marca de tiempo, ¿cómo puedo verificar en el lado del servidor si el hash es válido? lazo sobre posibles hashs de las X ms? –

+3

1. Sí, lo que mejor se adapte a su modelo. Tal vez el usuario necesite registrarse en un sitio web y copiar y pegar un token desde allí. Tal vez lo haga a través de una API también, en cuyo caso una respuesta JSON está bien. 2. El encabezado 'Authorization' debe contener la identificación del usuario y el hash del token. La solicitud también debe contener la marca de tiempo, por ejemplo, en el encabezado 'Fecha', que es bastante estándar. El hash se basaría en ese encabezado literal de 'Fecha'. El servidor solo busca el token para el usuario, se asegura de que la fecha esté dentro de ± unos minutos de la hora actual y vuelve a crear el mismo hash. – deceze

+1

Así que la idea básica es: en lugar de enviar el token simple, le envío el hash y la información A, B, C. El servidor obtiene el token del UID, lo mezcla con la información A, B, C. y comprueba si los hash son iguales? - (+ el personal de validación de tiempo) - eso es bastante inteligente: D Muchas gracias –

2

Aquí hay un question sobre la autenticación basada en token. Creo que la autenticación basada en token más común actualmente es OAuth. Pero para responder a sus preguntas:

En un GET: ¿Es visible el token? (¿no es inseguro?)

Puede pasar sus tokens a través de encabezados HTTP para que no se vean tan fácilmente. OAuth allows this. Tenga en cuenta que los tokens aún son visibles, simplemente no están en los parámetros de consulta GET.

¿Cómo puedo hacer que el token solo sea válido por un tiempo específico?

Como controla (crea) los tokens, puede establecer fechas de caducidad para cada token. En cada solicitud de su API, solo debe verificar el almacenamiento de su token (por ejemplo, la base de datos) si el token dado sigue siendo válido. Si no es así, puede cancelar la solicitud (quizás devuelva un error HTTP 401).

+0

gracias, voy a echar un vistazo en OAuth. Creo que ahora tengo la idea básica :) –

+0

Tanto POST como GET son bastante inseguros. Para que sean seguros, necesita otra capa de criptografía en la parte superior, como SSL. –

1

Puede usar fire-base php JWT (JSON Web Token) para la autenticación basada en tokens.

1) Instalar php JWT mediante la ejecución de comandos compositor compositor requieren base de fuego/php-JWT

require_once('vendor/autoload.php'); 
    use \Firebase\JWT\JWT; 
    define('SECRET_KEY','Your-Secret-Key') // secret key can be a random string and keep in secret from anyone 
    define('ALGORITHM','HS512') 

Después que generan su ficha

$tokenId = base64_encode(mcrypt_create_iv(32)); 
       $issuedAt = time(); 
       $notBefore = $issuedAt + 10; //Adding 10 seconds 
       $expire  = $notBefore + 7200; // Adding 60 seconds 
       $serverName = 'http://localhost/php-json/'; /// set your domain name 


       /* 
       * Create the token as an array 
       */ 
       $data = [ 
        'iat' => $issuedAt,   // Issued at: time when the token was generated 
        'jti' => $tokenId,   // Json Token Id: an unique identifier for the token 
        'iss' => $serverName,  // Issuer 
        'nbf' => $notBefore,  // Not before 
        'exp' => $expire,   // Expire 
        'data' => [     // Data related to the logged user you can set your required data 
       'id' => "set your current logged user-id", // id from the users table 
       'name' => "logged user name", // name 
           ] 
       ]; 
       $secretKey = base64_decode(SECRET_KEY); 
       /// Here we will transform this array into JWT: 
       $jwt = JWT::encode(
         $data, //Data to be encoded in the JWT 
         $secretKey, // The signing key 
         ALGORITHM 
         ); 
      $unencodedArray = ['jwt' => $jwt]; 

proporcionar este testigo a su usuario "$ jwt ". En cada solicitud, el usuario necesita enviar un valor de token con cada solicitud para validar al usuario.

try { 
      $secretKey = base64_decode(SECRET_KEY); 
      $DecodedDataArray = JWT::decode($_REQUEST['tokVal'], $secretKey, array(ALGORITHM)); 

      echo "{'status' : 'success' ,'data':".json_encode($DecodedDataArray)." }";die(); 

      } catch (Exception $e) { 
      echo "{'status' : 'fail' ,'msg':'Unauthorized'}";die(); 
      } 

You can get step by step full configurations for php token based authentication

Cuestiones relacionadas