php - segura - json web token java
¿Cómo implementar la ''autenticación basada en token'' de forma segura para acceder a los recursos del sitio web(es decir, funciones y datos) que se desarrollan en PHPFox? (1)
Primero debes entender qué es la autenticación basada en token. Podría explicarse a continuación.
El concepto general detrás de un sistema de autenticación basado en token es simple. Permita que los usuarios ingresen su nombre de usuario y contraseña para obtener un token que les permita obtener un recurso específico, sin usar su nombre de usuario y contraseña. Una vez que se ha obtenido su token, el usuario puede ofrecer el token (que ofrece acceso a un recurso específico durante un período de tiempo) al sitio remoto.
Ahora veamos cuáles son los pasos para implementarlo en su servicio web REST.
Utilizará el siguiente flujo de control:
- El usuario proporciona un nombre de usuario y una contraseña en el formulario de inicio de sesión y hace clic en Iniciar sesión.
- Después de realizar una solicitud, valide al usuario en el backend consultando en la base de datos. Si la solicitud es válida, cree un token utilizando la información de usuario obtenida de la base de datos y luego devuelva esa información en el encabezado de respuesta para que podamos almacenar el navegador de token en el almacenamiento local.
- Proporcione información de token en cada encabezado de solicitud para acceder a puntos finales restringidos en la aplicación.
- Si el token obtenido de la información del encabezado de la solicitud es válido, permita que el usuario acceda al punto final especificado y responda con JSON o XML.
Vea la imagen de abajo para el flujo de control.
Quizás te preguntes qué es un JWT
JWT significa JSON Web Token y es un formato de token utilizado en los encabezados de autorización. Este token le ayuda a diseñar la comunicación entre dos sistemas de forma segura. Vamos a reformular JWT como el "token de portador" para los fines de este tutorial. Un token de portador consta de tres partes: encabezado, carga útil y firma.
- El encabezado es la parte del token que mantiene el tipo de token y el método de cifrado, codificado en base64.
- La carga útil incluye la información. Puede poner cualquier tipo de datos, como información del usuario, información del producto, etc., todos los cuales también se almacenan en codificación base64.
- La firma consiste en combinaciones de encabezado, carga útil y clave secreta. La clave secreta debe mantenerse de forma segura en el lado del servidor. Puede ver el esquema JWT y un token de ejemplo a continuación;
No es necesario implementar el generador de token de portador ya que puede usar php-jwt .
Espero que lo anterior explique su confusión. Si encuentra algún problema al implementar la autenticación basada en token, hágamelo saber. Puedo ayudarle.
Quiero usar métodos y recursos del código de un sitio web que se desarrolla en PHPFox .
Básicamente, recibiré una solicitud de iPhone/Android
, obtendré la solicitud y la pasaré a la función correspondiente desde el código PHPFox, tomaré la respuesta de esa función y la devolveré al dispositivo.
Para este propósito he desarrollado API REST utilizando el marco Slim .
Pero el principal bloqueador al que me enfrento actualmente es el acceso a los recursos (es decir, funciones y datos) del sitio web de PHPFox.
No entiendo cómo debo autenticar al usuario usando ''Autenticación basada en token'' para acceder a los recursos del sitio web.
Si alguien pudiera guiarme en la dirección correcta con algún ejemplo útil de trabajo, sería muy útil para mí.
NB: La implementación propuesta de ''Autenticación basada en token'' debería ser muy segura y rápida en velocidad. La seguridad no debe ser comprometida de ninguna manera.
A continuación se muestra el código que probé por mi cuenta pero no sé si está bien o mal. Es mi enfoque correcto o incorrecto Por favor, que alguien lo analice y me haga saber sus comentarios al respecto.
Para crear un token, uso esta función que toma como parámetros, los datos del usuario.
define(''SECRET_KEY'', "fakesecretkey");
function createToken($data)
{
/* Create a part of token using secretKey and other stuff */
$tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"]; // It can be ''stronger'' of course
/* Encoding token */
$token = hash(''sha256'', $tokenGeneric.$data);
return array(''token'' => $token, ''userData'' => $data);
}
Por lo tanto, un usuario puede autenticarse y recibir una matriz que contiene un token (genericPart + sus datos, codificados) y hisData no codificados:
function auth($login, $password)
{
// we check user. For instance, it''s ok, and we get his ID and his role.
$userID = 1;
$userRole = "admin";
// Concatenating data with TIME
$data = time()."_".$userID."-".$userRole;
$token = createToken($data);
echo json_encode($token);
}
Luego, el usuario puede enviarme su token + sus datos no codificados para verificar:
define(''VALIDITY_TIME'', 3600);
function checkToken($receivedToken, $receivedData)
{
/* Recreate the generic part of token using secretKey and other stuff */
$tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"];
// We create a token which should match
$token = hash(''sha256'', $tokenGeneric.$receivedData);
// We check if token is ok !
if ($receivedToken != $token)
{
echo ''wrong Token !'';
return false;
}
list($tokenDate, $userData) = explode("_", $receivedData);
// here we compare tokenDate with current time using VALIDITY_TIME to check if the token is expired
// if token expired we return false
// otherwise it''s ok and we return a new token
return createToken(time()."#".$userData);
}
$check = checkToken($_GET[''token''], $_GET[''data'']);
if ($check !== false)
echo json_encode(array("secureData" => "Oo")); // And we add the new token for the next request
Estoy en lo cierto
Gracias.