jwt.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. /**
  3. * User: shish
  4. * Date: 2019/11/20
  5. * Time: 23:21
  6. */
  7. namespace common\components;
  8. use biz\platform\services\WxOpenService;
  9. use Lcobucci\JWT\Builder;
  10. use Lcobucci\JWT\Parser;
  11. use Lcobucci\JWT\ValidationData;
  12. use Lcobucci\JWT\Signer\Key;
  13. use Lcobucci\JWT\Signer\Hmac\Sha256;
  14. use Yii;
  15. class jwt
  16. {
  17. //生成token
  18. public static function create($uniqueId)
  19. {
  20. $time = time();
  21. $signer = new Sha256();
  22. $salt = Yii::$app->params['secretKey'];
  23. $key = new Key($salt);
  24. $host = httpUtil::getHost();
  25. $sourceId = WxOpenService::getSourceId();
  26. $jwtId = $sourceId . '_' . $uniqueId;
  27. $token = (new Builder())->issuedBy($host)//发布者的url地址
  28. ->canOnlyBeUsedBy($host)//接受者的url地址
  29. ->identifiedBy($jwtId, true)//该jwt的唯一ID编号
  30. ->issuedAt($time)//该jwt的发布时间
  31. ->canOnlyBeUsedAfter($time)//该jwt的使用时间不能早于该时间
  32. ->expiresAt($time + 8640000)//该jwt销毁的时间
  33. ->set('uniqueId', $uniqueId)//设置一个变量
  34. ->sign($signer, $key)->getToken();
  35. $keyName = self::getKeyName($sourceId, $uniqueId);
  36. Yii::$app->redis->executeCommand('SET', [$keyName, $token]);
  37. return $token;
  38. }
  39. public static function getKeyName($sourceId, $uniqueId)
  40. {
  41. return 'JWT_' . $sourceId . '_' . $uniqueId;
  42. }
  43. //返回一个可用的token shish 2019.11.22
  44. public static function get($uniqueId)
  45. {
  46. //来源
  47. $sourceId = WxOpenService::getSourceId();
  48. $keyName = self::getKeyName($sourceId, $uniqueId);
  49. $cacheToken = Yii::$app->redis->executeCommand('GET', [$keyName]);
  50. $token = '';
  51. //从缓存中获取
  52. if (!empty($cacheToken)) {
  53. $tokenResource = (new Parser())->parse((string)$cacheToken);
  54. $data = new ValidationData();
  55. $r = $tokenResource->validate($data);
  56. $token = $r == false ? '' : $cacheToken;
  57. }
  58. if (empty($token)) {
  59. $token = self::create($uniqueId);
  60. }
  61. return $token;
  62. }
  63. //验证token
  64. public static function validate($token)
  65. {
  66. $token = (new Parser())->parse($token);
  67. //数据校验
  68. $data = new ValidationData();//使用当前时间来校验数据
  69. if (!$token->validate($data)) {
  70. Yii::info('token时间验证没有通过。token:' . $token);
  71. return 0;
  72. }
  73. //token校验
  74. $signer = new Sha256();//生成JWT时使用的加密方式
  75. $salt = Yii::$app->params['secretKey'];
  76. if (!$token->verify($signer, new Key($salt))) {
  77. Yii::info('token解密没有通过。token:' . $token);
  78. return 0;
  79. }
  80. $token->getHeaders(); // 获取JWT的Header(头部)信息
  81. $token->getClaims(); // 获取JWT的PayLoad(负载)信息
  82. $uniqueId = $token->getClaim('uniqueId');
  83. return $uniqueId;
  84. }
  85. //判断有没登陆并返回id shish 2019.11.22
  86. public static function getLoginId()
  87. {
  88. $header = httpUtil::getHeader();
  89. $token = isset($header['token']) ? $header['token'] : '';
  90. if (empty($token)) {
  91. return 0;
  92. }
  93. return self::validate($token);
  94. }
  95. public static function delToken($token, $uniqueId)
  96. {
  97. $sourceId = WxOpenService::getSourceId();
  98. $jwtId = $sourceId . '_' . $uniqueId;
  99. $host = httpUtil::getHost();
  100. $signer = new Sha256();//生成JWT时使用的加密方式
  101. $salt = Yii::$app->params['secretKey'];
  102. $signKey = new Key($salt);
  103. $token = (new Parser())->parse($token);
  104. //数据校验
  105. $data = new ValidationData();//使用当前时间来校验数据
  106. $data->setIssuer($host);
  107. $data->setAudience($host);
  108. $data->setId($jwtId);
  109. if (!$token->verify($signer, $signKey)) {
  110. Yii::info('token解密没有通过。token:' . $token);
  111. return false;
  112. }
  113. if (!$token->validate($data)) {
  114. Yii::info('token验证没有通过。token:' . $token);
  115. return false;
  116. }
  117. $token->getHeaders(); // 获取JWT的Header(头部)信息
  118. $token->getClaims(); // 获取JWT的PayLoad(负载)信息
  119. $returnId = $token->getClaim('uniqueId');
  120. if ($returnId != $uniqueId) {
  121. Yii::info('token验证出的id不是登陆用户id。token:' . $token);
  122. return false;
  123. }
  124. //设置为过期
  125. $data->setCurrentTime(time() + 600);
  126. return true;
  127. }
  128. }