PHP使用JWT实现接口令牌验证

JWT封装控制器
namespace api\user\controller;

use cmf\controller\RestBaseController;
use Firebase\JWT\JWT;     //JWT集成包
use think\Cache;
use think\Model;

/**
 * Class JWT
 * @package app\plugins\jwt
 */
class JWTController extends RestBaseController {

    /**
     * @param Model $userModel
     * @param $user 需要验证用户id
     * @param $password 需要验证的openid
     * @param $time 登陆时间
     */

    public function login(Model $UserModel,$user_login='',$user_pass='',$time='7200'){
        $users = $UserModel->where($UserModel->user_login,$user_login)->where($UserModel->user_pass,$user_pass)->find();
        if(empty($users)){
            $this->return_json(0,'用户不存在或密码错误');
        }
        $users->last_login_ip = get_client_ip();
        $jti=time();
        $api=[
            /**
             *非必须。issued at。 token创建时间,unix时间戳格式
             */
            'lat'=>$_SERVER['REQUEST_TIME'],
            /**
             *非必须。expire 指定token的生命周期。unix时间戳格式
             */
            'exp'=>$_SERVER['REQUEST_TIME']+$time,
            /**
             * 非必须。JWT ID。针对当前token的唯一标识
             */
            'jti'=>$jti,
            /**
             * 自定义字段
             */
            'userModel'=>$users,
        ];
        $jwt_obj = new JWT();
        $token = $jwt_obj->encode($api,config('jwt.key'));
        if(!Cache::set($token,$jti,$time)){
            $this->return_json(0,'登录失败');
        }
        return $token;
    }

    /**
     *  判断是否登陆
     */
    public function auth($token=''){
        $jwt_obj = new JWT();
        if(empty($token)){
            $token = request()->request('token');
        }
        if(!Cache::get($token)){
            $this->return_json(0,"token错误或已经过期");
//            return $this->error("token错误或已经过期");
        }
        try{
            $userModel=$jwt_obj->decode($token,config('jwt.key'),config('jwt.type'));

            return $userModel->userModel;
        }catch (\Exception $e){
//            return $this->error('token参数错误');
            $this->return_json(0,'token参数错误');
        }
    }
}
login.php 登录逻辑
    public function login(){
        $this->method('post');
        $data=request()->post();
        $userModel=new UserModel();
        $validate=Validate::make([
            'user_login'=>"require",
            'user_pass'=>"require",
        ],[],[
            'user_login'=>'用户名',
            'user_pass'=>'密码'
        ]);
        if(!$validate->check($data)){
            $this->return_json(0,$validate->getError());
        }
        $data['user_pass'] = cmf_password($data['user_pass']);

        $jwt = new \api\user\controller\JWTController();
        $token = $jwt->login($userModel,$data['user_login'],$data['user_pass'],$time='7200000');
        $response['user']=$jwt->auth($token);
        $response['token']=$token;
        $this->return_json(1,'登录成功',$response);

    }

这里用户登录成功返回token及用户基础信息,客户端下次请求接口时就带token过来,后台进行验证,识别用户身份!

你可能感兴趣的:(PHP)