Salut,
même si nous aimerions pouvoir travailler sur tous les OSS du monde, nous n'utilisons plus activement cette bibliothèque. Cela signifie que les nouvelles fonctionnalités/corrections de bugs/etc ne seront fusionnées qu'en fonction des pull request de contributeurs externes. , et nous vous recommandons fortement de rechercher une alternative à long terme.
Si vous recherchez une bibliothèque activement entretenue, consultez firebase/php-jwt !
Cette bibliothèque fournit une implémentation légère de la spécification JWS (JSON Web Signature).
Cette bibliothèque nécessite PHP 5.5+ et la bibliothèque OpenSSL.
Il a été testé avec PHP5.5
à PHP7.0
et HHVM
.
Vous pouvez installer la bibliothèque directement depuis composer/packagist :
"namshi/jose": "7.0.*"
Son utilisation est assez simple : imaginez que vous souhaitiez offrir à un service la possibilité d'authentifier un utilisateur via un cookie, et que le service soit construit avec javascript ; ce que vous devez faire est de générer un JWS (après avoir vérifié une fois les informations d'identification), de le stocker en tant que cookie, puis de le transmettre depuis votre application JavaScript chaque fois que vous souhaitez authentifier cet utilisateur.
Tout d'abord, générez le 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 ());
}
Votre application JS peut ensuite utiliser le cookie disponible pour exécuter des appels authentifiés, sans envoyer de mots de passe ni d'informations d'identification.
Une fois la demande soumise, il vous suffit de vérifier qu'il s'agit d'un appel valide :
<?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 ' ]);
}
PROTIP : vous pouvez omettre le deuxième argument de la méthode isValid(), donc Jose tentera de valider le jeton avec l'algorithme spécifié dans l'en-tête du jeton, bien que cela puisse vous exposer à certains problèmes de sécurité.
Pour l'instant, nous vous recommandons de toujours définir explicitement l'algorithme que vous souhaitez utiliser pour valider les jetons.
Vous constaterez peut-être que vous devez utiliser cette bibliothèque dans un environnement dans lequel les wrappers PHP pour OpenSSL ne fonctionnent pas, ou où OpenSSL n'est tout simplement pas installé. Cette bibliothèque utilise OpenSSL pour chiffrer par défaut, mais vous pouvez spécifier que vous souhaitez utiliser PHPSecLib pour une implémentation PHP pure du chiffrement RSA.
Dans ces cas, ajoutez simplement le paramètre facultatif 'SecLib'
lors de la construction d'un JWS :
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
Vous pouvez désormais utiliser l'implémentation PHPSecLib de la signature RSA. Si vous utilisez une clé privée protégée par mot de passe, vous pouvez toujours soumettre la clé privée à utiliser pour la signature sous forme de chaîne, à condition de transmettre le mot de passe comme deuxième paramètre dans la méthode sign
:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
Vous pouvez également charger un JWS en utilisant l'implémentation PHPSecLib de la vérification RSA :
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
Afin de valider le JWS, la signature est d'abord vérifiée avec une clé publique puis nous vérifierons si le token est expiré.
Pour donner un TTL à un JWS, utilisez simplement la valeur exp
standard dans la charge utile :
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
Vous pouvez autoriser les JWS non sécurisés en définissant l'indicateur $allowUnsecure
lors du chargement des JWS :
JWS :: load ( $ this -> jws -> getTokenString (), true );
Cela permet aux jetons signés avec les algorithmes « aucun » de passer, ce que vous ne voulez probablement pas faire. Procédez avec prudence :)
Les JWS non sécurisés sont désactivés par défaut depuis la version 2.2.2. Vous ne devez pas utiliser les versions précédentes autres que la 2.2.2 car elles présentent une faille de sécurité. Plus d'informations ici.
Si, pour une raison quelconque, vous devez encoder le jeton d'une manière différente, vous pouvez injecter n'importe quelle implémentation de NamshiJOSEBase64Encoder
dans une instance JWS
. De même, JWS::load()
accepte une telle implémentation comme deuxième argument.
La bibliothèque fournit une classe JWT de base qui implémente ce qui est nécessaire uniquement pour les jetons Web JSON. La classe JWS étend ensuite la classe JWT et ajoute l'implémentation pour la signature et la vérification à l'aide des signatures Web JSON. La classe SimpleJWS étend la classe JWS de base et ajoute la validation d'un TTL et l'inclusion de revendications automatiques.
Introduction de la possibilité de spécifier un moteur de chiffrement. Ajout de la prise en charge de PHPSecLib à l'implémentation OpenSSL existante.
Ajout de la possibilité de définir des propriétés personnalisées dans l'en-tête. Déplacement de l'inclusion automatique de certaines revendications dans une classe SimpleJWS à partir de la classe JWS de base.
Déplacement de phpseclib et de l'extension openssl comme dépendances suggérées.
Les tests sont écrits en utilisant PHPUnit pour cette bibliothèque. Après avoir effectué l'installation de composer, vous pouvez exécuter la commande suivante pour exécuter des tests :
./vendor/bin/phpunit
Cette bibliothèque a été inspirée par le travail initial réalisé par @ritou.