Implementar token’s en web services con php y json

publicado por: Anonymous

He creado varios web services para consultar datos de mi base desde una aplicación en android, los web services ya funcionan, me devuelven la información y ya se muestra en la aplicación, pero quiero implementar token’s como seguridad en mis consultas, pero no entiendo como puedo implementar los token’s, este es un web services que uso:

<?PHP
$hostname_localhost = "localhost";
$database_localhost = "mgrex";
$username_localhost = "root";
$password_localhost = "";

$json = array();

if(isset($_GET["empresa"]) && isset($_GET["rol"])){
    $empresa = $_GET["empresa"];
    $rol = $_GET["rol"];

    $conexion = mysqli_connect($hostname_localhost,$username_localhost,$password_localhost,$database_localhost);
    mysqli_set_charset($conexion, "utf8");
    $consulta = "select * from inicio WHERE empresa = '{$empresa}' AND rol = '{$rol}'";
    $resultado = mysqli_query($conexion, $consulta);

    while($registro=mysqli_fetch_array($resultado)){
        $json['inicio'][]=$registro;    
    }

}else{
            $resultar["tituloNoticia"]='No registrado';
            $resultar["subtituloNoticia"]='No registrado';
            $resultar["imagenNoticia"]='No registrado';
            $resultar["descripcionNoticia"]='No registrado';
            $resultar["empresa"]='No registrado';
            $resultar["rol"]='No registrado';
            $json['inicio'][]=$resultar;

}
    mysqli_close($conexion);
    echo json_encode($json);

?> 

he estado revisando ejemplos en internet como el siguiente:

require_once 'vendor/autoload.php';

use FirebaseJWTJWT;

$time = time();
$key = 'my_secret_key';

$token = array(
    'iat' => $time, // Tiempo que inició el token
    'exp' => $time + (60*60), // Tiempo que expirará el token (+1 hora)
    'data' => [ // información del usuario
        'id' => 1,
        'name' => 'Eduardo'
    ]
);

$jwt = JWT::encode($token, $key);

$data = JWT::decode($jwt, $key, array('HS256'));

var_dump($data);

No entiendo como puedo usar este ejemplo en mi web service.

solución

Para implementar Json Web Tokens (JWT). Lo primero que tienes que tener es una tabla de usuarios.

La primera parte se hace un login común y corriente. Este parte te va a responder con el un json.

La peticion debe contener lo siguiente:

  • Usuario (id del usuario key)
  • Contraseña (secret)

Debes de validar estos datos en tu base de datos, si estos existen debes de crear un token con los métodos de jwt.

es esto que tu tienes.

$token = array(
    'iat' => $time, // Tiempo que inició el token
    'exp' => $time + (60*60), // Tiempo que expirará el token (+1 hora)
    'data' => [ // información del usuario
       'id' => 1, // key 
       'name' => 'Eduardo' // secret
  ]
);
$jwt = JWT::encode($token, $key);

La variable jwt se convertirá en un json el cual debes de responder con algo así.

return $jwt;

Ahora cada que hagas peticiones a tu API deberás mandar en los headers este token ejemplo:

axios.post(
  url, 
  {
     _token: Token_jwt
  }
).then(
   res=>{ 
   }
);

Por ultimo, todas las peticiones que llegan a tu api deben de contener el token y este debe de ser valido. por lo tanto debes de interpretarlo.

<?PHP


    // obviamente tambien tienes que importar la libreria de jwt
    $key = 'Tu clave de la aplicacion';
    if(empty($_POST['_token'])){
      $data = (objetc)JWT::decode($jwt, $key, array('HS256'));
      if($data->exp > time()){
        return abort(401);
      }
    }else{
      return abort(401);
    }




        $hostname_localhost = "localhost";
        $database_localhost = "mgrex";
        $username_localhost = "root";
        $password_localhost = "";

        $json = array();

        if(isset($_GET["empresa"]) && isset($_GET["rol"])){
            $empresa = $_GET["empresa"];
            $rol = $_GET["rol"];

            $conexion = mysqli_connect($hostname_localhost,$username_localhost,$password_localhost,$database_localhost);
            mysqli_set_charset($conexion, "utf8");
            $consulta = "select * from inicio WHERE empresa = '{$empresa}' AND rol = '{$rol}'";
            $resultado = mysqli_query($conexion, $consulta);

            while($registro=mysqli_fetch_array($resultado)){
                $json['inicio'][]=$registro;    
            }

        }else{
                    $resultar["tituloNoticia"]='No registrado';
                    $resultar["subtituloNoticia"]='No registrado';
                    $resultar["imagenNoticia"]='No registrado';
                    $resultar["descripcionNoticia"]='No registrado';
                    $resultar["empresa"]='No registrado';
                    $resultar["rol"]='No registrado';
                    $json['inicio'][]=$resultar;

        }
            mysqli_close($conexion);
            echo json_encode($json);

        ?> 
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *