QQ登录

只需一步,快速开始

PHP 笔记:使用 JWT 创建 Token

依梦瑶 发表于 2019-5-23 17:40:48 | 显示全部楼层 |阅读模式

今天在做一个需求是用 PHP 创建一个 JWT 类型的 Token ,要问什么是 JWT 自己百度或谷歌去吧,这点功夫都懒得下的话就自己打自己一下吧。这回还是头一次遇到做这个需求,解决的过程还是有点头疼的,但成功之后就感觉到收获了。现将解决的过程记录下来。

依赖

  • 环境:php 5.5 以上 + OpenSSL扩展
  • lcobucci/JWT

非 windows 环境的可使用 composer 安装(因为我在是 Windows 环境下做的实验)

  1. composer require lcobucci/jwt
复制代码

我还是比较推荐直接到 GitHub 下载完整包比较稳妥。

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

下载时请注意:不要不加思索的就点【 Clone or download 】按钮,这样你下载的是 【master】分支的版本,这个版本虽然是最新的,但并不代表就稳定。

1.jpg

参数解释

在使用之前先了解一下

1.jpg

实例前准备

在写实例之前首先要阐述一下几点,因为这也是我在研究过程中遇到的坑。

在从 GITHUB 上面下载过来的完整包,其实并不完整,直接拿到项目中用会出现各个独立命名类之间的依赖没有引用语句,这个是要你自己加的。我不知道其他的环境是不是这样,至少我在 windows 中做研究是这样的。

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

  1. define('DS', DIRECTORY_SEPARATOR);
  2. define('JWTPath', dirname(__FILE__) . DS);
  3. include_once JWTPath . 'Builder.php';
  4. include_once JWTPath . 'Signer.php';
  5. include_once JWTPath . 'Signer' . DS . 'Keychain.php';
  6. include_once JWTPath . 'Signer' . DS . 'Rsa.php';
  7. include_once JWTPath . 'Signer' . DS . 'Rsa' . DS . 'Sha256.php';
复制代码

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

记:还有一种可以解决上面所说的引用问题,那就量【spl_autoload_register】只因之前较少用所以没有发现它的存在,使用它也能解决上述问题,这也是后来发现的,但因工作上的原因没有及时做记载,今天发现了所以及时补上。代码如下:

  1. spl_autoload_register(function ($class_name) {
  2.     $class_name = substr($class_name, strlen('Lcobucci\\JWT\\'));
  3.     $path = dirname(__FILE__) . DS . $class_name . '.php';
  4.     /** @noinspection PhpIncludeInspection */
  5.     !file_exists($path) ?: require_once $path;
  6. //    echo $path . "\r\n";
  7. });
复制代码

实例

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

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

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

验证 Token

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

第二种:使用RSA和ECDSA签名

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

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

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

  1. $toekn = (string) $builder->getToken();
复制代码

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

验证 Token

  1. $signer = new \Lcobucci\JWT\Signer\Rsa\Sha256();
  2. $keychain = new \Lcobucci\JWT\Signer\Keychain();
  3. $parse = new \Lcobucci\JWT\Parser();
  4. $parse->parse((string)$token);
  5. var_dump($token->verify($signer, $keychain->getPublicKey(self::$dir . '/public.key')));
  6. ))
复制代码

获取数据

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

  1. $parse = (new Parser())->parse($token);
  2. // 获取全部信息,返回一个数组,
  3. var_dump($parse->getClaims());
  4. // 获取单条信息
  5. var_dump($parse->getClaim('aud'));
复制代码
验证有效性的工具:https://jwt.io/
在 GITHUB 上还有一种 PHP-JWT 资源:https://github.com/firebase/php-jwt
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精华推荐
  • 探究!做设计之前的“构思”

    探究!做设计之前的“构思”

  • 汉字之美!中文字体设计原则

    汉字之美!中文字体设计原则

  • 一支互联网雪糕的诞生

    一支互联网雪糕的诞生

  • 设计灵感来自何处?

    设计灵感来自何处?

  • 自行车停靠架和旧自行车变废为宝家居创意作品大全

    自行车停靠架和旧自行车变废为宝家居创意作

  • 造车生死局:要么转型,要么死

    造车生死局:要么转型,要么死

  • 从欠8千万到年赚8亿

    从欠8千万到年赚8亿

  • 一座非典型五线小城的日常

    一座非典型五线小城的日常

QQ客服热线
QQ:1090281100 周一至周日:09:00 - 21:00
WeChat:duzhe1069
Email:kaixin1069@vip.qq.com

优创意logo

勿要吝啬你无形资产,请为创新续源,知识、点子、灵感、经验、需求等均是创新源泉,你不经意的一句话将是另一个人的灵感。明天的明天,还有明天,我们应该把握今天,每一个今天,都有一个新的事物在出现,今天的漠视明天的落后,不浪费每一个学习的时刻,学习助力非凡。

技术支持 Discuz! X3.4 - 3.5 beta © 2001-2019 Comsenz Inc.

小黑屋|手机版|优创意 ( 粤ICP备16085288号-1 )|申请友链

粤公网安备 44011102001144 号 GMT+8, 2020-10-31 00:51 , Processed in 0.093924 second(s), 28 queries , Gzip On.

快速回复 返回顶部 返回列表