JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。今天给大家封装一个JWT的类,以及调用用法。
小编环境:laravel php7 composer
第一件事情先搞一块JWT的插件
我在https://jwt.io看中了这款:
https://github.com/lcobucci/jwt/blob/3.3/README.md 可以根据自己实际情况选择适合自己的版本。本案例是基于此插件。
下载安装jwt:
composer require lcobucci/jwt
选择自己自定义组件封装路径 我的是:app/Common/Auth/下,建立JwtAuth类
/**
* Created by PhpStorm.
* User: zhaoxinglu
* Date: 2019/7/19
* Time: 14:44
*/
namespace App\Common\Auth;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key;
use Lcobucci\JWT\ValidationData;
class JwtAuth
{
/**
* @var 单例限制
*/
static private $instance=null;
/**
* @var 秘钥信息
* 编码秘钥
* 解码秘钥
*/
private $token;
private $decodetoken;
/**
* @var头信息
* 发布者
* 接受者
* 识别码
* 有效周期
*/
private $iss = "Phor";
private $aud = "App";
private $ident = "Esint";
private $effective_time = 60*60;
/**
* @var
* 加密信息
*/
public $uid;
//多个加密信息
/**
* @var 秘钥
*/
private $secret = "ljbpyshagcssjcsa";
/**
* @return JwtAuth|单例限制
*/
static public function getInstance()
{
if (is_null(self::$instance))
{
self::$instance = new self();
}
return self::$instance;
}
/**
* JwtAuth constructor. 私有化构造函数 单例
*/
private function __construct()
{
}
/**
* 私有化克隆函数
*/
private function __clone()
{
// TODO: Implement __clone() method.
}
/**
* @param $uid
* 初始化uid
*/
public function setUid($uid)
{
$this->uid = $uid;
}
/**
* @return string
* 调用token
*/
public function get_token()
{
$this->encode();
return (string)$this->token;
}
/**
* @return 秘钥信息|\Lcobucci\JWT\Token
* 编码token
*/
public function encode()
{
$signer = new Sha256();
$time = time();
$this->token = (new Builder())
->issuedBy($this->iss) //颁发者
->permittedFor($this->aud) // 接受者
->identifiedBy($this->ident, true) // 识别码
->issuedAt($time) // 颁发时间 (iat claim)
->canOnlyBeUsedAfter($time) //可用时间(nbf claim)
->expiresAt($time + $this->effective_time) //失效时间(exp claim)
->withClaim('uid', $this->uid) // 填充加密 "uid" // 填充加密 "uid" 多参数继续操作此方法
->getToken($signer, new Key($this->secret)); // 返回token 加密方式Sha256 秘钥:secrect
return $this->token;
}
/**
* @param $token
* 解码token
*/
public function setToken($token)
{
$this->token = (new Parser())->parse((string) $token);
$this->decode();
}
/**
* 解码加密信息
*/
public function decode(){
$this->uid = $this->token->getClaim('uid');//多参数这里也要添加多参数解码token
}
/**
* @return mixed
* 检验token信息 是否过期等
*/
public function validate()
{
$data = new ValidationData();
$data->setIssuer($this->iss);
$data->setAudience($this->aud);
$data->setId($this->ident);
$data->setCurrentTime(time());
return $this->token->validate($data);
}
/**
* @return mixed
* 验证token加密方式 以及秘钥
*/
public function verify()
{
$signer = new Sha256();
return $this->token->verify($signer, new Key($this->secret));
}
}
调用: 业务层控制器调用
1.引用生成token
$jwt = JwtAuth::getInstance();
$jwt->setUid($‘用户uid’);
$token = $jwt->get_token();
2.检验token
假设用户发送过来的token 存入$token
$jwt = JwtAuth::getInstance();
$jwt->setToken($token);
var_dump($jwt->validate());//检验token是否过期等
var_dump($jwt->verify());//检验加密以及秘钥
3.解密token获取参数
$jwt->setToken($token);
$uid=$jwt->uid;
以上←