ThinkPHP5实现JWT Token认证的过程(亲测可用)

1、composer先挂载阿里云镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

2、安装JWT扩展

composer require lcobucci/jwt 3.3

3、在vendor目录中打开readme.md文件

图片[1]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

4、在extend目录中,自定义类进行JWT操作生成token

图片[2]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

5、操作Token.php实现生成token的方法,详细在readme.md中的Hmac位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\signer\Hmac\Sha256;
class Token{
    //自定义一个生成token的方法
    static public function createToken($uid = null){
        $signer = new Sha256(;//加密算法
        $time = time(;//当前的时间戳
        $token = (new Builder())
            ->issuedBy( issuer: "fanxinze')//配置发行人
            ->canonlyBeUsedBy( audience: " user')//配置接收人
            ->identifiedBy( id: ' quanzhankaifa',replicateAsHeader: true)//标题id->issuedAt($time)//发出token令牌的时间
            ->canonlyBeUsedAfter( notBefore: $time + 60)//生效时间->expiresAt( expiration: $time + 3600)//过期时间
            ->with( name: " uid' , $uid)//用户id
            ->sign($signer, key: ' 1902a" )//签名内容->getToken(;//获取token
        return (string)$token;
    }
}

注意:生效时间+60表示1分钟后生效,可以去掉加法运算,表示即时生效

图片[3]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

6、自行找控制器进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
namespace app\index\controller;
use think\Controller;
use Token;
class Index extends Controller
{
    public function index()
    {
    $token = Token : : createToken();
    return $token;
    }
}

图片[4]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

7、最终会得到结果类似如下所示:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJmYW54aW56ZSIsImF1ZCI6InVzZXIiLCJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTYxOTY2NjUwNywibmJmIjoxNjE5NjY2NTY3LCJleHAiOjE2MTk2NzAxMDcsInVpZCI6MTJ9.N6CkSWaNdTVk2ust9QzRa1wpY-ZCQTwp5nYPLYa_K-k

8、封装验证Token的方法,如果失败返回false,如果成功返回用户id

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//验证token
static public function verifyToken($token=null){
    //检测是否接收到了token
    if(empty($token)){
        return 0;
    }
    //代码到50行,就表示取到token了,那么转化成jwt认识的token
    $token = (new Parser())->parse((string) $token);
    //验证基本设置
    $data = new ValidationData();
    $data->setIssuer( issuer: "teacher ' );
    $data->setAudience( audience: 'student ' );$data->setId( id: " quanzhan ' );
    if(!$token->validate($data)){
        return 0;
    }
    //验证签名
    $signer = new sha256();
    if(!$token->verify($signer, key: ' 1902a' )){
    return 0;
    }
    //验证通过,返回用户id
    return $token->getclaim( name:'uid');
}

图片[5]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

9、案例:Token在实际代码中的应用

注意:这里为了简单的做测试,使用的是DB操作,但是在实际代码中不建议使用DB,必须使用MVC进行开发。

(1)、登录的时候生成token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//登录
public function login(){
    $data = input();
    array_shift( &array: $data);if(empty($data[ ' username ' ])){
        return json([ 'code'=>1, ' msg'=>'用户名不能为空' , ' result'=>null]);
    }
    if(empty($data[ ' password' ])){
        return json([ 'code '=>2, ' msg'=>'密码不能为空', ' result'=>null]);
    }
    $data[ " password ' ] = md5($data[ ' password ' ]);
    $info = Db ::table( table: 'tpshop_manager ')->where($data)->find();
    if(!$info){
        return json( [ 'code '=>3 , ' msg'=>'账号密码有误', ' result'=>null]);
    }
    //登录成功
    //生成token
    $token = Token : : createToken($info[ 'id' ]);
    $info[ 'token' ] = $token;
    return json([ ' code '=>0, ' msg'=>'登录成功", ' result'=>$info]);
}

图片[6]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

(2)、登录后可以拿到token,然后请求其他接口的时候就验证token是否正确,如果不正确,提示无效的token

1
2
3
4
5
6
7
8
9
10
public function index()
{
    $token = input(key: 'token') ;
    $res = Token::verifyToken($token);
    if($res==0){
        return json([ 'code'=>1, 'msg '=>'无效的Token " , "result'=>null]);
    }
    $data = Db::table(table: "'tpshop_manager" )->paginate(listRows: 7);
    return json([ " code '=>0, ' msg'=>'成功", "result'=>$data]);
}

图片[7]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

(3)、由于登录后的每一个方法可能都需要验证token,所以我们把token封装到构造中进行验证【实例化类的时候自动调用构造,构造会在每一个要执行的方法前自动执行】

1
2
3
4
5
6
7
8
9
10
11
12
class Base extends controller
{
    public function _construct(Request $request = null)
    {
    $token = $request->param( name: "token " );$res = Token : :verifyToken($token) ;
    if($res==0){
        $arr = [ ' code'=>1, 'msg'=>'无效的Token " , ' result'=>null];
        echo json_encode($arr);
        die;
    }
    }
}

图片[8]-ThinkPHP5实现JWT Token认证的过程(亲测可用)-爱站

原文链接:https://blog.csdn.net/Your_is_my_God/article/details/118960656

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容