jwt token验证

做~自己de王妃 提交于 2019-12-03 21:24:16
<?phpnamespace app\index\controller;use think\Db;use think\Session;use think\Controller;//跨域处理header('Access-Control-Allow-Origin:*');header('Access-Control-Allow-Method:POST,GET,OPTIONS');header("Access-Control-Allow-Origin:*");header("Access-Control-Allow-Credentials:true");header("Access-Control-Allow-Methods:*");header("Access-Control-Allow-Headers:Content-Type,Access-Token");header("Access-Control-Expose-Headers:*");class Message extends Controller{
//头部private static $header=array(    'alg'=>'HS256', //生成signature的算法    'typ'=>'JWT'    //类型);//使用HMAC生成信息摘要时所使用的密钥private static $key='123456';/** * 获取jwt token * @param array $payload jwt载荷   格式如下非必须 * [ *  'iss'=>'jwt_admin',  //该JWT的签发者 *  'iat'=>time(),  //签发时间 *  'exp'=>time()+7200,  //过期时间 *  'nbf'=>time()+60,  //该时间之前不接收处理该Token *  'sub'=>'www.admin.com',  //面向的用户 *  'jti'=>md5(uniqid('JWT').time())  //该Token唯一标识 * ] * @return bool|string */public static function getToken(array $payload){    if(is_array($payload))    {        $base64header=self::base64UrlEncode(json_encode(self::$header,JSON_UNESCAPED_UNICODE));        $base64payload=self::base64UrlEncode(json_encode($payload,JSON_UNESCAPED_UNICODE));        $token=$base64header.'.'.$base64payload.'.'.self::signature($base64header.'.'.$base64payload,self::$key,self::$header['alg']);        return $token;    }else{        return false;    }}/** * 验证token是否有效,默认验证exp,nbf,iat时间 * @param string $Token 需要验证的token * @return bool|string */public static function verifyToken(string $Token){    $tokens = explode('.', $Token);    if (count($tokens) != 3)        return false;    list($base64header, $base64payload, $sign) = $tokens;    //获取jwt算法    $base64decodeheader = json_decode(self::base64UrlDecode($base64header), true);//JSON_OBJECT_AS_ARRAY 相当于 true    if (empty($base64decodeheader['alg']))        return false;    //签名验证    if (self::signature($base64header . '.' . $base64payload, self::$key, $base64decodeheader['alg']) !== $sign) {        return false;    }    $payload = json_decode(self::base64UrlDecode($base64payload), true);    //签发时间大于当前服务器时间验证失败    if (isset($payload['iat']) && $payload['iat'] > time()) {        return false;    }    //过期时间小宇当前服务器时间验证失败    if (isset($payload['exp']) && $payload['exp'] < time()) {        return false;    }    //该nbf时间之前不接收处理该Token    if (isset($payload['nbf']) && $payload['nbf'] > time()){        return false;    }    return $payload;}/** * base64UrlEncode   https://jwt.io/  中base64UrlEncode编码实现 * @param string $input 需要编码的字符串 * @return string */private static function base64UrlEncode(string $input){    return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));}/** * base64UrlEncode  https://jwt.io/  中base64UrlEncode解码实现 * @param string $input 需要解码的字符串 * @return bool|string */private static function base64UrlDecode(string $input){    $remainder = strlen($input) % 4;    if ($remainder) {        $addlen = 4 - $remainder;        $input .= str_repeat('=', $addlen);    }    return base64_decode(strtr($input, '-_', '+/'));}/** * HMACSHA256签名   https://jwt.io/  中HMACSHA256签名实现 * @param string $input 为base64UrlEncode(header).".".base64UrlEncode(payload) * @param string $key * @param string $alg   算法方式 * @return mixed */private static function signature(string $input, string $key, string $alg = 'HS256'){    $alg_config=array(        'HS256'=>'sha256'    );    return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));}//获取tokenpublic function Token($array){    $token_test = self::getToken($array);    return $token_test;}//验证tokenpublic function token_yz($token_test){    //对token进行验证签名    $getPayload_test=self::verifyToken($token_test);    return $getPayload_test;}
//用户登录   简单模拟实例public function Login(){    $info = request()->param();    if(!isset($info['name']) or !isset($info['password'])){        return json_encode(array(            'code'=>0,            'msg'=>"缺少参数"        ));die();    }    //验证是否存在    $user = Db::table("user_login")->where(['name'=>$info['name'],'password'=>md5($info['password']),'is_delete'=>0])->find();    if($user){        //获取生成的token(参数)        $token = $this->Token(array('uid'=>$user['id'],'name'=>$user['name'],'exp'=>time()+60,'nbf'=>time(),'jti'=>md5(uniqid('JWT').time())));        return json_encode(array(            'uid' => $user['id'],            'name' => $user['name'],            'token' => $token        ));die();    }    return json_encode(array(        'code'=>0,        'msg'=>"账号或密码输入有误"    ));die();}  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!