Hola,
Por mucho que nos gustaría poder trabajar en todo el OSS del mundo, ya no usamos activamente esta biblioteca. Esto significa que las nuevas funciones/correcciones de errores/etc. solo se fusionarán en función de las solicitudes de extracción de contribuyentes externos. , y le recomendamos encarecidamente que busque una alternativa a largo plazo.
Si está buscando una biblioteca mantenida activamente, consulte firebase/php-jwt.
Esta biblioteca proporciona una implementación ligera de la especificación JWS (JSON Web Signature).
Esta biblioteca necesita PHP 5.5+ y la biblioteca OpenSSL.
Ha sido probado usando PHP5.5
a PHP7.0
y HHVM
.
Puede instalar la biblioteca directamente desde el compositor/paqueteador:
"namshi/jose": "7.0.*"
Usarlo es bastante sencillo: imagina que quieres ofrecer un servicio con la capacidad de autenticar a un usuario a través de una cookie, y el servicio está construido con javascript; Lo que tendría que hacer es generar un JWS (después de verificar las credenciales una vez), almacenarlo como una cookie y luego pasarlo desde su aplicación JavaScript cada vez que desee autenticar a ese usuario.
Primero, genere el 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 ());
}
Luego, su aplicación JS puede usar la cookie disponible para ejecutar llamadas autenticadas, sin enviar contraseñas ni credenciales.
Una vez enviada una solicitud, sólo debes verificar que es una llamada válida:
<?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: puedes omitir el segundo argumento del método isValid(), por lo que José intentará validar el token con el algoritmo especificado en el encabezado del token, aunque esto podría exponerte a algunos problemas de seguridad.
Por ahora, recomendamos configurar siempre de forma explícita el algoritmo que desea utilizar para validar los tokens.
Es posible que necesite utilizar esta biblioteca en un entorno donde los contenedores de PHP para OpenSSL no funcionan o donde OpenSSL simplemente no está instalado. Esta biblioteca usa OpenSSL para cifrar de forma predeterminada, pero puede especificar que desea usar PHPSecLib para una implementación PHP pura del cifrado RSA.
En estos casos, simplemente agregue el parámetro opcional 'SecLib'
al construir un JWS:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
Ahora puede utilizar la implementación PHPSecLib de la firma RSA. Si usa una clave privada protegida con contraseña, aún puede enviar la clave privada para usarla para firmar como una cadena, siempre y cuando pase la contraseña como segundo parámetro en el método sign
:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
También puede cargar un JWS utilizando la implementación PHPSecLib de verificación RSA:
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
Para validar el JWS primero se verifica la firma con una clave pública y luego comprobaremos si el token está caducado.
Para darle un TTL a un JWS, simplemente use el valor exp
estándar en la carga útil:
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
Puede permitir JWS no seguros configurando el indicador $allowUnsecure
mientras carga JWS:
JWS :: load ( $ this -> jws -> getTokenString (), true );
Esto permite que pasen los tokens firmados con los algoritmos "ninguno", que es algo que probablemente no quieras hacer. Procede con precaución :)
Los JWS no seguros están deshabilitados de forma predeterminada desde la versión 2.2.2. No debes utilizar versiones anteriores distintas a la 2.2.2 ya que tienen una vulnerabilidad de seguridad. Más información aquí.
Si, por alguna razón, necesita codificar el token de una manera diferente, puede inyectar cualquier implementación de NamshiJOSEBase64Encoder
en una instancia JWS
. Asimismo, JWS::load()
acepta dicha implementación como segundo argumento.
La biblioteca proporciona una clase JWT básica que implementa lo que se necesita solo para los tokens web JSON. Luego, la clase JWS extiende la clase JWT y agrega la implementación para firmar y verificar usando firmas web JSON. La clase SimpleJWS amplía la clase JWS base y agrega validación de un TTL e inclusión de notificaciones automáticas.
Se introdujo la capacidad de especificar un motor de cifrado. Se agregó soporte de PHPSecLib a la implementación OpenSSL existente.
Se agregó la capacidad de establecer propiedades personalizadas en el encabezado. Se movió la inclusión automática de ciertos reclamos en una clase SimpleJWS desde la clase JWS base.
Se movieron phpseclib y la extensión openssl como dependencias sugeridas.
Las pruebas se escriben usando PHPUnit para esta biblioteca. Después de realizar la instalación del compositor, puede ejecutar el siguiente comando para ejecutar pruebas:
./vendor/bin/phpunit
Esta biblioteca se ha inspirado en el trabajo inicial realizado por @ritou.