• 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

    ]);

    }

    }

    这样就成功了;

  • 相关阅读:
    在指定文件夹目录下打开jupyter notebook
    防止sql注入
    惰性函数——适合外层函数只需要执行一次
    Text类型
    怎样理解阻塞非阻塞与同步异步的区别?
    Element类型
    避免使用eval()
    javascript 连等赋值问题
    类数组转化为数组
    DOM10-1节点层次
  • 原文地址:https://www.cnblogs.com/smilevv/p/13260523.html
Copyright © 2020-2023  润新知