• app生成token值 jwt生成


    第一,要安装composer jwt官网:jwt.io

    使用composer安装jwt 命令 :composer require lcobucci/jwt

    执行完命令之后,因为token值每次要验证 所以将他写在一个公共的文件夹内 我用的是tp5框架;

    创建个公共文件夹和一个文件,

    <?php

     

     

    namespace appcommoncontroller;

     

    use LcobucciJWTBuilder;

    use LcobucciJWTParser;

    use LcobucciJWTSignerHmacSha256;

    use LcobucciJWTValidationData;

     

    class Jwt

    {

    /**token

    * @var

    */

    private $token;

    /**

    * decodeToken

    * @var

    */

    private $decodeToken;

    /**uid

    * @var

    */

    private $uid;

    /**iss

    * @var

    */

    private $iss = 'http://www.app.cn';

    /**aud

    * @var

    */

    private $aud = 'http://www.app.org';

    /**

    * @var string

    */

    private $secrect = 'ssw';

     

    /**

    * 单例jwt封装

    */

    private static $instance;

     

    public static function getInstance()

    {

    if(is_null(self::$instance)){

    self::$instance = new self();

    }

    return self::$instance;

    }

     

    /**

    * 实例化构造函数

    * JwtAuth constructor.

    */

    public function __construct()

    {

     

    }

     

    /**

    * @return $this

    */

    public function encode($id)

    {

    $time = time();

    $this->token = (new Builder())->setHeader('alg','HS256')

    ->setIssuer($this->iss) //发布者

    ->setAudience($this->aud) //接收者

    ->setId($id, true) //对当前token设置的标识

    ->setIssuedAt($time) //token创建时间

    ->setExpiration($time + 24*30*3600) //过期时间

    //->setNotBefore($time+ 5) //当前时间在这个时间前,token不能使用

    ->set('uid',$this->uid)//自定义数据

    ->sign(new Sha256(),$this->secrect)

    ->getToken();

     

    return $this;

    }

     

    /**用户传的token

    * @return $this

    */

    public function decode()

    {

    if(!$this->decodeToken){

    $this->decodeToken=(new Parser())->parse((string)$this->token);

    $this->uid = $this->decodeToken->getClaim('uid');

     

    }

    return $this->decodeToken;

    }

     

    /**

    * 校验token是否被篡改

    * @return mixed

    */

    public function verify()

    {

    $result = $this->decode()->verify(new Sha256(),$this->secrect);

    return $result;

    }

     

    /**

    *验证token

    * @return mixed

    */

    public function validate()

    {

    $data = new ValidationData();

    $data->setIssuer($this->iss);

    $data->setAudience($this->aud);

     

    return $this->decode()->validate($data);

     

     

     

    }

     

    /**获取token

    * @return string

    */

    public function getToken()

    {

    return (string)$this->token;

    }

     

    /**设置token

    * @param $token

    * @return $this

    */

    public function setToken($token)

    {

    $this->token = $token;

     

    return $this;

     

    }

     

    /**

    * @param $uid

    * @return $this

    */

    public function setUid($uid)

    {

    $this->uid = $uid;

    return $this;

    }

    /**

    * 实例化克隆函数

    */

    public function __clone()

    {

    // TODO: Implement __clone() method.

    }

    }

    因为返回前端的值有可能数据为空也走成功了;所以要写个返回给前端的一个trait 一可以是php实现这个trait继承他。

     

    <?php

     

     

    namespace app esponse;

     

     

    trait Responsejson

    {

    /**json返回数据为空时

    * @param array $data

    * @return false|string

    */

    public function jsonSuccess($data=[])

    {

    return $this->jsonResponse('0','Success',$data);

    }

     

    /**json返回出现异常时

    * @param $code

    * @param $mesage

    * @param array $datas

    * @return false|strings

    */

    public function jsonData($code,$message,$data=[])

    {

    return $this->jsonResponse($code,$message,$data);

     

    }

     

    /**返回一个json

    * @param $code

    * @param $message

    * @param $data

    * @return false|string

    */

    public function jsonResponse($code,$message,$data)

    {

    $content = [

    'code' => $code,

    'msg' => $message,

    'data' => $data,

     

    ];

    return json_encode($content);

    }

    }

    然后在controller里面进行调用:

     

    <?php

    namespace appindexcontroller;

     

    use appcommonJwtAuth;

     

    use app esponseResponsejson;

    use thinkController;

     

    class Index extends Controller

    {

    use Responsejson;

    public function index()

    {

    $jwt = JwtAuth::getInstance();

    $token = $jwt->setUid('1')->encode()->getToken();

    return $this->jsonSuccess([

    'token'=> $token

    ]);

    }

    }

    运行后会出现以下值:

     

    接下来对token值进行验证:

    <?php

    namespace appindexcontroller;

     

    use appcommonJwtAuth;

     

    use app esponseResponsejson;

    use thinkController;

     

    class Index extends Controller

    {

    use Responsejson;

    //验证token

    public function handle($token)

    {

    if($token){

    $jwtAuth = JwtAuth::getInstance();

    $jwtAuth->setToken($token);

    if($jwtAuth->verify()&& $jwtAuth->validate()){

    //成功之后返回

    return $code=200;

    }else{

    return $this->jsonData('1','登录过期');

    }

    }else{

    return $this->jsonData('2','参数错误');

    }

     

    }

    //用户登录

    public function index()

    {

    $tok = '';

    $code = $this->handle($tok);

    if($code!=200){

    echo $code;

    exit;

    }

    //获取客户端的信息

     

     

    //对客户端信息进行查询,是否存在和获取uid

     

     

    //获取jwt句柄

    $jwt = JwtAuth::getInstance();

    $token = $jwt->setUid('1')->encode()->getToken();

    return $this->jsonSuccess([

    'token'=> $token

    ]);

    }

    }

    这样就成功了;

  • 相关阅读:
    Matlab命令集常用字符串函数
    统计独立性和统计相关性
    查看solaris下硬盘的物理大小
    Perl命令行开关
    DateFormat.getDateInstance出现Unparseable date
    ActiveMQ 本地转本地再转远程的完整配置
    aspose.words 操作word生成试卷
    汇编in和out介绍
    eclipse开发国际化项目利器:MultiProperties
    RCP+GEF+界面开发(2)[eclipse插件配置LINK方法]
  • 原文地址:https://www.cnblogs.com/smilevv/p/13260523.html
Copyright © 2020-2023  润新知