tp5使用jwt生成token,做api的用户认证

tp5使用jwt生成token,做api的用户认证(亲测通过)

一、首先 composer 安装 firebase/php-jwt

github:https://github.com/firebase/php-jwt

composer require firebase/php-jwt

二、使用

当用户登录时,如果有 token 并且没有过期,则得到用户信息,如果 token过期,或者是新用户,则生成一个token具体业务自已看着办,这里只讨论使用

下面是为用户颁发 token
我是写在公共方法common.php里面

use \Firebase\JWT\JWT;
//$user_id,$series_id是自己想要存储的信息,然后根据ip地址来生成唯一token
function signToken($user_id,$series_id,$ip){		
    $key="dt".$ip;      //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当    于加密中常用的 盐  salt
    $token=array(
        "iss"=>$key,    //签发者 可以为空
        "aud"=>$ip,     //面象的用户,可以为空
        "iat"=>time(),  //签发时间
        "nbf"=>time()+1,    //在什么时候jwt开始生效  (这里表示生成1秒后才生效)
        "exp"=> time()+604800,  //token 过期时间,这里表示一个星期(60*60*24*7)=604800
        "data"=>[           //记录的data的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
            "series_id"=>$series_id,
            "user_id"=>$user_id
        ]
    );
    //  print_r($token);
    $jwt = JWT::encode($token, $key);
    return $jwt;
}

上面生成了token并返回给的客户端,以后客户端再访问时,就带上 token 信息,就可以知道用户的信息了

测试一下

{“token”:“eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCJhdWQiOiIiLCJpYXQiOjE1NDQ0NTcyMTAsIm5iZiI6MTU0NDQ1NzMxMCwiZXhwIjoxNTQ0NDY0NDEwLCJ1aWQiOjEyM30.detj950ILHtNrWJ6ze54DS4Y7y45EHqKoP9EWjQHSfE”}

以上是signToken返回的token

三、继续在common.php里面追加方法

方法如下:

//获取请求的ip地址
function getClientIp(){
    $IP = request()->ip();
    return $IP;
}

//获取请求的token
function getRequestToken(){
    $token=request()->header('Authorization');
    return $token;
}

//验证token
function checkToken(){
    $token=getRequestToken();
//    var_dump($token);
    $ip=getClientIp();
//    var_dump($ip);
    $key="dt".$ip;
    $status=array("code"=>403);
    try {
        //JWT::$leeway = 60;//当前时间减去60,把时间留点余地
        $decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
        $arr['toke'] = (array)$decoded;
        $arr['code']=200;
        return $arr;

    } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
        $status['msg']="签名不正确";
        return $status;
    }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
        $status['msg']="token失效";
        return $status;
    }catch(\Firebase\JWT\ExpiredException $e) { // token过期
        $status['msg']="token失效";
        return $status;
    }catch(Exception $e) { //其他错误
        $status['msg']="未知错误";
        return $status;
    }
}

然后在控制器里的某个方法里面添加token校验方法
比如:(懂的人自然懂)

控制器路径:/index/index/getMenuList
  public function getMenuList()
    {
        //每次调用必须先调用token验证
        $token_check=checkToken();
        var_dump($token_check);
        exit();
    }

请求:http://testtp5.test/index/index/getMenuList
添加header:
在这里插入图片描述
然后返回:

array(2) {
["toke"]=>
array(6) {
["iss"]=>
string(11) "dt127.0.0.1"
["aud"]=>
string(9) "127.0.0.1"
["iat"]=>
int(1576564862)
["nbf"]=>
int(1576564863)
["exp"]=>
int(1577169662)
["data"]=>
object(stdClass)#18 (2) {
["series_id"]=>
string(8) "20191211"
["user_id"]=>
int(1)
}
}
["code"]=>
int(200)
}

这样子就成功了!其他的就根据自己业务需求来更改了。


分割线


分享个vue学习的教程

本人亲自维护的接口

非常适合vue零基础或者刚入门vue的小白学习。

资源包括源码、视频、接口文档,从入门到实战项目

如果你想学习vue,这里有个项目线上尝鲜地址:http://129.226.76.172:5325


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

你可能感兴趣的:(IT学习,php,token)