webentwicklung-frage-antwort-db.com.de

Wie kann die "Token-basierte Authentifizierung" sicher implementiert werden, um auf die in PHPFox entwickelten Ressourcen (d. H. Funktionen und Daten) der Website zuzugreifen?

Ich möchte Methoden und Ressourcen aus dem Code einer Website verwenden, die in PHPFox entwickelt wurde.

Grundsätzlich erhalte ich eine Anfrage von iPhone/Android, Ich erhalte die Anfrage und übergebe sie aus dem PHPFox-Code an die entsprechende Funktion, nehme die Antwort von dieser Funktion und sende sie zurück an das Gerät.

Zu diesem Zweck habe ich REST APIs mit Slim Framework entwickelt.

Der Hauptblocker, dem ich derzeit gegenüberstehe, ist der Zugriff auf die Ressourcen (d. H. Funktionen und Daten) der PHPFox-Website.

Ich verstehe nicht, wie ich den Benutzer mit 'Token Based Authentication' authentifizieren soll, um auf die Ressourcen der Website zuzugreifen.

Wenn jemand mich mit einem nützlichen Arbeitsbeispiel in die richtige Richtung leiten könnte, wäre es wirklich hilfreich für mich.

N.B. : Die vorgeschlagene Implementierung von "Token Based Authentication" sollte sehr sicher und schnell sein. Die Sicherheit sollte in keiner Weise beeinträchtigt werden.

Es folgt der Code, den ich selbst ausprobiert habe, aber ich weiß nicht, ob er richtig oder falsch ist. Ist mein Ansatz richtig oder falsch? Bitte analysiert es jemand und teilt mir euer Feedback dazu mit.

Zum Erstellen eines Tokens verwende ich diese Funktion, die die Daten des Benutzers als Parameter verwendet

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

So kann sich ein Benutzer authentifizieren und ein Array erhalten, das ein Token (genericPart + seine Daten, verschlüsselt) und seine Daten, die nicht verschlüsselt sind, enthält:

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

Dann kann der Benutzer mir sein Token + seine unverschlüsselten Daten senden, um Folgendes zu überprüfen:

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

Habe ich recht?

Vielen Dank.

24
PHPFan

1. Sie sollten verstehen, was tokenbasierte Authentifizierung ist. Es könnte wie folgt erklärt werden.

Das allgemeine Konzept eines tokenbasierten Authentifizierungssystems ist einfach. Ermöglichen Sie Benutzern, ihren Benutzernamen und ihr Kennwort einzugeben, um ein Token zu erhalten, mit dem sie eine bestimmte Ressource abrufen können - ohne ihren Benutzernamen und ihr Kennwort zu verwenden. Sobald das Token abgerufen wurde, kann der Benutzer dem Remote-Standort das Token anbieten, das für einen bestimmten Zeitraum Zugriff auf eine bestimmte Ressource bietet.

Weiterlesen

Lassen Sie uns nun sehen, wie Sie es in Ihrem REST Web-Service implementieren.

Dabei wird der folgende Steuerungsfluss verwendet:

  • Der Benutzer gibt einen Benutzernamen und ein Passwort in das Anmeldeformular ein und klickt auf Anmelden.
  • Nachdem eine Anfrage gestellt wurde, validieren Sie den Benutzer im Backend, indem Sie die Datenbank abfragen. Wenn die Anforderung gültig ist, erstellen Sie ein Token mithilfe der aus der Datenbank abgerufenen Benutzerinformationen und geben Sie diese Informationen im Antwortheader zurück, damit wir den Token-Browser im lokalen Speicher speichern können.
  • Geben Sie in jedem Anforderungsheader Token-Informationen für den Zugriff auf eingeschränkte Endpunkte in der Anwendung an.
  • Wenn das aus den Anforderungsheaderinformationen abgerufene Token gültig ist, kann der Benutzer auf den angegebenen Endpunkt zugreifen und mit JSON oder XML antworten.

Siehe das Bild unten für den Kontrollfluss

enter image description here

Sie fragen sich vielleicht, was ein JWT ist

JWT steht für JSON Web Token und ist ein Token-Format, das in Autorisierungs-Headern verwendet wird. Mit diesem Token können Sie die Kommunikation zwischen zwei Systemen auf sichere Weise gestalten. Lassen Sie uns JWT für die Zwecke dieses Tutorials als "Inhaber-Token" umformulieren. Ein Inhaber-Token besteht aus drei Teilen: Header, Nutzlast und Signatur.

  • Der Header ist der Teil des Tokens, der den in base64 codierten Tokentyp und die Verschlüsselungsmethode enthält.
  • Die Nutzlast enthält die Informationen. Sie können alle Arten von Daten wie Benutzerinformationen, Produktinformationen usw. eingeben, die ebenfalls in Base64-Codierung gespeichert sind.
  • Die Signatur besteht aus Kombinationen von Header, Nutzlast und geheimem Schlüssel. Der geheime Schlüssel muss auf der Serverseite sicher aufbewahrt werden. Unten sehen Sie das JWT-Schema und ein Beispieltoken.

enter image description here

Sie müssen den Bearer-Token-Generator nicht implementieren, da Sie php-jwt verwenden können.

Hoffe, das erklärt deine Verwirrung. Wenn Sie auf Probleme beim Implementieren der tokenbasierten Authentifizierung stoßen, lassen Sie es mich wissen. Ich kann Ihnen helfen.

77
Techie