Hallo,
Obwohl wir gerne an allen OSS der Welt arbeiten würden, nutzen wir diese Bibliothek nicht mehr aktiv. Das bedeutet, dass neue Funktionen/Bugfixes/usw. nur auf der Grundlage von Pull-Anfragen externer Mitwirkender zusammengeführt werden Wir empfehlen Ihnen dringend, nach einer langfristigen Alternative zu suchen.
Wenn Sie nach einer aktiv gepflegten Bibliothek suchen, schauen Sie sich firebase/php-jwt an!
Diese Bibliothek bietet eine einfache Implementierung der JWS-Spezifikation (JSON Web Signature).
Diese Bibliothek benötigt PHP 5.5+ und die Bibliothek OpenSSL.
Es wurde mit PHP5.5
bis PHP7.0
und HHVM
getestet.
Sie können die Bibliothek direkt von Composer/Packagist installieren:
"namshi/jose": "7.0.*"
Die Verwendung ist ziemlich einfach: Stellen Sie sich vor, Sie möchten einem Dienst die Möglichkeit bieten, einen Benutzer über ein Cookie zu authentifizieren, und der Dienst ist mit Javascript erstellt. Sie müssten lediglich ein JWS generieren (nachdem Sie die Anmeldeinformationen einmal überprüft haben), es als Cookie speichern und es dann jedes Mal von Ihrer JavaScript-App übergeben, wenn Sie diesen Benutzer authentifizieren möchten.
Generieren Sie zunächst die JWS:
<?php
use Namshi JOSE SimpleJWS ;
if ( $ username == ' correctUsername ' && $ pass == ' ok ' ) {
$ user = Db :: loadUserByUsername ( $ username );
$ jws = new SimpleJWS ( array (
' alg ' => ' RS256 '
));
$ jws -> setPayload ( array (
' uid ' => $ user -> getid (),
));
$ privateKey = openssl_pkey_get_private ( " file://path/to/private.key " , self :: SSL_KEY_PASSPHRASE );
$ jws -> sign ( $ privateKey );
setcookie ( ' identity ' , $ jws -> getTokenString ());
}
Dann kann Ihre JS-App das verfügbare Cookie verwenden, um authentifizierte Aufrufe auszuführen, ohne Passwörter oder Anmeldeinformationen zu senden.
Sobald eine Anfrage übermittelt wurde, müssen Sie nur noch überprüfen, ob es sich um einen gültigen Anruf handelt:
<?php
use Namshi JOSE SimpleJWS ;
$ jws = SimpleJWS :: load ( $ _COOKIE [ ' identity ' ]);
$ public_key = openssl_pkey_get_public ( " /path/to/public.key " );
// verify that the token is valid and had the same values
// you emitted before while setting it as a cookie
if ( $ jws -> isValid ( $ public_key , ' RS256 ' )) {
$ payload = $ jws -> getPayload ();
echo sprintf ( " Hey, my JS app just did an action authenticated as user #%s " , $ payload [ ' uid ' ]);
}
PROTIPP: Sie können das zweite Argument der Methode isValid() weglassen, sodass Jose versucht, das Token mit dem im Header des Tokens angegebenen Algorithmus zu validieren. Dies könnte jedoch zu Sicherheitsproblemen führen.
Wir empfehlen vorerst, den Algorithmus, den Sie zur Validierung von Token verwenden möchten, immer explizit festzulegen.
Möglicherweise müssen Sie diese Bibliothek in einer Umgebung verwenden, in der die PHP-Wrapper für OpenSSL nicht funktionieren oder OpenSSL einfach nicht installiert ist. Diese Bibliothek verwendet standardmäßig OpenSSL zur Verschlüsselung, Sie können jedoch angeben, dass Sie PHPSecLib für eine reine PHP-Implementierung der RSA-Verschlüsselung verwenden möchten.
Fügen Sie in diesen Fällen einfach den optionalen Parameter 'SecLib'
hinzu, wenn Sie eine JWS erstellen:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
Sie können jetzt die PHPSecLib-Implementierung der RSA-Signierung verwenden. Wenn Sie einen passwortgeschützten privaten Schlüssel verwenden, können Sie den zum Signieren zu verwendenden privaten Schlüssel dennoch als Zeichenfolge übermitteln, solange Sie das Passwort als zweiten Parameter an die sign
Methode übergeben:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
Sie können ein JWS auch mithilfe der PHPSecLib-Implementierung der RSA-Verifizierung laden:
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
Zur Validierung des JWS wird zunächst die Signatur mit einem öffentlichen Schlüssel verifiziert und anschließend wird geprüft, ob der Token abgelaufen ist.
Um einem JWS eine TTL zu geben, verwenden Sie einfach den Standard exp
Wert in der Nutzlast:
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
Sie können unsichere JWSes zulassen, indem Sie beim Laden von JWSes das Flag $allowUnsecure
setzen:
JWS :: load ( $ this -> jws -> getTokenString (), true );
Dadurch können mit den „none“-Algorithmen signierte Token durchgelassen werden, was Sie wahrscheinlich nicht tun möchten. Seien Sie vorsichtig :)
Unsichere JWS sind seit Version 2.2.2 standardmäßig deaktiviert. Sie sollten keine früheren Versionen außer 2.2.2 verwenden, da diese eine Sicherheitslücke aufweisen. Weitere Infos hier.
Wenn Sie das Token aus irgendeinem Grund auf andere Weise codieren müssen, können Sie eine beliebige Implementierung von NamshiJOSEBase64Encoder
in eine JWS
Instanz einfügen. Ebenso akzeptiert JWS::load()
eine solche Implementierung als zweites Argument.
Die Bibliothek stellt eine Basis-JWT-Klasse bereit, die implementiert, was nur für JSON-Web-Tokens benötigt wird. Die JWS-Klasse erweitert dann die JWT-Klasse und fügt die Implementierung zum Signieren und Überprüfen mithilfe von JSON-Websignaturen hinzu. Die SimpleJWS-Klasse erweitert die Basis-JWS-Klasse und fügt die Validierung einer TTL und die Einbeziehung automatischer Ansprüche hinzu.
Einführung der Möglichkeit, eine Verschlüsselungs-Engine anzugeben. Unterstützung von PHPSecLib zur bestehenden OpenSSL-Implementierung hinzugefügt.
Es wurde die Möglichkeit hinzugefügt, benutzerdefinierte Eigenschaften im Header festzulegen. Die automatische Einbeziehung bestimmter Ansprüche wurde von der Basis-JWS-Klasse in eine SimpleJWS-Klasse verschoben.
PHPseclib und die OpenSSL-Erweiterung wurden als vorgeschlagene Abhängigkeiten verschoben.
Tests werden mit PHPUnit für diese Bibliothek geschrieben. Nach der Composer-Installation können Sie den folgenden Befehl ausführen, um Tests auszuführen:
./vendor/bin/phpunit
Diese Bibliothek wurde von der ersten Arbeit von @ritou inspiriert.