web-dev-qa-db-fra.com

Comment implémenter «l'authentification par jeton» en toute sécurité pour accéder aux ressources du site Web (c'est-à-dire aux fonctions et aux données) développées dans PHPFox?

Je veux utiliser des méthodes et des ressources à partir du code d'un site Web développé en PHPFox.

En gros, je vais recevoir une demande de iPhone/Android, Je vais chercher la requête et la passer à la fonction respective à partir du code PHPFox, prendre la réponse de cette fonction et la renvoyer à l'appareil.

À cette fin, j'ai développé REST API utilisant framework Slim.

Mais le principal obstacle auquel je suis confronté actuellement est l’accès aux ressources (c’est-à-dire aux fonctions et aux données) du site Web PHPFox.

Je ne comprends pas comment authentifier l'utilisateur à l'aide de 'Authentification basée sur les jetons' afin d'accéder aux ressources du site Web.

Si quelqu'un pouvait me guider dans la bonne direction avec un exemple de travail utile, ce serait vraiment utile pour moi.

N.B. : La mise en œuvre proposée de "l'authentification par jeton" devrait être très sécurisée et rapide. La sécurité ne doit en aucun cas être compromise.

Voici le code que j'ai essayé moi-même, mais je ne sais pas s'il est bon ou faux. Est-ce que mon approche est correcte ou incorrecte? S'il vous plaît, faites-le analyser par quelqu'un et faites-moi part de vos commentaires.

Pour créer un jeton, j’utilise cette fonction qui prend comme paramètres les données de l’utilisateur.

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

Ainsi, un utilisateur peut s'authentifier et recevoir un tableau contenant un jeton (genericPart + ses données, codé), et ses données non codées:

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

Ensuite, l'utilisateur peut m'envoyer son token + ses données non encodées afin de vérifier:

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

Ai-je raison?

Merci.

24
PHPFan

D'abord, vous devez comprendre ce qu'est l'authentification par jeton. Cela pourrait être expliqué comme ci-dessous.

Le concept général derrière un système d'authentification par jeton est simple. Autorisez les utilisateurs à entrer leur nom d'utilisateur et leur mot de passe afin d'obtenir un jeton leur permettant de récupérer une ressource spécifique - sans utiliser leur nom d'utilisateur ni leur mot de passe. Une fois que leur jeton a été obtenu, l'utilisateur peut proposer le jeton - qui offre l'accès à une ressource spécifique pendant une période donnée - au site distant.

en savoir plus

Voyons maintenant quelles sont les étapes de sa mise en œuvre dans votre = REST service Web.

Il utilisera le flux de contrôle suivant:

  • L'utilisateur fournit un nom d'utilisateur et un mot de passe dans le formulaire de connexion et clique sur Connexion.
  • Une fois la demande effectuée, validez l'utilisateur sur le serveur en effectuant une interrogation dans la base de données. Si la demande est valide, créez un jeton en utilisant les informations utilisateur extraites de la base de données, puis renvoyez-les dans l'en-tête de la réponse afin que nous puissions stocker le navigateur de jetons dans la mémoire de stockage locale.
  • Fournissez des informations de jeton dans chaque en-tête de demande pour accéder aux points de terminaison restreints de l'application.
  • Si le jeton extrait des informations d'en-tête de demande est valide, laissez l'utilisateur accéder au noeud final spécifié et répondez avec JSON ou XML.

Voir l'image ci-dessous pour le flux de contrôle

enter image description here

Vous vous demandez peut-être ce qu'est un JWT

JWT signifie JSON Web Token et est un format de jeton utilisé dans les en-têtes d'autorisation. Ce jeton vous aide à concevoir la communication entre deux systèmes de manière sécurisée. Reformulons JWT en tant que "jeton porteur" aux fins de ce didacticiel. Un jeton porteur se compose de trois parties: en-tête, charge utile et signature.

  • L'en-tête est la partie du jeton qui conserve le type de jeton et la méthode de cryptage, codés en base64.
  • La charge inclut l'information. Vous pouvez mettre n'importe quel type de données, telles que les informations sur l'utilisateur, les informations sur le produit, etc., toutes ces informations étant également stockées en encodage base64.
  • La signature consiste en une combinaison de l'en-tête, de la charge utile et de la clé secrète. La clé secrète doit être conservée en toute sécurité côté serveur. Vous pouvez voir le schéma JWT et un exemple de jeton ci-dessous;

enter image description here

Vous n'avez pas besoin d'implémenter le générateur de jeton porteur car vous pouvez utiliser php-jwt .

J'espère que ce qui précède explique votre confusion. Si vous rencontrez des problèmes lors de la mise en œuvre de l'authentification par jeton, faites-le moi savoir. Je peux vous aider.

77
Techie