Olá,
por mais que queiramos poder trabalhar em todos os OSS do mundo, não usamos mais esta biblioteca ativamente. Isso significa que novos recursos/correções de bugs/etc só serão mesclados com base em solicitações pull de contribuidores externos , e recomendamos fortemente que você procure uma alternativa de longo prazo.
Se você está procurando uma biblioteca mantida ativamente, verifique firebase/php-jwt!
Esta biblioteca fornece uma implementação leve da especificação JWS (JSON Web Signature).
Esta biblioteca precisa do PHP 5.5+ e da biblioteca OpenSSL.
Ele foi testado usando PHP5.5
a PHP7.0
e HHVM
.
Você pode instalar a biblioteca diretamente do compositor/packagist:
"namshi/jose": "7.0.*"
Usá-lo é bastante simples: imagine que você deseja oferecer a um serviço a capacidade de autenticar um usuário por meio de um cookie, e o serviço é construído com javascript; o que você precisa fazer é gerar um JWS (depois de verificar as credenciais uma vez), armazená-lo como um cookie e passá-lo de seu aplicativo JavaScript sempre que desejar autenticar esse usuário.
Primeiro, gere o 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 ());
}
Então seu aplicativo JS pode usar o cookie disponível para executar chamadas autenticadas, sem enviar senhas ou credenciais.
Depois que uma solicitação for enviada, você só precisa verificar se é uma chamada 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: você pode omitir o segundo argumento do método isValid(), então José tentará validar o token com o algoritmo especificado no cabeçalho do token, embora isso possa expor você a alguns problemas de segurança.
Por enquanto recomendamos sempre definir explicitamente o algoritmo que você deseja usar para validar tokens.
Você pode achar que precisa usar esta biblioteca em um ambiente onde os wrappers do PHP para OpenSSL não funcionam ou o OpenSSL simplesmente não está instalado. Esta biblioteca usa OpenSSL para criptografar por padrão, mas você pode especificar que deseja usar PHPSecLib para uma implementação PHP pura de criptografia RSA.
Nestes casos, basta adicionar o parâmetro opcional 'SecLib'
ao construir um JWS:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
Agora você pode usar a implementação PHPSecLib da assinatura RSA. Se você usar uma chave privada protegida por senha, ainda poderá enviar a chave privada para usar na assinatura como uma string, desde que passe a senha como o segundo parâmetro no método sign
:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
Você também pode carregar um JWS usando a implementação PHPSecLib de verificação RSA:
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
Para validar o JWS, primeiro a assinatura é verificada com uma chave pública e depois verificaremos se o token expirou.
Para dar um TTL a um JWS, basta usar o valor exp
padrão na carga útil:
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
Você pode permitir JWSes inseguros definindo o sinalizador $allowUnsecure
ao carregar JWSes:
JWS :: load ( $ this -> jws -> getTokenString (), true );
Isso permite que os tokens assinados com os algoritmos 'none' passem, o que é algo que você provavelmente não deseja fazer. Proceda com cautela :)
JWSes inseguros estão desabilitados por padrão desde a versão 2.2.2. Você não deve usar versões anteriores diferentes da 2.2.2, pois elas apresentam uma vulnerabilidade de segurança. Mais informações aqui.
Se, por algum motivo, você precisar codificar o token de uma maneira diferente, poderá injetar qualquer implementação de NamshiJOSEBase64Encoder
em uma instância JWS
. Da mesma forma, JWS::load()
aceita tal implementação como segundo argumento.
A biblioteca fornece uma classe JWT base que implementa o que é necessário apenas para JSON Web Tokens. A classe JWS então estende a classe JWT e adiciona a implementação para assinatura e verificação usando JSON Web Signatures. A classe SimpleJWS estende a classe JWS base e adiciona validação de um TTL e inclusão de declarações automáticas.
Introduziu a capacidade de especificar um mecanismo de criptografia. Adicionado suporte de PHPSecLib à implementação OpenSSL existente.
Adicionada a capacidade de definir propriedades personalizadas no cabeçalho. Movida a inclusão automática de determinadas declarações em uma classe SimpleJWS da classe JWS base.
O phpseclib e a extensão openssl foram movidos como dependências sugeridas.
Os testes são escritos usando PHPUnit para esta biblioteca. Depois de fazer a instalação do compositor você pode executar o seguinte comando para executar os testes:
./vendor/bin/phpunit
Esta biblioteca foi inspirada no trabalho inicial realizado por @ritou.