• 技术文章 >后端开发 >php教程

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

    coldplay.xixicoldplay.xixi2020-06-09 10:12:04转载1940

    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 Lcobucci\JWT\Builder;
    use Lcobucci\JWT\Signer\Hmac\Sha256;
    $builder = new Builder();
    $signer = new Sha256();
    // 设置发行人
    $builder->setIssuer('http://example.com'); 
    // 设置接收人
    $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 Lcobucci\JWT\Signer\Hmac\Sha256;
    $parse = (new Parser())->parse($token);
    $signer = new Sha256();
    $parse->verify($signer,'签名key');// 验证成功返回true 失败false

    第二种:使用RSA和ECDSA签名

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

    use Lcobucci\JWT\Signer\Keychain;
    // 注意这里使用的sha256
    use Lcobucci\JWT\Signer\Rsa\Sha256; 
    $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 \Lcobucci\JWT\Signer\Rsa\Sha256();
    $keychain = new \Lcobucci\JWT\Signer\Keychain();
    $parse = new \Lcobucci\JWT\Parser();
    $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视频教程

    以上就是PHP使用JWT创建Token的实例详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:liqingbo,如有侵犯,请联系admin@php.cn删除
    专题推荐:Token,JWT
    上一篇:PHP源码加密方法实例详解 下一篇:php实现简单的登陆功能(附源码)
    线上培训班

    相关文章推荐

    • php array_filter函数的使用(详解)• php如何设置北京时间• use关键字在php中的使用(含代码)• PHP session_register函数(附详解)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网