PHP之JWT接口鉴权(一) 慕课网 app 接口课程代码整理

1,377 阅读1分钟
  • 去JWT的官网https://jwt.io/#libraries-io 下载PHP的JWT包
  • 这里我使用的是laravel框架 在命令行里执行
  • composer require lcobucci/jwt - --- 这是官方提供的代码,在你下载JWT包的时候就可以看到
  • 运行成功后就会在你的项目vendor\下生成lcobucci\jwt文件
  • 接下来就是代码编写
  • 我们自己在app/Commend/Auth/下封装一个JwtAuth.php类

JwtAuth.php类

<?php
namespace App\Common\Auth;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\ValidationData;
//链式调用
class JwtAuth{
    private static $instance;
    private $token;
    private $uid;
    private $secrect='*&%$@#@#!#!^&^%*^';//这里是随便写的一串编码
    private $decodeToken;
    /**
     * 获取jwtAuth句柄
     * @return JwtAuth
     */
    public static function getInstance(){
        if(is_null(self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }
    private function __construct()
    {
        //构成单例
    }
    private function __clone()
    {
        //构成单例
    }
    public function encode(){
        $time=time();
        $this->token=(new \Lcobucci\JWT\Builder())
            ->setHeader('alg','HS256')
            ->setIssuer('www.laravel.com')//设置发行人
            ->setAudience('zjw')//设置接收人
            ->setIssuedAt($time)//设置生成token的时间
            ->setExpiration($time+3600)//设置过期
            ->set('uid',$this->uid)//给token设置一个ID
            ->sign(new \Lcobucci\JWT\Signer\Hmac\Sha256(),$this->secrect) //对上面的信息使用share256算法加密
            ->getToken();//获取token
        return $this;

    }
    //将token输出成字符串
    public function getToken(){
        return (string)$this->token;
    }

    /**
     * 设置TOKEN
     * @param $token
     * @return $this
     */
    public function setToken($token){
        $this->token=$token;
        return $this;
    }
    public function setUid($uid){
        $this->uid=$uid;
        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;
    }
    //验证令牌
    public function validate(){
        $data= new ValidationData();
        $data->setIssuer('www.laravel.com');
        $data->setAudience($this->uid);
        return $this->decode()->validate($data);
    }
    //验证最后一串是否一致
    public function verify(){
        //echo $this->secrect;die;
        $result=$this->decode()->verify(new \Lcobucci\JWT\Signer\Hmac\Sha256(),$this->secrect);
        return $result;
    }
}

//这个类封装好之后,我们自己定义一个可访问的方法
public function author(){
	return $this->jsonSuccessData([
            'id'=>1,
            'name'=>'zhaojiawei'
        ]);
}

定义好方法后我们需要用到laravel的中间件

  • laravel的中间件用法,详情看LARAVEL书院
  • 执行 php artisan make:middleware JwtAuthMiddleware
<?php

namespace App\Http\Middleware;

use App\Common\Auth\JwtAuth;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Model\permession\PermessionModel;
use Closure;

class JwtAuthMiddleware
{
    use ResponseJson;
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $token=$request->input('token');
        if(!empty($token)){
            $jwtauth=JwtAuth::getInstance();

            $jwtauth->setToken($token);
            if($jwtauth->validate() && $jwtauth->verify()){
                return $next($request);
            }else{
                return $this->jsonData('1','登录过期');
            }
        }else{
            return $this->jsonData('2','参数错误');
        }
    }
}
  • 定义好中间件后,记得在Kernel.php中添加定义的中间件,添加成功后在web.php中声名一个路由,路由的middleware指向Kernel.php定义的中间件名称

JWT

Route::group(["prefix"=>"crontab","middleware"=>"jwt_auth"],function (){
    //获取token
    Route::get("index","crontab\CrontabController@index")->name("crontab.index");
});
下面这个是我自己封装的一个转化json格式类,建议放在app\http\Response\下
<?php

namespace App\Http\Response;


trait ResponseJson{
    /**
     * 返回一个json
     * @param $code
     * @param $message
     * @param $data
     * @return string
     */
    public function jsonResponse($code,$message,$data){
        $content=[
            'code'=>$code,
            'msg'=>$message,
            'data'=>$data
        ];
        return json_encode($content,JSON_FORCE_OBJECT);
        //return response()->json($content);
    }

    /**
     * App接口调用成功时的返回
     * @param array $data
     * @return string
     */
    public function jsonSuccessData($data=[]){
        return $this->jsonResponse(0,'Success',$data);
    }

    /**
     * 出现异常的返回
     * @param $code
     * @param $message
     * @param array $data
     * @return string
     */
    public function jsonData($code,$message,$data=[]){
        //echo 123;die;
        return $this->jsonResponse($code,$message,[]);
    }
}
//获取token的方法
		$jwtauth=JwtAuth::getInstance();
        $token=$jwtauth->setUid(1)->encode()->getToken();
        
}