作曲家需要firebase/php-jwt
作曲家需要文胸
使用 火力基地 \ JWT公司 \ JWT公司 ; 使用 火力基地 \ JWT公司 \ 钥匙 ; $ 钥匙 = '示例键' ; $ 有效载荷 = [ “iss” => ' http://example.org ' , “aud” => ' http://example.com ' , “iat” => 1356999524 , “nbf” => 1357000000 ]; /**
*重要事项:
*必须为应用程序指定支持的算法。 请参见
* https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
*以获取符合规范的算法列表。
*/
$ 联合工作小组 = JWT公司 :: 编码 ( $ 有效载荷 , $ 钥匙 , 'HS256' ); $ 已解码 = JWT公司 :: 解码 ( $ 联合工作小组 , 新的 钥匙 ( $ 钥匙 , “HS256” )); 打印(r)( $ 已解码 ); //将stdClass作为第三个参数传入,以获取解码的头值
$ 已解码 = JWT公司 :: 解码 ( $ 联合工作小组 , 新的 钥匙 ( $ 钥匙 , “HS256” ), $ 标题 = 新的 标准分类()); 打印(r)( $ 标题 ); /*
注意:这将是一个对象,而不是关联数组。 得到
关联数组,则需要按如下方式进行强制转换:
*/
$ 解码数组 = ( 阵列 ) $ 解码的 ; /**
*您可以添加一个回旋余地,以说明在这两个时间段之间存在时钟偏差时间
*签名和验证服务器。 建议此回旋余地应
*不超过几分钟。
*
*资料来源: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#nbfDef
*/
JWT公司 :: $ 回旋余地 = 60 ; //$leeway(秒)
$ 已解码 = JWT公司 :: 解码 ( $ 联合工作小组 , 新的 钥匙 ( $ 钥匙 , “HS256” ));
使用 火力基地 \ JWT公司 \ JWT公司 ; $ 钥匙 = '示例键' ; $ 有效载荷 = [ “iss” => ' http://example.org ' , “aud” => ' http://example.com ' , “iat” => 1356999524 , “nbf” => 1357000000 ]; $ 标题 = [ 'x-forwarded-for' => “www.google.com” ]; //对JWT字符串中的标头进行编码
$ 联合工作小组 = JWT公司 :: 编码 ( $ 有效载荷 , $ 钥匙 , “HS256” , 无效 , $ 标题 ); //解码JWT字符串中的标头,但不进行验证
//**重要事项**:由于JWT尚未得到验证,此操作易受攻击。
//这些标头可以是攻击者发送的任何值。
列表 ( $ 封头B64 , $ 有效载荷B64 , $ 信号发生器 )=爆炸( '.' , $ 联合工作小组 ); $ 已解码 =json代码(base64代码( $ 封头B64 ), 真的 ); 打印(r)( $ 已解码 );
使用 火力基地 \ JWT公司 \ JWT公司 ; 使用 火力基地 \ JWT公司 \ 钥匙 ; $ 私钥 = <<<爆炸物处理
-----开始RSA私钥-----
MIIEowIBAAKCAQEAuzWHNM5f+amCjQztc5QTfJfzCC5J4nuW+L/aOxZ4f8J3Frew
M2c/dufrnmedsApb0By7WhaHlcqCh/ScAPyJhzmPYLae7bTVro3hok0zDITR8F6S
JGL42JAEUk+ILkPI+DONM0+3vzk6Kvfe548tu4czCuqU8BGVOlnp6IqBHhAswNMM公司
78位/2z0CjPM4tbeXqSTTbNkXRboxjU29vSopcT51koWOgiTf3C7nJUoMWZHZI5
HqnIhPAG9yv8HAgNk6CMk2CadVHDo4IxjxTzTTqo1SCSH2pooJl9O8at6kkRYsrZ公司
WwsKlOFE2LUce7ObnXsYihStBUDoeBQlGG/BwQIDAQABAoIBAFtGaOqNKGwggn9k
6yzr6GhZ6Wt2rh1Xpq8XUz514UBhPxD7dFRLpbzCrLVpzY80LbmVGJ9+1pJozyWc
VKeCeUdNwbqkr240Oe7GTFmGjDoxU+5/HX/SJYPpC8JZ9oqgEA87iz+WQX9hVoP2
oF6EB4ckDvXmk8FMwVZW2l2/kd5mrEVbDaXKxhvUDf52iVD+sGIlTif7mBgR99/b
c3qiCnxCMmfYUnT2eh7Vv2LhCR/G9S6C3R4lA71rEyiU3KgsGfg0d82/XWXbegJW
h3QbWNtQLxTuIvLq5aAryV3PfaHlPgdgK0ft6ocU2de标签Fka3nfVEyC7IUsNTK
bq6nhAECgYEA7d/0DPOIaItl/8BWKyCuAHMs47j0wlGbBSHdJIiS55akMvnAG0M
39y22Qqfzh1at9kBFeYeFIIU82ZLF3xOcE3z6pJZ4Byvx4BYdXH77odo9uVK9s1l
3T3BlMcqd1hvZLMS7dviyH79jZo4CXSHiKzc7pQ2YfK5eKxKqONeXuECgYEAyXlG
沃诺/YTb1IBei9HwaccnQ/1HRn6MvfDjb7JJDIBhNClGPt6xRlzBbSZ73c2QEC
6Fu9h36K/HZ2qcLd2bXiNyhIV7b6tVKk+0Psoj0dL9EbhsD1OsmE1nTPyAc9XZbb
OPYxy+dpBCUA8/1U9+uiFoCa7mIbWcSQ+39gHuECgYAz82pQfct30aH4JiBrkNqP
nJfRq05UY70uk5k1u0ikLTRoVS/hJu/d4E1Kv4hBMqYCavFSwAwnvHUo51lVCr/y
xQOVYlsgnwBg2MX4+GjmIkqpSVCC8D7j/73MaWb746OIYZervQ8dbKahi2HbpsiG
8AHcVSA/agxZr38qvWV54QKBgCD5TlDE8x18AuTGQ9FjxAAd7uD0kbXNz2vUYg9L
hFL5tyL3aAAtUrUw4xhd9IuysRhW/53dU+FsG2dXdJu6CxHjlyEpUJl2iZu/j15型
YnMzGWHIEX8+eWRDsw/+Ujtko/B7TinGcWPz3cYl4EAOiCeDUyXnqnO1btCEUU44公司
DJ1BAoGBAJuPD27ErTSVtId90+M4zFPNibFP50KprVdc8CR37BE7r8vuGgNYXmnI
RLnGP9p3pVgFCktORuYS2J/6t84I3+A17nEOB4xvhTLeAiAW/uTQOUmNicOP4Ek
2MsLL2kHgL8bLTmvXV4FX+PXphrDKg1XxzOYn0otuoqdAQrkK4og
-----结束RSA私钥-----
爆炸物处理 ; $ 公共密钥 = <<<爆炸物处理
-----开始公钥-----
MIIBIjANBgkqhkiG9w0BAQEFAOCAQ8AMIIBCgKCAQEAuzWHNM5f+amCjQztc5QT
fJfzCC5J4nuW+L/aOxZ4f8J3FrewM2c/dufrnmedsApb0By7WhaHlcqCh/ScAPyJ
hzkPYLae7bTVro3hok0zDITR8F6SJGL42JAEUk+ILkPI+DONM0+3vzk6Kvfe548t公司
u4czCuqU8BGVOlnp6IqBHhAswNMM78pos/2z0CjPM4tbeXqSTTbNkXRboxjU29vS
opcT51koWOgiTf3C7nJUoMWZHZI5HqnIhPAG9yv8HAgNk6CMk2CadVHDo4IxjxTz
TTqo1SCSH2pooJl9O8at6kkRYSrZWwsKLOFE2LUce7ObnXsYihStBUDoeBQLGGG/B
wQIDAQAB公司
-----结束公钥-----
爆炸物处理 ; $ 有效载荷 = [ “iss” => '示例.org' , 'aud' => '示例.com' , “iat” => 1356999524 , “nbf” => 1357000000 ]; $ 联合工作小组 = JWT公司 :: 编码 ( $ 有效载荷 , $ 私钥 , “RS256” ); 回声 " 编码: \n“.打印_( $ 联合工作小组 , 真的 ) . “\n”; $ 已解码 = JWT公司 :: 解码 ( $ 联合工作小组 , 新的 钥匙 ( $ 公共密钥 , “RS256” )); /*
注意:这将是一个对象,而不是关联数组。 得到
关联数组,则需要按如下方式进行强制转换:
*/
$ 解码数组 = ( 阵列 ) $ 已解码 ; 回声 " 解码: \n“.打印_( $ 解码数组 , 真的 ) . “\n”;
使用 火力基地 \ JWT公司 \ JWT公司 ; 使用 火力基地 \ JWT公司 \ 钥匙 ; //您的密码短语
$ 密码短语 = “[YOUR_PASSPHRASE]” ; //带有密码短语的私钥文件
//可以使用“ssh-keygen-t rsa-m pem”生成
$ 私有密钥文件 = “/path/to/key-with-passphrase.pem” ; //创建“resource”类型的私钥
$ 私钥 =openssl_pkey_get_private( 文件获取内容( $ 私有密钥文件 ), $ 密码短语 ); $ 有效载荷 = [ “iss” => '示例.org' , “aud” => 'example.com' , “iat” => 1356999524 , “nbf” => 1357000000 ]; $ 联合工作小组 = JWT公司 :: 编码 ( $ 有效载荷 , $ 私钥 , “RS256” ); 回声 " 编码: \n英寸.print_r( $ 联合工作小组 , 真的 ) . “\n”; //从私钥中获取公钥,或从文件中提取。
$ 公共密钥 =打开ssl_pkey_get_details( $ 私钥 )[ “密钥” ]; $ 已解码 = JWT公司 :: 解码 ( $ 联合工作小组 , 新的 钥匙 ( $ 公共密钥 , “RS256” )); 回声 " 解码: \n“.打印_(( 阵列 ) $ 已解码 , 真的 ) . “\n”;
使用 火力基地 \ JWT公司 \ JWT公司 ; 使用 火力基地 \ JWT公司 \ 钥匙 ; //公钥和私钥应采用Base64编码。 最后
//使用非空行,以便可以使用
//钠_加密_签名_密钥对()。 其他工具生成的密钥可能
//需要进行调整以匹配libsodine预期的输入。
$ 密钥对 =钠_加密_签名_密钥对(); $ 私钥 =base64_encode(钠加密签名密钥( $ 密钥对 )); $ 公共密钥 =base64_encode(钠加密签名公开( $ 密钥对 )); $ 有效载荷 = [ “iss” => '示例.org' , “aud” => '示例.com' , “iat” => 1356999524 , “nbf” => 1357000000 ]; $ jwt公司 = JWT公司 :: 编码 ( $ 有效载荷 , $ 私钥 , “EdDSA” ); 回声 " 编码: \n“.打印_( $ 联合工作小组 , 真的 ) . “\n”; $ 已解码 = JWT公司 :: 解码 ( $ 联合工作小组 , 新的 钥匙 ( $ 公共密钥 , “EdDSA” )); 回声 " 解码: \n“.打印_(( 阵列 ) $ 已解码 , 真的 ) . “\n”;
使用 火力基地 \ JWT公司 \ JWT公司 ; 使用 火力基地 \ JWT公司 \ 钥匙 ; //前面示例中的RSA密钥示例
//$privateKey1=“…”;
//$publicKey1=“…”;
//上一示例中的EdDSA密钥示例
//$privateKey2=“…”;
//$publicKey2=“…”;
$ 有效载荷 = [ “iss” => '示例.org' , “aud” => '示例.com' , “iat” => 1356999524 , “nbf” => 1357000000 ]; $ jwt1型 = JWT公司 :: 编码 ( $ 有效载荷 , $ 私钥1 , “RS256” , “kid1” ); $ jwt2型 = JWT公司 :: 编码 ( $ 有效载荷 , $ 私钥2 , “EdDSA” , “kid2” ); 回声 " 编码1: \n英寸.print_r( $ jwt1型 , 真的 ) . “\n”; 回声 " 编码2: \n“.打印_( $ jwt2型 , 真的 ) . “\n”; $ 钥匙 = [ “kid1” => 新的 钥匙 ( $ 公共密钥1 , “RS256” ), “kid2” => 新的 钥匙 ( $ 公共密钥2 , “EdDSA” ), ]; $ 解码1 = JWT公司 :: 解码 ( $ jwt1型 , $ 钥匙 ); $ 解码2 = JWT公司 :: 解码 ( $ jwt2型 , $ 钥匙 ); 回声 " 解码1: \n“.打印_(( 阵列 ) $ 解码1 , 真的 ) . “\n”; 回声 " 解码2: \n“.打印_(( 阵列 ) $ 解码2 , 真的 ) . “\n”;
使用 火力基地 \ JWT公司 \ JWK公司 ; 使用 火力基地 \ JWT公司 \ JWT公司 ; //钥匙组。 需要“keys”键。 例如,对
//此终结点: https://www.gstatic.com/iap/verify/public_key-jwk
$ jwks公司 = [ “密钥” => []]; //JWK::parseKeySet($jwks)向Firebase\JWT\Key返回**kid**的关联数组
//对象。 将其作为第二个参数传递给JWT::decode。
JWT公司 :: 解码 ( $ 有效载荷 , JWK公司 :: 解析键集 ( $ jwks公司 ));
缓存结果以提高性能。 如果请求了无法识别的密钥,则会刷新缓存,以适应密钥旋转。 如果启用速率限制,JWKS URI每秒发出的请求不会超过10个。
使用 火力基地 \ JWT公司 \ 缓存密钥集 ; 使用 火力基地 \ JWT公司 \ JWT公司 ; //要从中缓存结果的JWKS的URI
$ jwksUri公司 = ' https://www.gstatic.com/iap/verify/public_key-jwk ' ; //创建HTTP客户端(可以是任何PSR-7兼容的HTTP客户端)
$ http客户端 = 新的 味觉Http \ 顾客 (); //创建HTTP请求工厂(可以是任何PSR-17兼容的HTTP请求工厂)
$ httpFactory(http工厂) = 新的 口香糖Http \ 磅/平方英寸 \ HttpFactory(Http工厂) (); //创建缓存项池(可以是任何PSR-6兼容的缓存项池)
$ cacheItemPool(缓存项池) = Phpfastcache公司 \ 缓存管理器 :: 获取实例 ( '文件' ); $ 关键帧集 = 新的 缓存密钥集 ( $ jwksUri公司 , $ http客户端 , $ http工厂 , $ cacheItemPool(缓存项池) , 无效 , //$expiresAfter int seconds将JWKS设置为expire
真的 //$rateLimit true可在查找无效密钥时启用10 RPS的速率限制 ); $ 联合工作小组 = “eyJhbGci…” ; //一些JWT由上面$jwkUri中的密钥签名
$ 已解码 = JWT公司 :: 解码 ( $ jwt公司 , $ 关键帧集 );
使用 火力基地 \ JWT公司 \ JWT公司 ; 使用 火力基地 \ JWT公司 \ 签名无效异常 ; 使用 火力基地 \ JWT公司 \ 有效异常之前 ; 使用 火力基地 \ JWT公司 \ 过期异常 ; 使用 域异常 ; 使用 无效参数异常 ; 使用 意外值异常 ; 尝试 { $ 已解码 = JWT公司 :: 解码 ( $ 有效载荷 , $ 钥匙 ); } 抓住 ( 无效参数异常 $ e(电子) ) { //提供的密钥/密钥数组为空或格式不正确。 } 抓住 ( 域异常 $ e(电子) ) { //提供的算法不受支持或
//提供的密钥无效或
//openSSL或libnadio or中抛出未知错误
//libsodium是必需的,但不可用。 } 抓住 ( 签名无效异常 $ e(电子) ) { //提供的JWT签名验证失败。 } 抓住 ( 有效异常之前 $ e(电子) ) { //前提是JWT试图在“nbf”索赔之前使用或
//假设JWT试图在“iat”索赔之前使用。 } 抓住 ( 过期异常 $ e(电子) ) { //假设JWT试图在“exp”声明之后使用。 } 抓住 ( 意外值异常 $ e(电子) ) { //提供的JWT格式不正确或
//提供的JWT缺少算法/使用了不支持的算法或
//提供的JWT算法与提供的密钥OR不匹配
//在密钥/密钥数组中提供的密钥ID为空或无效。 }
使用 火力基地 \ JWT公司 \ JWT公司 ; 使用 意外值异常 ; 尝试 { $ 已解码 = JWT公司 :: 解码 ( $ 有效载荷 , $ 钥匙 ); } 抓住 ( 逻辑异常 $ e(电子) ) { //与环境设置或格式错误的JWT密钥有关的错误 } 抓住 ( 意外值异常 $ e(电子) ) { //与JWT签名和索赔有关的错误 }
//返回类型为stdClass
$ 已解码 = JWT公司 :: 解码 ( $ 有效载荷 , $ 钥匙 ); //强制转换为数组
$ 已解码 =json_decode(json_encode)( $ 解码的 ), 真的 );
$pear安装PHPUnit $phpunit--配置phpunit.xml.dist Sebastian Bergmann编写的PHPUnit 3.7.10。 ..... 时间:0秒,内存:2.50Mb OK(5个测试,5个断言)