当前位置:首页 > PHP教程 > php应用 > 列表

PHP使用JWT创建Token的实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-24 08:26:35 浏览: 评论:0 

PHP使用JWT创建Token简单示例

依赖

环境:php 5.5 以上 + OpenSSL扩展

lcobucci/JWT

可使用composer 安装

composer require lcobucci/jwt

也可以直接到 GitHub下载

GitHub地址: https://github.com/lcobucci/jwt

参数解释

iss (issuer)issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者

sub (Subject) 设置主题,类似于发邮件时的主题

aud (audience) 接收jwt的一方

exp (expire)token 过时间期

nbf (not before) 当前时间在nbf设定时间之前,该token无法使用

iat (issued at)token 创建时间

jti (JWT ID) 对当前token设置唯一标示

实例前准备

下面记录主要的依赖引用:

  1. define('DS', DIRECTORY_SEPARATOR); 
  2.  
  3. define('JWTPath', dirname(__FILE__) . DS); 
  4.  
  5. include_once JWTPath . 'Builder.php'
  6.  
  7. include_once JWTPath . 'Signer.php'
  8.  
  9. include_once JWTPath . 'Signer' . DS . 'Keychain.php'
  10.  
  11. include_once JWTPath . 'Signer' . DS . 'Rsa.php'
  12.  
  13. include_once JWTPath . 'Signer' . DS . 'Rsa' . DS . 'Sha256.php'

当然它们里面还有更多的引用需要你自己加,这个在你调试时根据错误提示一个个补就好了,这里就不多写了。

实例:

使用【lcobucci/JWT】产生 Token 的方式有两种,在这里我只试验了第二种。

第一种:使用秘钥签名生成 token

  1. use Lcobucci\JWT\Builder; 
  2.  
  3. use Lcobucci\JWT\Signer\Hmac\Sha256; 
  4.  
  5. $builder = new Builder(); 
  6.  
  7. $signer = new Sha256(); 
  8.  
  9. // 设置发行人 
  10.  
  11. $builder->setIssuer('http://example.com');  
  12.  
  13. // 设置接收人 
  14.  
  15. $builder->setAudience('http://example.org');  
  16.  
  17. // 设置id 
  18.  
  19. $builder->setId('4f1g23a12aa', true);  
  20.  
  21. // 设置生成token的时间 
  22.  
  23. $builder->setIssuedAt(time());  
  24.  
  25. // 设置在60秒内该token无法使用 
  26.  
  27. $builder->setNotBefore(time() + 60);  
  28.  
  29. // 设置过期时间 
  30.  
  31. $builder->setExpiration(time() + 3600);  
  32.  
  33. // 给token设置一个id 
  34.  
  35. $builder->set('uid', 1);  
  36.  
  37. // 对上面的信息使用sha256算法签名 
  38.  
  39. $builder->sign($signer'签名key'); 
  40.  
  41. // 获取生成的token 
  42.  
  43. $token = $builder->getToken(); 

验证 Token

  1. use Lcobucci\JWT\Signer\Hmac\Sha256; 
  2.  
  3. $parse = (new Parser())->parse($token); 
  4.  
  5. $signer = new Sha256(); 
  6.  
  7. $parse->verify($signer,'签名key');// 验证成功返回true 失败false 

第二种:使用RSA和ECDSA签名

RSA和ECDSA签名是基于公钥和私钥,所以必须使用私钥生成和验证使用

  1. use Lcobucci\JWT\Signer\Keychain; 
  2.  
  3. // 注意这里使用的sha256 
  4.  
  5. use Lcobucci\JWT\Signer\Rsa\Sha256;  
  6.  
  7. $signer = new Sha256(); 
  8.  
  9. $keychain = new Keychain(); 
  10.  
  11. $builder = new Builder(); 
  12.  
  13. $builder->setIssuer('http://example.com'); 
  14.  
  15. $builder->setAudience('http://example.org'); 
  16.  
  17. $builder->setId('4f1g23a12aa', true); 
  18.  
  19. $builder->setIssuedAt(time()); 
  20.  
  21. $builder->setNotBefore(time() + 60); 
  22.  
  23. $builder->setExpiration(time() + 3600); 
  24.  
  25. $builder->set('uid', 1); 
  26.  
  27. // 与上面不同的是这里使用的是你的私钥,并提供私钥的地址 
  28.  
  29. $builder->sign($signer$keychain->getPrivateKey('file://{私钥地址}')); 
  30.  
  31. $toekn = $builder->getToken(); 

最后还可以通过强制转换的形式来拿到你想要的纯字符串的 Token

$toekn = (string) $builder->getToken();

和前端的交互可以放在返回的 JSON 格式中通过参数带过去,也可以存放在 header Authorization 中。

验证 Token

  1. $signer = new \Lcobucci\JWT\Signer\Rsa\Sha256(); 
  2.  
  3. $keychain = new \Lcobucci\JWT\Signer\Keychain(); 
  4.  
  5. $parse = new \Lcobucci\JWT\Parser(); 
  6.  
  7. $parse->parse((string)$token); 
  8.  
  9. var_dump($token->verify($signer$keychain->getPublicKey(self::$dir . '/public.key'))); 
  10.  
  11. )) 

获取数据

因为数据部分可以直接获取到,不用解密。所以在验证token合法后直接读取即可,这也是不要在载体中存放敏感信息的原因。

  1. $parse = (new Parser())->parse($token); 
  2.  
  3. // 获取全部信息,返回一个数组, 
  4.  
  5. var_dump($parse->getClaims()); 
  6.  
  7. // 获取单条信息 
  8.  
  9. var_dump($parse->getClaim('aud'));

Tags: JWT PHP创建Token

分享到: