2015-03-18 20 views
18

Desidero utilizzare metodi e risorse dal codice di un sito Web sviluppato in PHPFox.Come implementare l'autenticazione basata su token in modo sicuro per accedere alle risorse del sito Web (ovvero funzioni e dati) sviluppate in PHPFox?

Fondamentalmente, riceverò la richiesta da iPhone/Android, riceverò la richiesta e passerò alla rispettiva funzione dal codice PHPFox, prendo la risposta da quella funzione e la restituisco al dispositivo.

Per questo scopo ho sviluppato API REST utilizzando Struttura sottile.

Ma il principale ostacolo che sto affrontando attualmente è l'accesso alle risorse (cioè funzioni e dati) del sito Web PHPFox.

Non riesco a capire come devo autenticare l'utente utilizzando 'Autenticazione basata su token' per accedere alle risorse del sito Web.

Se qualcuno potesse guidarmi nella giusta direzione con qualche utile esempio di lavoro sarebbe davvero utile per me.

N.B. : L'implementazione proposta di 'Autenticazione basata su token' dovrebbe essere molto sicura e veloce nella velocità. La sicurezza non dovrebbe essere compromessa in alcun modo.

Di seguito è riportato il codice che ho provato per conto mio ma non so se è giusto o sbagliato. Il mio approccio è corretto o sbagliato. Per favore qualcuno lo analizzi e fammi sapere il tuo feedback su di esso.

Per creare un token uso questa funzione che prende come parametri, i dati dell'utente

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

Quindi, un utente può sola autenticazione se stesso e ricevere una matrice che contiene un token (genericPart + i suoi dati, codificati), e hisData non codificato:

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

Quindi l'utente mi può mandare il suo i suoi dati non-codificati segnalino + al fine di verificare:

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 

Ho ragione?

Grazie.

risposta

61

In primo luogo è necessario comprendere cos'è l'autenticazione basata su token. Potrebbe essere spiegato come di seguito.

Il concetto generale dietro un sistema di autenticazione basata su token è semplice. Consentire agli utenti di immettere il nome utente e la password per ottenere un token che consenta loro di recuperare una risorsa specifica - senza utilizzare nome utente e password. Una volta ottenuto il token , l'utente può offrire il token, che offre accesso a una risorsa specifica per un periodo di tempo, al sito remoto.

Read more

Vediamo ora quali sono i passi di attuazione nel vostro servizio web REST.

verrà utilizzato il seguente flusso di controllo:

  • L'utente fornisce un nome utente e password nel form di login e fa clic su Accedi.
  • Dopo aver effettuato una richiesta, convalidare l'utente sul back-end effettuando una query nel database. Se la richiesta è valida, creare un token tramite utilizzando le informazioni utente recuperate dal database e quindi restituire tali informazioni nell'intestazione della risposta in modo da poter memorizzare il browser del token nella memoria locale.
  • Fornire informazioni sui token in ogni intestazione di richiesta per accedere agli endpoint limitati nell'applicazione.
  • Se il token recuperato dalle informazioni dell'intestazione della richiesta è valido, consentire all'utente di accedere al punto finale specificato e rispondere con XML JSON o .

vedere l'immagine sotto per il flusso di controllo

enter image description here

Ci si potrebbe chiedere che cosa è un JWT

JWT sta per JSON Web Token ed è un formato di token utilizzato nelle intestazioni di autorizzazione . Questo token consente di progettare la comunicazione tra due sistemi in modo sicuro. Poniamo la frase JWT come "portatore token" ai fini di questo tutorial. Un token al portatore consiste di tre parti: intestazione, payload e firma.

  • L'intestazione è la parte del token che mantiene il tipo di token e il metodo di crittografia, anch'esso crittografato con base-64.
  • Il carico utile include le informazioni. È possibile inserire qualsiasi tipo di dati come informazioni utente, informazioni sul prodotto e così via, i quali sono tutti archiviati con la crittografia base-64 .
  • La firma è composta da combinazioni di intestazione, payload e chiave segreta. La chiave segreta deve essere conservata in modo sicuro sul lato server. È possibile vedere lo schema JWT e un token di esempio di seguito;

enter image description here

Non è necessario implementare il generatore di token al portatore non è possibile utilizzare php-jwt.

Spero che quanto sopra spieghi la tua confusione. se trovi problemi nell'implementazione dell'autenticazione basata su token, fammelo sapere. Vi posso aiutare.

+0

Prima di tutto grazie per aver mostrato interesse per il mio problema e per farmi capire cosa sia veramente "Autenticazione basata su token". Ma puoi per favore fornirmi l'esempio funzionante di php-jwt da zero in modo che io possa replicarlo nel mio sistema. Il codice dovrebbe includere tutto, dalla creazione della tabella del database, alla connettività tra PHP e MySQL, quindi alla creazione di token di sicurezza, alla verifica della validità del token di sicurezza per l'utente loggato corrente, ecc. Un'altra cosa potrebbe esserci più di un registro degli utenti in un momento e per ogni utente questa "autenticazione basata su token" dovrebbe funzionare. TY. – user2839497

+0

Si prega di dare un'occhiata alla fine del mio corpo di domanda. Ho provato un codice. Puoi controllare se è corretto o meno. Sto facendo le cose corrette o no? – user2839497

+1

C'è spazio per miglioramenti ma va tutto bene. Quello che devi fare è usare php-jwt per generare token e validazione. Starò molto meglio Ma va bene anche questo. – Techie

Problemi correlati