你好呀,
尽管我们希望能够在世界上所有的 OSS 上工作,但我们不再主动使用这个库这意味着新功能/错误修复/等将仅根据外部贡献者的拉取请求进行合并,我们强烈建议您寻找长期替代方案。
如果您正在寻找一个积极维护的库,请检查 firebase/php-jwt!
该库提供了 JWS(JSON Web 签名)规范的轻量级实现。
该库需要 PHP 5.5+ 和 OpenSSL 库。
它已经使用PHP5.5
到PHP7.0
和HHVM
进行了测试。
您可以直接从composer / packagist安装该库:
"namshi/jose": "7.0.*"
使用它非常简单:假设您想要提供一项服务,使其能够通过 cookie 对用户进行身份验证,并且该服务是使用 javascript 构建的;您需要做的是生成一个 JWS(验证一次凭据后),将其存储为 cookie,然后每次您想要验证该用户时从 JavaScript 应用程序传递它。
首先,生成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 ());
}
然后,您的 JS 应用程序可以使用可用的 cookie 来执行经过身份验证的调用,而无需发送密码或凭据。
提交请求后,您只需验证它是否是有效的调用:
<?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:您可以省略 isValid() 方法的第二个参数,因此 jose 将尝试使用令牌标头中指定的算法来验证令牌,尽管这可能会让您遇到一些安全问题。
目前,我们建议始终明确设置要用于验证令牌的算法。
您可能会发现需要在 PHP 的 OpenSSL 包装器无法工作或根本未安装 OpenSSL 的环境中使用此库。该库默认使用 OpenSSL 进行加密,但您可以指定要使用 PHPSecLib 进行 RSA 加密的纯 PHP 实现。
在这些情况下,只需在构造 JWS 时添加可选的'SecLib'
参数即可:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
您现在可以使用 RSA 签名的 PHPSecLib 实现。如果您使用受密码保护的私钥,您仍然可以将私钥作为字符串提交用于签名,只要将密码作为第二个参数传递到sign
方法中即可:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
您还可以使用 RSA 验证的 PHPSecLib 实现加载 JWS:
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
为了验证 JWS,首先使用公钥验证签名,然后我们将检查令牌是否过期。
要为 JWS 提供 TTL,只需在有效负载中使用标准exp
值:
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
您可以通过在加载 JWSes 时设置$allowUnsecure
标志来允许不安全的 JWSes:
JWS :: load ( $ this -> jws -> getTokenString (), true );
这允许使用“无”算法签名的令牌通过,这是您可能不想做的事情。谨慎行事:)
从 2.2.2 版本开始,不安全的 JWS 默认被禁用。您不应使用 2.2.2 以外的早期版本,因为它们存在安全漏洞。更多信息请点击这里。
如果由于某种原因,您需要以不同的方式对令牌进行编码,则可以在JWS
实例中注入NamshiJOSEBase64Encoder
的任何实现。同样, JWS::load()
接受这样的实现作为第二个参数。
该库提供了一个基本 JWT 类,它实现了 JSON Web 令牌所需的功能。然后,JWS 类扩展 JWT 类并添加使用 JSON Web 签名进行签名和验证的实现。 SimpleJWS 类扩展了 JWS 基类,并添加了 TTL 验证和自动声明的包含。
引入了指定加密引擎的功能。向现有 OpenSSL 实现添加了对 PHPSecLib 的支持。
添加了在标头中设置自定义属性的功能。将某些声明从 JWS 基类自动包含到 SimpleJWS 类中。
将 phpseclib 和 openssl 扩展移动为建议的依赖项。
测试是使用 PHPUnit 为该库编写的。完成 Composer 安装后,您可以执行以下命令来运行测试:
./vendor/bin/phpunit
该库的灵感来自@ritou 所做的初始工作。