前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThinkPHP5框架中使用JWT的方法示例

ThinkPHP5框架中使用JWT的方法示例

作者头像
砸漏
发布2020-11-02 14:31:39
1.4K0
发布2020-11-02 14:31:39
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

本文实例讲述了ThinkPHP5框架中使用JWT的方法。分享给大家供大家参考,具体如下:

JWT下载地址:https://jwt.io

可以直接去github上下载,也可以使用composer

使用composer的话要确保你的电脑上安装了composer,进入项目根目录下载即了,自动会放在vendor目录下

创建文件

我是放在common目录下

使用教程

github都有的

贴源码

JWTAuth.php

代码语言:javascript
复制
<?php
namespace app\common\Auth;
use \Lcobucci\JWT\Builder;
use \Lcobucci\JWT\Signer\Hmac\Sha256;
use \Lcobucci\JWT\Parser;
use \Lcobucci\JWT\ValidationData;
/**
 * 单例模式
 */
class JWTAuth
{
    private static $instance;
    /**
     * JWT TOKEN
     * @var [type]
     */
    private $token;
    /**
     * 颁发
     * @var string
     */
    private $iss = 'api.test.com';
    /**
     * 接收
     * @var string
     */
    private $aud = 'app.com';
 
    private $uid;
 
    private $secrect="#$%#$%*&^(*(*(";
 
    private $decodeToken;
 
    public static function getInstance() {
        if(is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }
 
    private function __contruct(){
 
    }
 
    private function __clone(){
 
    }
 
    public function encode(){
        $time = time();
        $this- token = (new builder())- setHeader('alg','HS256')
            - setIssuer($this- iss)
            - setAudience($this- aud)
            - setIssuedAt($time) //生效时间
            - setExpiration($time + 20)//过期时间
            - set('uid',$this- uid)
            - sign(new Sha256(), $this- secrect)//加密算法
            - getToken();
 
            return $this;
    }
 
    public function getToken(){
        return (string)$this- token;
    }
 
    public function setToken($token){
        $this- token = $token;
        return $this;
    }
    /**
     * 用户信息uid
     * @param [type] $uid [description]
     */
    public function setUid($uid){
        $this- uid = $uid;
        return $this;
    }
 
    public function jsonDecode(){
 
        $token = $this- token;
        $this- decodeToken = (new Parser())- parse((string) $token); 
 
        // echo $this- decodeToken- getClaim('uid');
        return $this- decodeToken;
    }
    /**
     * 验证令牌是否有效
     * @return [type] [description]
     */
    public function validate(){
 
        $data = new ValidationData();
        $data- setIssuer($this- iss);
        $data- setAudience($this- aud);
        return $this- jsonDecode()- validate($data);
 
    }
    /**
     * 签名来验证令牌在生成后是否未被修改
     * @return [type] [description]
     */
    public function verify(){
        $result = $this- jsonDecode()- verify(new Sha256(), $this- secrect);
        return $result;
    }
 
}

user.php 用来测试

代码语言:javascript
复制
<?php
namespace app\index\controller;
use app\common\Auth\JWTAuth;
 
class User{
 
    public function login(){
        
        $jwtAuth = JWTAuth::getInstance();
        $token = $jwtAuth- setUid(1)- encode()- getToken();
        echo $token;
        // var_dump(success_json_data(['token'= $token]));
    }
 
    public function check_login(){
        $jwtAuth = JWTAuth::getInstance();
        $jwtAuth- setToken('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkudGVzdC5jb20iLCJhdWQiOiJhcHAuY29tIiwiaWF0IjoxNTU2MDk1MDI5LCJleHAiOjE1NTYwOTUwNDksInVpZCI6MX0.oi4rLbQFNZUJsW4fVHWiOQxfEmomuvldAV-gFKl2V74');
 
        if($jwtAuth- validate() && $jwtAuth- verify()){
            echo '验证成功';
        }else{
            echo '登录过期';
        }
 
    }
}

最后

jwt本身的话是不带token刷新方法,所以一旦token过期,客户端就要重新登录。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建文件
  • 使用教程
  • 贴源码
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档