¿Cómo implementar la 'Autenticación basada en tokens' de forma segura para acceder a los recursos del sitio web (es decir, funciones y datos) que se desarrolla en PHPFox?

Quiero usar métodos y recursos del código de un sitio web que se desarrolla enPHPFox.

Básicamente, recibiré una solicitud deiPhone/Android, Recibiré la solicitud y la pasaré a la función correspondiente del código PHPFox, tomaré la respuesta de esa función y la devolveré al dispositivo.

Para este propósito, he desarrollado API REST usandoMarco delgado.

Pero el principal bloqueador que estoy enfrentando actualmente es acceder a los recursos (es decir, funciones y datos) del sitio web PHPFox.

No entiendo cómo debo autenticar al usuario usando'Autenticación basada en tokens' para acceder a los recursos del sitio web.

Si alguien pudiera guiarme en la dirección correcta con algún ejemplo de trabajo útil, sería realmente útil para mí.

nótese bien : La implementación propuesta de 'Autenticación basada en token' debe ser muy segura y rápida. La seguridad no debe verse comprometida de ninguna manera.

El siguiente es el código que probé por mi cuenta pero no sé si es correcto o incorrecto. ¿Mi enfoque es correcto o incorrecto? Por favor, alguien analice y hágame 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 a sí mismo y recibir una matriz que contiene un token (genericoParte + sus datos, codificados), y sus datos 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 sin codificar 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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta