jwt.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 + 8640000)//该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. Yii::info('token时间验证没有通过。token:' . $token);
  67. return 0;
  68. }
  69. //token校验
  70. $signer = new Sha256();//生成JWT时使用的加密方式
  71. $salt = Yii::$app->params['secretKey'];
  72. if (!$token->verify($signer, new Key($salt))) {
  73. Yii::info('token解密没有通过。token:' . $token);
  74. return 0;
  75. }
  76. $token->getHeaders(); // 获取JWT的Header(头部)信息
  77. $token->getClaims(); // 获取JWT的PayLoad(负载)信息
  78. $userId = $token->getClaim('userId');
  79. return $userId;
  80. }
  81. //判断有没登陆并返回userId shish 2019.11.22
  82. public static function checkLogin()
  83. {
  84. $header = httpUtil::getHeader();
  85. $token = isset($header['token']) ? $header['token'] : '';
  86. if (empty($token)) {
  87. return 0;
  88. }
  89. return self::validate($token);
  90. }
  91. }