Heim  >  Artikel  >  PHP-Framework  >  Verwendung der JWT-Validierung in ThinkPHP6

Verwendung der JWT-Validierung in ThinkPHP6

PHPz
PHPzOriginal
2023-06-20 23:36:093160Durchsuche

Mit der Entwicklung des Internets ist die Zahl der Nutzer von Webanwendungen sukzessive gestiegen und Sicherheitsaspekte sind immer wichtiger geworden. Die Authentifizierung ist ein wichtiger Bestandteil der Sicherheit von Webanwendungen, da nur authentifizierte Benutzer auf Ressourcen zugreifen können, für die Berechtigungen erforderlich sind.

JSON Web Token (JWT) ist ein leichtes, eigenständiges Authentifizierungstoken, das eine hervorragende Möglichkeit zur sicheren Übertragung von Informationen zwischen Webanwendungen bietet. Das JWT-Authentifizierungsschema eignet sich für verteilte Systeme und Single-Page-Anwendungen.

ThinkPHP ist ein beliebtes PHP-Framework, das viele Tools zum Entwickeln sicherer Webanwendungen bereitstellt. In diesem Artikel erfahren Sie, wie Sie JWT zur Authentifizierung in ThinkPHP6 verwenden, um die Sicherheit Ihrer Anwendung zu erhöhen.

Entwicklungsumgebung und Abhängigkeiten

Bevor wir beginnen, müssen wir sicherstellen, dass die Entwicklungsumgebung korrekt eingerichtet wurde. Im Folgenden sind die in diesem Artikel verwendeten Umgebungen und Abhängigkeiten aufgeführt. Bitte ändern Sie es entsprechend Ihren Bedürfnissen.

  • PHP 7.2 oder höher
  • ThinkPHP 6.0.0 oder höher
  • Firebase JWT PHP-Bibliothek

Schritt 1: Firebase JWT PHP-Bibliothek installieren

Die Installation der Firebase JWT PHP-Bibliothek besteht darin, im ersten Schritt das JWT-Authentifizierungsschema zu verwenden. Diese Bibliothek hilft uns beim Erstellen, Signieren und Überprüfen von JWTs.

Wir können Composer verwenden, um die Firebase JWT PHP-Bibliothek zu installieren. Geben Sie den folgenden Befehl in die Befehlszeile ein:

composer require firebase/php-jwt

Schritt 2: Token-Klasse erstellen

Um die Verwaltung und Verwendung von JWT zu erleichtern, erstellen wir eine Klasse mit dem Namen Token, um verschiedene Aspekte der JWT-Überprüfung abzuwickeln. Diese Klasse umfasst Funktionen wie das Erstellen von Token, das Überprüfen von Token und das Abrufen von Token-Informationen.

Erstellen Sie die Datei Token.php im Verzeichnis app/common und fügen Sie den folgenden Code hinzu:

<?php

namespace appcommon;

use FirebaseJWTJWT;

class Token
{
    private static $key = 'your_secret_key';
    private static $alg = 'HS256';

    public static function createToken($data, $expiration = 3600)
    {
        $payload = [
            'iss' => 'localhost',
            'sub' => 'token',
            'iat' => time(),
            'exp' => time() + $expiration,
            'data' => $data
        ];

        return JWT::encode($payload, self::$key, self::$alg);
    }

    public static function decodeToken($token)
    {
        return JWT::decode($token, self::$key, [self::$alg]);
    }

    public static function getDataByToken($token)
    {
        $decoded = self::decodeToken($token);

        if (isset($decoded->data)) {
            return $decoded->data;
        } else {
            return false;
        }
    }

    public static function verifyToken($token)
    {
        $result = false;
        try {
            $decoded = self::decodeToken($token);
            $result = true;
        } catch (Exception $e) {
            // Invalid token
        }
        return $result;
    }
}

Im Code verwenden wir encode() in der Bibliothek FirebaseJWTJWT und die Methode decode() zum Erstellen und Parsen von JWT. $key ist der Schlüssel, den wir zum Signieren des JWT verwenden, und $alg ist der Algorithmus, den wir auswählen. In der Methode createToken() verwenden wir die vier Schlüssel (iss, iat, exp und sub) aus der JWT-Nutzlast und fügen benutzerdefinierte Daten hinzu. Der Parameter $expiration gibt die Ablaufzeit des JWT an. Daher kann JWT nur innerhalb des Gültigkeitszeitraums verwendet werden. FirebaseJWTJWT库中的encode()decode()方法来创建和解析 JWT。$key是我们用于签名 JWT 的密钥,$alg是我们选择的算法。 在createToken()方法中,我们使用 JWT 负载中的四个键(iss,iat,exp和sub)并添加自定义data$expiration参数指定 JWT 的过期时间。因此,JWT 只能在有效期内使用。

步骤3:在中间件中验证令牌

现在我们已经创建了 Token 类以处理 JWT 相关的工作,我们需要在中间件中验证用户 JWT。使用中间件可以方便地在应用程序的控制器代码中拦截和设置响应,并且可以将代码分离到不同的类中以便更好地管理和修改。

在 app/middleware 目录下创建Jwt.php文件,并添加以下代码:

<?php

namespace appmiddleware;

use appcommonToken;
use thinkexceptionHttpResponseException;
use thinkResponse;

class Jwt
{
    public function handle($request, Closure $next)
    {
        if (!$request->header('Authorization')) {
            return json(['code' => 401, 'msg' => 'Unauthorized']);
        }

        $header = $request->header('Authorization');
        $token = substr($header, 7);
        if (Token::verifyToken($token)) {
            $request->data = Token::getDataByToken($token);
            return $next($request);
        } else {
            return json(['code' => 401, 'msg' => 'Unauthorized']);
        }
    }
}

在此中间件中,我们使用 Token 类中的verifyToken()方法来验证 JWT。 此方法将返回 true 或 false,表示令牌是否有效。 如果有效,我们将使用getDataByToken()方法来获取 JWT 的数据部分并将其存储在$request->data中。 这样,控制器就可以使用此数据。

步骤4:设置路由

现在,我们已经创建了中间件,我们需要将其应用到适当的路由上。

假设我们要保护/api/user的路由,我们需要在routepi.php文件中按如下方式设置路由:

use appmiddlewareJwt;

Route::group('api', function() {
  Route::get('user', 'UserController@getUserInfo')->middleware(Jwt::class);
});

请注意,在此路由中,我们将Jwt中间件作为参数传递给middleware()方法。这是UserController中的getUserInfo()方法的示例代码。

<?php

namespace appcontroller;

use appcommonToken;

class UserController
{
    public function getUserInfo()
    {
        $data = request()->data;
        ...
    }
    ...
}

在控制器中,您可以通过调用$request->data

Schritt 3: Überprüfen Sie das Token in der Middleware.

Da wir nun die Token-Klasse erstellt haben, um die JWT-bezogene Arbeit zu erledigen, müssen wir das Benutzer-JWT in der Middleware überprüfen. Durch die Verwendung von Middleware ist es einfach, Antworten im Controller-Code Ihrer Anwendung abzufangen und festzulegen, und Sie können den Code zur besseren Verwaltung und Änderung in verschiedene Klassen unterteilen.

Erstellen Sie die Datei Jwt.php im Verzeichnis app/middleware und fügen Sie den folgenden Code hinzu:

rrreee

In dieser Middleware verwenden wir die Methode verifyToken() in der Token-Klasse, um das JWT zu überprüfen. Diese Methode gibt „true“ oder „false“ zurück und gibt an, ob das Token gültig ist. Wenn gültig, verwenden wir die Methode getDataByToken(), um den Datenteil des JWT abzurufen und ihn in $request->data zu speichern. Diese Daten stehen dann dem Verantwortlichen zur Verfügung.

Schritt 4: Routen einrichten🎜🎜Da wir nun die Middleware erstellt haben, müssen wir sie auf die entsprechenden Routen anwenden. 🎜🎜Angenommen, wir möchten die Route von /api/user schützen, müssen wir die Route in der Datei route pi.php wie folgt festlegen: 🎜rrreee🎜Bitte beachten In dieser Route übergeben wir die Jwt-Middleware als Parameter an die middleware()-Methode. Dies ist der Beispielcode für die Methode getUserInfo() in UserController. 🎜rrreee🎜Im Controller können Sie auf die im authentifizierten JWT gespeicherten Daten zugreifen, indem Sie $request->data aufrufen. 🎜🎜Fazit🎜🎜Die JWT-Authentifizierungsmethode kann Ihre Webanwendung sicherer und zuverlässiger machen. In diesem Artikel haben wir beschrieben, wie Sie die Firebase JWT PHP-Bibliothek zum Erstellen und Validieren von JWTs in ThinkPHP6 verwenden. 🎜🎜Wir haben eine Klasse namens Token erstellt, die für die Verarbeitung von JWT-bezogenen Arbeiten verwendet wird, und eine Middleware zum Validieren von JWT und Festlegen von Daten hinzugefügt. Schließlich richten wir den Routing- und Controller-Code ein, der diese Middleware verwendet, um auf die im JWT gespeicherten Daten zuzugreifen. 🎜🎜Der Hauptzweck der Einführung der JWT-Authentifizierung besteht darin, sicherzustellen, dass Ressourcen in der Anwendung nur von authentifizierten Benutzern verwendet werden können. Ich hoffe, dieser Artikel hat Ihnen geholfen zu verstehen, wie Sie Ihre Anwendung mithilfe der JWT-Authentifizierung sichern können! 🎜

Das obige ist der detaillierte Inhalt vonVerwendung der JWT-Validierung in ThinkPHP6. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn