加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-06-24 13:15:05 所属栏目:PHP教程 来源:互联网
导读:PHP使用JWT创建Token简单示例 依赖 环境:php 5.5 以上 + OpenSSL扩展 lcobucci/JWT 可使用composer 安装 composer require lcobucci/jwt 也可以直接到 GitHub下载 GitHub地址: https://github.com/lcobucci/jwt 参数解释 iss (issuer)issuer 请求实体,
  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设置唯一标示
 
  实例前准备
 
  下面记录主要的依赖引用:
 
  define('DS', DIRECTORY_SEPARATOR);
  
  define('JWTPath', dirname(__FILE__) . DS);
  
  include_once JWTPath . 'Builder.php';
  
  include_once JWTPath . 'Signer.php';
  
  include_once JWTPath . 'Signer' . DS . 'Keychain.php';
  
  include_once JWTPath . 'Signer' . DS . 'Rsa.php';
  
  include_once JWTPath . 'Signer' . DS . 'Rsa' . DS . 'Sha256.php';
  当然它们里面还有更多的引用需要你自己加,这个在你调试时根据错误提示一个个补就好了,这里就不多写了。
 
  实例:
 
  使用【lcobucci/JWT】产生 Token 的方式有两种,在这里我只试验了第二种。
 
  第一种:使用秘钥签名生成 token
 
  use LcobucciJWTBuilder;
  
  use LcobucciJWTSignerHmacSha256;
  
  $builder = new Builder();
  
  $signer = new Sha256();
  
  // 设置发行人
  
  $builder->setIssuer('http://example.com');  
  
  // 设置接收人
  PHP使用JWT组建Token的实例详解
  $builder->setAudience('http://example.org');  
  
  // 设置id
  
  $builder->setId('4f1g23a12aa', true);  
  
  // 设置生成token的时间
  
  $builder->setIssuedAt(time());  
  
  // 设置在60秒内该token无法使用
  
  $builder->setNotBefore(time() + 60);  
  
  // 设置过期时间
  
  $builder->setExpiration(time() + 3600);  
  
  // 给token设置一个id
  
  $builder->set('uid', 1);  
  
  // 对上面的信息使用sha256算法签名
  
  $builder->sign($signer, '签名key');
  
  // 获取生成的token
  
  $token = $builder->getToken();
  验证 Token
 
  use LcobucciJWTSignerHmacSha256;
  
  $parse = (new Parser())->parse($token);
  
  $signer = new Sha256();
  
  $parse->verify($signer,'签名key');// 验证成功返回true 失败false
  第二种:使用RSA和ECDSA签名
 
  RSA和ECDSA签名是基于公钥和私钥,所以必须使用私钥生成和验证使用
 
  use LcobucciJWTSignerKeychain;
  
  // 注意这里使用的sha256
  
  use LcobucciJWTSignerRsaSha256;  
  
  $signer = new Sha256();
  
  $keychain = new Keychain();
  
  $builder = new Builder();
  
  $builder->setIssuer('http://example.com');
  
  $builder->setAudience('http://example.org');
  
  $builder->setId('4f1g23a12aa', true);
  
  $builder->setIssuedAt(time());
  
  $builder->setNotBefore(time() + 60);
  
  $builder->setExpiration(time() + 3600);
  
  $builder->set('uid', 1);
  
  // 与上面不同的是这里使用的是你的私钥,并提供私钥的地址
  
  $builder->sign($signer, $keychain->getPrivateKey('file://{私钥地址}'));
  
  $toekn = $builder->getToken();
  最后还可以通过强制转换的形式来拿到你想要的纯字符串的 Token
 
  $toekn = (string) $builder->getToken();
 
  和前端的交互可以放在返回的 JSON 格式中通过参数带过去,也可以存放在 header Authorization 中。
 
  验证 Token
 
  $signer = new LcobucciJWTSignerRsaSha256();
  
  $keychain = new LcobucciJWTSignerKeychain();
  
  $parse = new LcobucciJWTParser();
  
  $parse->parse((string)$token);
  
  var_dump($token->verify($signer, $keychain->getPublicKey(self::$dir . '/public.key')));
  
  ))
  获取数据
 
  因为数据部分可以直接获取到,不用解密。所以在验证token合法后直接读取即可,这也是不要在载体中存放敏感信息的原因。
 
  $parse = (new Parser())->parse($token);
  
  // 获取全部信息,返回一个数组,
  
  var_dump($parse->getClaims());
  
  // 获取单条信息
  
  var_dump($parse->getClaim('aud'))。
 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读