Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Entwicklung: So verwenden Sie JWT zur Authentifizierung und Autorisierung

PHP-Entwicklung: So verwenden Sie JWT zur Authentifizierung und Autorisierung

王林
王林Original
2023-06-14 16:14:511865Durchsuche

In der modernen Webanwendungsentwicklung ist Sicherheit zu einem integralen Bestandteil geworden. Authentifizierung und Autorisierung sind in diesem Zusammenhang von entscheidender Bedeutung, da sie sicherstellen, dass nur autorisierte Benutzer auf geschützte Ressourcen zugreifen können. Es stehen zahlreiche Authentifizierungs- und Autorisierungsmechanismen zur Verfügung, von denen JWT (JSON Web Token) ein besonders beliebter Mechanismus ist, da er einfach, flexibel, skalierbar und sicher ist. In diesem Artikel erfahren Sie, wie Sie PHP und JWT zur Authentifizierung und Autorisierung verwenden.

Teil Eins: JWT-Grundlagen

JSON Web Token (JWT) ist ein offener Standard für die sichere Übertragung von Ansprüchen und Authentifizierungsinformationen über das Web. Es besteht aus drei Teilen: Header, Payload und Signatur.

Der Header enthält Informationen zum Algorithmus und zum Tokentyp. Ein Beispiel dafür könnte so aussehen:

{
  "alg": "HS256",
  "typ": "JWT"
}

Die Nutzlast enthält die Informationen, die übertragen werden müssen. Zum Beispiel Benutzername, Rolle und andere Informationen über den Benutzer. Ein Beispiel für eine Nutzlast könnte wie folgt aussehen:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Eine Signatur ist eine verschlüsselte Zeichenfolge, die den Schlüssel enthält, der zur Überprüfung der Gültigkeit des JWT verwendet wird. Ein Beispiel für eine Signatur könnte so aussehen:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(claims),
  secret)

Teil 2: JWT mit PHP implementieren

Um JWT zur Authentifizierung und Autorisierung zu verwenden, benötigen wir eine PHP-Klasse, um das JWT zu generieren und zu überprüfen. Schauen wir uns die Implementierung einer einfachen PHP-JWT-Klasse an.

<?php

class JWT {
  private $header;
  private $payload;
  private $secret;

  public function __construct($header, $payload, $secret) {
    $this->header = $header;
    $this->payload = $payload;
    $this->secret = $secret;
  }

  public function encode() {
    $header = $this->base64UrlEncode(json_encode($this->header));
    $payload = $this->base64UrlEncode(json_encode($this->payload));
    $signature = $this->base64UrlEncode(hash_hmac('sha256', $header . '.' . $payload, $this->secret, true));
    return $header . '.' . $payload . '.' . $signature;
  }

  public function decode($jwt) {
    $parts = explode('.', $jwt);
    $header = json_decode($this->base64UrlDecode($parts[0]), true);
    $payload = json_decode($this->base64UrlDecode($parts[1]), true);
    $signature = $this->base64UrlDecode($parts[2]);
    $result = hash_hmac('sha256', $parts[0] . '.' . $parts[1], $this->secret, true);
    if (hash_equals($result, $signature)) {
      return $payload;
    } else {
      return null;
    }
  }

  private function base64UrlEncode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  }

  private function base64UrlDecode($data) {
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
  }
}

In dieser PHP-Klasse speichern $header, $payload und $secret den JWT-Header, die Nutzlast und die Schlüsselinformationen. Die Methode encode() verwendet header, payload und secret, um einen JWT-String zu generieren. Die Methode decode() verwendet die angegebene JWT-Zeichenfolge und den angegebenen Schlüssel, um Nutzlastinformationen abzurufen. $header$payload$secret 存储了 JWT 的头部、载荷和密钥信息。encode() 方法使用 headerpayloadsecret 来生成 JWT 字符串。decode() 方法使用给定的 JWT 字符串和密钥来获取载荷信息。

base64UrlEncode()base64UrlDecode() 方法用于编码和解码 JWT 的头部和载荷。

第三部分:将 JWT 用于身份认证和授权

现在,我们已经了解了 JWT 的基础知识,并且有一个 PHP JWT 类用于生成和验证 JWT。那么,我们如何将 JWT 用于身份认证和授权呢?

首先,当用户登录时,可以使用 JWT 发送一个令牌来验证他们的身份。服务器将生成一个带有用户名和密码有效载荷的 JWT,并将其发送给客户端。客户端将在每个请求中将此令牌作为 Authorization 标头的 Bearer 认证方案进行发送。服务器将从标头中提取 JWT 并根据需要验证其有效性。

以下是一个示例 JWT 实现用于身份认证和授权:

<?php

// 使用 JWT 登录
function login($username, $password) {
  // 检查用户名和密码是否正确
  $is_valid = validate_user_credentials($username, $password);
  if (!$is_valid) {
    return null;
  }

  // 生成 JWT
  $header = array('alg' => 'HS256', 'typ' => 'JWT');
  $payload = array('sub' => $username);
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $token = $jwt->encode();

  // 返回 JWT
  return $token;
}

// 验证 JWT
function validate_token($jwt) {
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $payload = $jwt->decode($jwt);
  if ($payload == null) {
    return false;
  }

  // 验证成功
  return true;
}

// 保护资源
function protect_resource() {
  // 检查 JWT 是否有效
  $jwt = get_authorization_header();
  if (!validate_token($jwt)) {
    http_response_code(401);
    exit();
  }

  // 资源保护
  // ...
}

// 从标头获取 JWT
function get_authorization_header() {
  $headers = getallheaders();
  if (isset($headers['Authorization'])) {
    return $headers['Authorization'];
  }
  return null;
}

// 检查用户名和密码是否正确
function validate_user_credentials($username, $password) {
  // 验证用户名和密码
  // ...
  return true;
}

// 密钥
$GLOBALS['secret'] = "my-secret";

// 登录并获取 JWT
$token = login("username", "password");

// 将 JWT 添加到标头
$headers = array('Authorization: Bearer ' . $token);

// 保护资源
protect_resource($headers);

在这个示例中,login() 方法使用 JWT 类创建一个 JWT,并返回它以便客户端使用。validate_token() 方法可以验证 JWT 的有效性。如果 JWT 无效,将返回 false。

get_authorization_header() 方法从请求标头中提取 JWT。 protect_resource() 方法用于保护 Web 资源。如果 JWT 无效,该函数将引发 401 错误。

最后,在全局范围内定义了一个密钥,$GLOBALS ['secret']

Die Methoden base64UrlEncode() und base64UrlDecode() werden zum Kodieren und Dekodieren des JWT-Headers und der Nutzlast verwendet.

Teil 3: Verwendung von JWT zur Authentifizierung und Autorisierung

Jetzt haben wir die Grundlagen von JWT verstanden und verfügen über eine PHP-JWT-Klasse zum Generieren und Validieren von JWT. Wie nutzen wir also JWT zur Authentifizierung und Autorisierung? 🎜🎜Wenn sich ein Benutzer anmeldet, können Sie mit JWT zunächst ein Token senden, um seine Identität zu überprüfen. Der Server generiert ein JWT mit den Nutzdaten aus Benutzername und Passwort und sendet es an den Client. Der Client sendet dieses Token bei jeder Anfrage als Autorisierungsheader des Bearer-Authentifizierungsschemas. Der Server extrahiert das JWT aus dem Header und überprüft bei Bedarf seine Gültigkeit. 🎜🎜Hier ist eine Beispiel-JWT-Implementierung für Authentifizierung und Autorisierung: 🎜rrreee🎜In diesem Beispiel erstellt die Methode login() ein JWT mithilfe der Klasse JWT und gibt „Ist“ zurück für den Kundengebrauch. Die Methode validate_token() kann die Gültigkeit des JWT überprüfen. Wenn das JWT ungültig ist, wird false zurückgegeben. Die Methode 🎜🎜get_authorization_header() extrahiert das JWT aus dem Anforderungsheader. Die Methode protect_resource() wird zum Schutz von Webressourcen verwendet. Wenn das JWT ungültig ist, löst diese Funktion einen 401-Fehler aus. 🎜🎜Abschließend wird im globalen Bereich ein Geheimnis definiert, $GLOBALS ['secret'] , das eine lange Zeichenfolge sein sollte. Bitte beachten Sie, dass es sich bei diesem Passwort um ein geheimes Passwort handelt und nicht in Ihre Codebasis aufgenommen werden sollte. Normalerweise wird dieser Schlüssel in einer Umgebungsvariablen gespeichert und vom Betriebssystem verwaltet, auf dem der Webserver läuft. 🎜🎜Fazit🎜🎜JWT ist ein sehr einfacher, flexibler, skalierbarer und sicherer Mechanismus zur Authentifizierung und Autorisierung in Webanwendungen. In diesem Artikel haben wir uns mit den Grundlagen von JWT befasst und eine Beispiel-PHP-Klasse zum Generieren und Validieren von JWT gesehen. Wir haben auch gesehen, wie JWT zur Authentifizierung und Autorisierung verwendet werden kann. Jetzt können Sie JWT in Ihren Webanwendungen ausprobieren, um sicherzustellen, dass Ihre Apps sicherer sind. 🎜

Das obige ist der detaillierte Inhalt vonPHP-Entwicklung: So verwenden Sie JWT zur Authentifizierung und Autorisierung. 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