Anwendungsauthentifizierung verwendet, um sich ausschließlich auf Anmeldeinformationen wie Benutzername/Mailbox und Kennwort zu verlassen, und die Sitzung wurde verwendet, um den Benutzerstatus zu erhalten, bis sich der Benutzer anmeldet. Danach begannen wir mit der Authentifizierungs -API. Kürzlich werden JSON Web Token (JWT) zunehmend zur Authentifizierung von Serveranforderungen verwendet.
In diesem Artikel wird vorgestellt, was JWT ist und wie PHP für JWT-basierte Benutzeranforderungsauthentifizierung verwendet wird.
Schlüsselpunkte
jwt und Sitzung
, warum ist das Gespräch nicht so gut? Es gibt drei Hauptgründe:
jwt
Beginnen wir jetzt, JWT zu lernen. Die JSON -Web -Token -Spezifikation (RFC 7519) wurde erstmals am 28. Dezember 2010 veröffentlicht, und das letzte Update fand im Mai 2015 statt.
jwt hat viele Vorteile gegenüber API -Schlüssel, darunter:
Wie sieht JWT aus?
Dies ist ein JWT -Beispiel:
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
Auf den ersten Blick scheint diese Zeichenfolge nur eine zufällige Gruppe von Zeichen zu sein, die mit Perioden oder Punktzeichen verbunden sind. Es scheint also nicht anders zu sein als der API -Schlüssel. Wenn Sie jedoch genau hinschauen, werden Sie feststellen, dass es drei separate Zeichenfolgen gibt.
Die erste Zeichenfolge ist der JWT -Header. Es ist eine Basis64-URL-kodierte JSON-String. Es gibt den Verschlüsselungsalgorithmus an, mit dem die Signatur und die Art des Tokens erzeugt werden, der immer auf JWT eingestellt ist. Der Algorithmus kann symmetrisch oder asymmetrisch sein.
Der symmetrische Algorithmus verwendet einen einzelnen Schlüssel zum Erstellen und Überprüfen von Token. Dieser Schlüssel wird zwischen dem Schöpfer und dem Verbraucher des JWT geteilt. Stellen Sie sicher, dass nur der Schöpfer und der Verbraucher den Schlüssel kennen. Andernfalls kann jeder ein gültiges Token erstellen. Der asymmetrische Algorithmus verwendet einen privaten Schlüssel, um das Token zu unterzeichnen, und verwendet einen öffentlichen Schlüssel, um das Token zu überprüfen. Diese Algorithmen sollten verwendet werden, wenn der gemeinsame Schlüssel unpraktisch ist oder wenn andere Parteien nur die Integrität des Tokens überprüfen müssen.
JWTs Nutzlast
, öffentlich und privat . Die Registrierungserklärung ist vordefiniert. Sie finden eine Liste von ihnen im RFC von JWT. Hier sind einige häufig verwendete Aussagen:
iat: Datum und Zeitstempel vom Token ausgestellt.
JWTs Signatur
Die Signatur vonJWTs Signatur ist eine Kombination aus drei Dingen:
Diese drei werden unter Verwendung des im JWT -Header angegebenen Algorithmus digital signiert ( nicht verschlüsselt ). Wenn wir das obige Beispiel dekodieren, erhalten wir die folgende JSON -Zeichenfolge:
JWTs Header
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
JWTs Daten
<code>{ "alg": "HS256", "typ": "JWT" }</code>
Sie können JWT.io selbst ausprobieren, wo Sie versuchen können, Ihren eigenen JWT zu kodieren und zu dekodieren.
Verwenden Sie JWT in PHP-basierten Anwendungen
Jetzt, da Sie gelernt haben, was JWT ist, ist es Zeit zu lernen, wie Sie sie in Ihrer PHP -Anwendung verwenden. Fühlen Sie sich frei, den Code dieses Artikels zu klonen oder unsere Schritte zu befolgen, bevor Sie sich damit befassen.
Sie können eine Reihe von Möglichkeiten einnehmen, um JWT zu integrieren, aber hier sind die, die wir nehmen werden.
Abgesehen von den Anmeldungs- und Abmeldeseiten müssen alle Anforderungen an die Anwendung über JWT authentifiziert werden. Wenn der Benutzer eine Anfrage ohne JWT stellt, wird er auf die Anmeldeseite umgeleitet.
Nachdem der Benutzer das Anmeldeformular eingefüllt und eingereicht hat, wird das Formular über JavaScript in die Anmeldendpunkt -Authentikate.php in unserer Anwendung übermittelt. Der Endpunkt zieht dann die Anmeldeinformationen (Benutzername und Passwort) aus der Anfrage und prüft, ob sie gültig sind.
Wenn es gültig ist, generiert es eine JWT und sendet es an den Client zurück. Wenn der Client den JWT erhält, speichert er das JWT und verwendet sie für jede zukünftige Anfrage an die Anwendung.
Für ein einfaches Szenario kann der Benutzer nur eine Ressource anfordern - eine ordnungsgemäß benannte PHP -Datei ressource.php. Es tut nicht viel, es gibt nur eine Zeichenfolge zurück, die zum Zeitpunkt der Anfrage den aktuellen Zeitstempel enthält.
Es gibt verschiedene Möglichkeiten, JWT bei einer Anfrage zu verwenden. In unserer Bewerbung wird der JWT in den Header der Trägerautorisierung gesendet.
Wenn Sie nicht mit der Genehmigung der Träger vertraut sind, handelt es sich um eine Form der HTTP -Authentifizierung, bei der ein Token (wie JWT) in den Anforderungsheader gesendet wird. Der Server kann das Token überprüfen und feststellen, ob der "Inhaber" -Access auf das Token gewährt werden sollte.
Dies ist ein Beispiel für einen Header:
<code>{ "iat": 1416929109, "jti": "aa7f8d0a95c", "scopes": [ "repo", "public_repo" ] }</code>
Für jede Anfrage, die unsere Anwendung erhält, versucht PHP, das Token aus dem Trägerkopfzeile zu extrahieren. Wenn es existiert, wird es verifiziert. Wenn der Benutzer gültig ist, wird eine normale Antwort auf die Anfrage angezeigt. Wenn der JWT jedoch ungültig ist, darf der Benutzer nicht auf die Ressource zugreifen.
Bitte beachten Sie, dass JWT nicht dazu bestimmt ist, Sitzungs Cookies zu ersetzen.
VoraussetzungenFühren Sie im Root -Verzeichnis des Projekts Komponisten Installation aus. Dadurch werden Firebase PHP-JWT, eine Bibliothek von Drittanbietern, die JWT-Operationen und Laminas-Config vereinfacht, um den Zugriff auf Konfigurationsdaten in Anwendungen zu vereinfachen.
Login -Formular
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
Nach Erhalt des Formulars werden die Anmeldeinformationen gegen die Datenbank oder einen anderen Datenspeicher überprüft. Für die Zwecke dieses Beispiels gehen wir davon aus, dass sie gültig sind und $ hasvalidcredentials auf true festlegen.
<code>{ "alg": "HS256", "typ": "JWT" }</code>
Als nächstes initialisieren wir eine Reihe von Variablen, um JWT zu generieren. Denken Sie daran, dass JWT, da auf dem Kunden überprüft werden kann, keine sensiblen Informationen enthalten. Eine andere Sache, die es wert ist, darauf hinzuweisen, ist, dass $ SecretKey nicht so initialisiert wird. Sie können es in Ihrer Umgebung einstellen und extrahieren, Bibliotheken wie PHPDotenv verwenden oder in einer Konfigurationsdatei einstellen. In diesem Fall vermeide ich dies, weil ich mich auf den JWT -Code konzentrieren möchte.
lecken Sie es nicht oder speichern Sie es unter Versionskontrolle!
Nach der Vorbereitung der Nutzlastdaten verwenden wir als nächstes die statische Encode-Methode von PHP-JWT, um die JWT zu erstellen.
<code>{ "iat": 1416929109, "jti": "aa7f8d0a95c", "scopes": [ "repo", "public_repo" ] }</code>
Diese Methode:
Array in JSON
Nutzlastinformationen
Verwenden Sie JWT
<code>Authorization: Bearer ab0dde18155a43ee83edba4a4542b973</code>
Jetzt, da der Client das Token hat, können Sie es mit JavaScript oder einem beliebigen Mechanismus speichern. Hier ist ein Beispiel dafür, wie man mit nativem JavaScript operiert. In index.html wird nach erfolgreicher Einreichung des empfangenen JWT im Speicher gespeichert, das Anmeldeformular versteckt und eine Schaltfläche, die den Zeitstempel beantragt, wird angezeigt:
Verwenden Sie JWT
<?php declare(strict_types=1); use Firebase\JWT\JWT; require_once('../vendor/autoload.php');
Wenn wir auf die Schaltfläche klicken, wird eine ähnliche Anfrage wie folgt ausgestellt:
<?php // 从请求中提取凭据 if ($hasValidCredentials) {
unter der Annahme, dass die JWT gültig ist, werden wir die Ressource sehen und die Antwort wird danach in die Konsole geschrieben.
$secretKey = 'bGS6lzFqvvSQ8ALbOxatm7/Vk7mLQyzqaS34Q4oR1ew='; $issuedAt = new DateTimeImmutable(); $expire = $issuedAt->modify('+6 minutes')->getTimestamp(); // 添加60秒 $serverName = "your.domain.name"; $username = "username"; // 从过滤后的POST数据中检索 $data = [ 'iat' => $issuedAt->getTimestamp(), // 颁发时间:生成令牌的时间 'iss' => $serverName, // 颁发者 'nbf' => $issuedAt->getTimestamp(), // 不早于 'exp' => $expire, // 过期 'userName' => $username, // 用户名 ];
Überprüfen Sie JWT
Der Code wird dann versucht, das Token aus dem Trägerkopfball zu extrahieren. Ich habe dies mit preg_match gemacht. Wenn Sie mit der Funktion nicht vertraut sind, führt sie eine regelmäßige Ausdrucksübereinstimmung in der Zeichenfolge durch.
<?php // 将数组编码为JWT字符串。 echo JWT::encode( $data, $secretKey, 'HS512' ); }
Die Regex, die ich hier benutze, wird versuchen, das Token aus dem Trägerheader zu extrahieren und alles andere abzuwerfen. Wenn nicht gefunden, wird eine HTTP 400 -Fehleranforderung zurückgegeben:
Beachten Sie, dass Apache standardmäßig den Header http_authorization nicht an PHP übergibt. Der Grund dafür ist:
const store = {}; const loginButton = document.querySelector('#frmLogin'); const btnGetResource = document.querySelector('#btnGetResource'); const form = document.forms[0]; // 将jwt插入到store对象中 store.setJWT = function (data) { this.JWT = data; }; loginButton.addEventListener('submit', async (e) => { e.preventDefault(); const res = await fetch('/authenticate.php', { method: 'POST', headers: { 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8' }, body: JSON.stringify({ username: form.inputEmail.value, password: form.inputPassword.value }) }); if (res.status >= 200 && res.status < 300) { const jwt = await res.text(); store.setJWT(jwt); frmLogin.style.display = 'none'; btnGetResource.style.display = 'block'; } else { // 处理错误 console.log(res.status, res.statusText); } });
Der grundlegende Autorisierungsheader ist nur sicher, wenn Ihre Verbindung über HTTPS abgeschlossen ist, da sonst die Anmeldeinformationen in codiertem Klartext (unverschlüsselt) über das Netzwerk gesendet werden, was ein großes Sicherheitsproblem darstellt.
Ich verstehe die Logik dieser Entscheidung vollständig. Um jedoch viel Verwirrung zu vermeiden, fügen Sie Ihre Apache -Konfiguration Folgendes hinzu. Der Code funktioniert dann wie erwartet. Wenn Sie Nginx verwenden, sollte der Code wie erwartet funktionieren:
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
Als nächstes versuchen wir, den passenden JWT zu extrahieren, der sich im zweiten Element der Variablen $ Matches befindet. Wenn nicht verfügbar, wird kein JWT extrahiert und eine HTTP 400 -Fehleranforderung wird zurückgegeben:
<code>{ "alg": "HS256", "typ": "JWT" }</code>
Wenn wir diesen Punkt erreichen, wurde die JWT extrahiert, sodass wir in die Entschlüsselungs- und Überprüfphase gehen. Dazu benötigen wir unseren Schlüssel erneut, der aus der Konfiguration der Umgebung oder Anwendung extrahiert wird. Anschließend verwenden wir die statische Decode-Methode von PHP-JWT, um sie an den JWT, den Schlüssel und eine Reihe von Algorithmen zu übergeben, mit denen die JWT dekodiert werden. Wenn es erfolgreich dekodiert werden kann, werden wir versuchen, es zu überprüfen. Mein Beispiel hier ist sehr einfach, da es nur Emittenten verwendet, nicht früher als abgelaufene Zeitstempel. In einer realen Anwendung können Sie auch viele andere Aussagen verwenden.
Wenn das Token ungültig ist, z. B. das Token abgelaufen ist, erhält der Benutzer den nicht autorisierten HTTP 401 -Header und das Skript wird beendet.
<code>{ "iat": 1416929109, "jti": "aa7f8d0a95c", "scopes": [ "repo", "public_repo" ] }</code>
Wenn der Dekodierungs- und Überprüfungsprozess fehlschlägt, kann dies:
seinDie Anzahl der bereitgestellten Segmente stimmt nicht mit den oben beschriebenen Standard -Segmenten überein.
Wenn der Dekodierungs- und Überprüfungsprozess erfolgreich ist, darf der Benutzer eine Anfrage ausstellen und eine entsprechende Antwort erhalten.
Zusammenfassung
Dies ist eine kurze Einführung in JSON Web Tokens (oder JWT) und wie man sie in PHP-basierten Anwendungen verwendet. Von hier aus können Sie versuchen, JWT in der nächsten API zu implementieren, vielleicht einen anderen Signaturalgorithmus zu probieren, der asymmetrische Schlüssel wie RS256 verwendet, oder in einen vorhandenen OAuth2 -Authentifizierungsserver integrieren, um sie als API -Schlüssel zu verwenden.
Wenn Sie Kommentare oder Fragen haben, können Sie uns bitte über Twitter kontaktieren.
FAQs bei der Verwendung von JWT für die PHP -Autorisierung
Sie können JWT in PHP tatsächlich verwenden, um Authentifizierungs- und Autorisierungsmechanismen in Ihrer Webanwendung festzulegen. Um loszulegen, müssen Sie Komponist verwenden, um die PHP JWT-Bibliothek wie "Firebase/PHP-JWT" oder "LCOBUCCI/JWT" zu installieren. Diese Bibliotheken bieten die erforderlichen Tools zum Erstellen, Codieren, Dekodieren und Validieren von JWTs.
Um ein JWT zu erstellen, können Sie mit der Bibliothek ein Token erstellen, das Aussagen wie Emittent, Publikum, Ablaufzeit und mehr enthält. Sobald Sie erstellt haben, können Sie das Token mit dem Schlüssel unterschreiben. Beim Empfangen eines JWT können Sie die Bibliothek verwenden, um sie zu entschlüsseln und zu überprüfen, um ihre Authentizität zu gewährleisten. Wenn das Token gültig und verifiziert ist, können Sie auf seine Erklärung zugreifen, um die Benutzeridentität und -berechtigungen zu bestimmen, sodass Sie eine sichere Authentifizierung und Autorisierung in Ihrer PHP -Anwendung implementieren können.
Der Schutz Ihrer Schlüssel und die Befolgung der Best Practices bei der Verwendung von JWT ist entscheidend, um den unbefugten Zugriff auf Anwendungsressourcen zu verhindern. JWT (JSON Web Token) Authentifizierung in PHP ist eine Methode, die häufig zur Implementierung der Benutzerauthentifizierung und -autorisierung in Webanwendungen verwendet wird. Es basiert auf der Token -Authentifizierung und ermöglicht eine sichere und staatenlose Benutzerauthentifizierung. So funktioniert die JWT -Authentifizierung in PHP:
Zunächst generiert der Server während der Benutzerauthentifizierung oder Anmeldung ein JWT, ein kompaktes, in sich geschlossenes Token mit Informationen (Ansprüchen), die sich auf den Benutzer beziehen, wie z. B. Benutzer-ID, Benutzername und Rolle. Diese Erklärungen sind normalerweise JSON -Daten. Der Server unterschreibt diesen Token dann mit einem Schlüssel, um seine Integrität und Authentizität zu gewährleisten.
Zweitens sendet der Server nach erfolgreicher Authentifizierung den JWT an den Client zurück, der normalerweise an einem sicheren Ort wie HTTP -Cookies oder lokalem Speicher gespeichert wird. Dieses Token dient als Authentifizierungsnachweis.
Für nachfolgende Anfragen an geschützte Ressourcen auf dem Server findet der Client schließlich ein JWT an den Anforderungsheader an, der normalerweise den Header "Autorisierungs" mit dem Schema "Bearer" verwendet. Nach Erhalt des JWT verwendet der Server denselben Schlüssel, der während der Token -Erstellung verwendet wird, um seine Signatur zu überprüfen. Darüber hinaus prüft es, ob das Token nicht abgelaufen ist, und enthält eine gültige Erklärung. Nach erfolgreicher Überprüfung extrahiert sie Benutzerinformationen aus der Token -Erklärung und implementiert die Autorisierungslogik, um sicherzustellen, dass der Benutzer über die Berechtigungen verfügt, die für den Zugriff auf die angeforderte Ressource erforderlich sind. Dieser Ansatz ermöglicht eine sichere, staatenlose Authentifizierung in PHP-Anwendungen ohne serverseitige Sitzungsspeicher.
Während die JWT -Authentifizierung in PHP viele Vorteile wie Skalierbarkeit und Staatenlosigkeit bietet, sind Best Practices für den Schutz der Schlüssel und die Einführung des Token -Managements für die Aufrechterhaltung der Sicherheit Ihrer Anwendung unerlässlich. Die Verwendung etablierter PHP -JWT -Bibliotheken kann die Token -Verarbeitung vereinfachen und die Sicherheit verbessern. Die Alternative zu JWT (JSON Web Tokens) zur Authentifizierung und Autorisierung in PHP ist eine Sitzungsbasis-Authentifizierung. In der Sitzungsbasis-Authentifizierung verwaltet der Server eine Sitzung für jeden authentifizierten Benutzer. Wenn sich der Benutzer anmeldet, wird eine eindeutige Sitzungskennung erstellt (normalerweise als Session -Cookie im Clientbrowser gespeichert). Diese Kennung wird verwendet, um den Benutzer mit serverseitigen Sitzungsdaten zu verknüpfen, einschließlich Informationen, die sich mit dem Benutzer beziehen, z. B. Benutzer-ID, Benutzername und Berechtigungen.
Die Sitzungsbasis-Authentifizierung bietet Einfachheit und einfache Implementierung. Damit ist sie für eine Vielzahl von Webanwendungen geeignet, insbesondere wenn Sie die staatenlosen und skalierbaren Funktionen von JWT nicht benötigen. Es ist von Natur aus staatlich, was vorteilhaft sein kann, wenn Sie während einer Benutzersitzung benutzerspezifische Daten (z. B. Einkaufswagen-Inhalte oder Benutzereinstellungen) verwalten müssen.
Bei der Verwendung einer Sitzungsauthentifizierung sind jedoch einige Dinge zu berücksichtigen. Es ist möglicherweise nicht ganz anwendbar für verteilte oder mikroservicebasierte Architekturen, die eine aufstandslose Authentifizierung erfordern. Darüber hinaus kann das Verwalten von Benutzersitzungen die Serverlast erhöhen, insbesondere in Anwendungen mit größeren Benutzerbasis. Die Auswahl der JWT- und Sitzungsbasis-Authentifizierung in PHP sollte letztendlich den spezifischen Anforderungen und Designüberlegungen der Anwendung entsprechen, um einen sicheren und effektiven Authentifizierungsmechanismus zu gewährleisten, der Ihren Anforderungen am besten entspricht. Schutz der PHP-API mit JWT (JSON Web Tokens) beinhaltet einen mehrstufigen Prozess, der Authentifizierung und Autorisierung kombiniert. Wählen Sie zunächst die entsprechende PHP-JWT-Bibliothek (z. B. "Firebase/PHP-JWT" oder "LCOBUCCI/JWT") aus, um die tokenbezogenen Operationen zu verarbeiten und Komponist zum Verwalten von Abhängigkeiten zu verwenden.
Für die Authentifizierung müssen Sie ein Benutzerauthentifizierungssystem in Ihrer PHP -Anwendung implementieren. Dieses System überprüft Benutzeranmeldeinformationen mit Ihrer Datenbank oder Ihrem Authentifizierungsanbieter. Nach einer erfolgreichen Authentifizierung generieren Sie ein JWT-Token, das benutzerbezogene Behauptungen wie die ID, den Benutzernamen und die Rolle des Benutzers enthält. Stellen Sie sicher, dass Sie die Ablaufzeit festlegen, um die Gültigkeit des Tokens zu steuern, und unterschreiben Sie das Token mit dem Schlüssel. Dieses unterschriebene Token wird als Teil der Authentifizierungsantwort an den Client zurückgeschickt.
Clients speichern den empfangenen JWT sicher, normalerweise in HTTP -Cookies oder in lokalem Speicher. Für nachfolgende API -Anfragen wird der Kunde einen JWT in den Anforderungsheader als "Autorisierungs" -Header mit dem "Bearer" -Programm aufnehmen. In Ihrer PHP -API können Sie den eingehenden JWT überprüfen, indem Sie deren Signatur mit demselben Schlüssel überprüfen, der beim Erstellen des Tokens verwendet wird. Darüber hinaus überprüfen Sie, ob das Token nicht abgelaufen ist und enthält eine gültige Erklärung. Nach erfolgreicher Überprüfung extrahieren Sie Benutzerinformationen aus der Token -Erklärung und implementieren Sie die Autorisierungslogik, um sicherzustellen, dass der Benutzer über die Berechtigungen verfügt, die für den Zugriff auf die angeforderte Ressource erforderlich sind.
Es ist entscheidend, den Schlüssel sicher zu halten, da es entscheidend ist, das Token zu unterschreiben und zu überprüfen. Jede Leckage dieses Schlüssels kann zu einer schwerwiegenden Sicherheitsanfälligkeit führen. Können wir JWT in PHP verwenden?
Was ist die JWT -Authentifizierung in PHP?
Was ist die Alternative zu JWT in PHP?
Wie schützt man PHP -API mit JWT?
Das obige ist der detaillierte Inhalt vonPHP -Autorisierung mit JWT (JSON Web Tokens). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!