jwt.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. /**
  3. * User: shish
  4. * Date: 2019/11/20
  5. * Time: 23:21
  6. */
  7. namespace common\components;
  8. use Lcobucci\JWT\Builder;
  9. use Lcobucci\JWT\Parser;
  10. use Lcobucci\JWT\ValidationData;
  11. use Lcobucci\JWT\Signer\Key;
  12. use Lcobucci\JWT\Signer\Hmac\Sha256;
  13. use Yii;
  14. class jwt
  15. {
  16. //生成token
  17. public static function create($sourceId, $userId)
  18. {
  19. $time = time();
  20. $signer = new Sha256();
  21. $salt = Yii::$app->params['secretKey'];
  22. $key = new Key($salt);
  23. $host = httpUtil::getHost();
  24. $uniqueId = $sourceId . '_' . $userId;
  25. $token = (new Builder())->issuedBy($host)//发布者的url地址
  26. ->canOnlyBeUsedBy($host)//接受者的url地址
  27. ->identifiedBy($uniqueId, true)//该jwt的唯一ID编号
  28. ->issuedAt($time)//该jwt的发布时间
  29. ->canOnlyBeUsedAfter($time)//该jwt的使用时间不能早于该时间
  30. ->expiresAt($time + 3600)//该jwt销毁的时间
  31. ->set('userId', $userId)//设置一个变量
  32. ->sign($signer, $key)->getToken();
  33. $keyName = self::getKeyName($sourceId, $userId);
  34. Yii::$app->redis->executeCommand('SET', [$keyName, $token]);
  35. return $token;
  36. }
  37. public static function getKeyName($sourceId, $userId)
  38. {
  39. return 'JWT_' . $sourceId . '_' . $userId;
  40. }
  41. //返回一个可用的token shish 2019.11.22
  42. public static function get($sourceId, $userId)
  43. {
  44. $keyName = self::getKeyName($sourceId, $userId);
  45. $cacheToken = Yii::$app->redis->executeCommand('GET', [$keyName]);
  46. $token = '';
  47. //从缓存中获取
  48. if (!empty($cacheToken)) {
  49. $tokenResource = (new Parser())->parse((string)$cacheToken);
  50. $data = new ValidationData();
  51. $r = $tokenResource->validate($data);
  52. $token = $r == false ? '' : $cacheToken;
  53. }
  54. if (empty($token)) {
  55. $token = self::create($sourceId, $userId);
  56. }
  57. return $token;
  58. }
  59. //验证token
  60. public static function validate($token)
  61. {
  62. $token = (new Parser())->parse($token);
  63. //数据校验
  64. $data = new ValidationData(); // 使用当前时间来校验数据
  65. if (!$token->validate($data)) {
  66. return ['code' => 1];
  67. }
  68. //token校验
  69. $signer = new Sha256();//生成JWT时使用的加密方式
  70. $salt = Yii::$app->params['secretKey'];
  71. if (!$token->verify($signer, new Key($salt))) {
  72. return ['code' => 1];
  73. }
  74. $token->getHeaders(); // 获取JWT的Header(头部)信息
  75. $token->getClaims(); // 获取JWT的PayLoad(负载)信息
  76. $userId = $token->getClaim('userId');
  77. return ['code' => 0, 'data' => ['userId' => $userId]];
  78. }
  79. }