当前位置: 首页 > 后端技术 > PHP

Api接口认证如何使用JWT?

时间:2023-03-30 02:14:49 PHP

1。什么是智威汤逊?JWT官网https://jwt.io官网介绍:JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑且自包含的方式,作为JSON对象在各方之间安全地传输信息。由于此信息经过数字签名,因此可以对其进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用使用RSA或ECDSA的公钥/私钥对进行签名。一般来说,JWT是包含用户信息的加密字符串。将生成的JWT加密字符串放入所有请求头中。前端用设置的秘钥加密参数,发送数据给后端,后端接收参数,根据设置的秘钥,也对接收到的参数进行加密,并与前端加密后的参数进行比较,确保请求有效并防止参数被篡改。如果验证通过,则进行相关的逻辑处理,否则该请求将被视为无效请求。2、为什么要用JWT?传统的互联网项目在实现维护登录状态、注销、接口请求等功能时,都会用到Session。但是众所周知,Session数据生成后会保存在服务器端,所以当用户数量达到一定程度时,就会受到相应的影响。到服务器的性能,在前后端分离的项目或者多服务器的项目中,Session支持得不是很好。但是,Token不会造成这些问题。服务器端只生成和验证Token,不存储数据。对于前后端分离的项目,包括手机APP和流行的小程序,支持都很好,所以Token成为了用户。验证的绝佳选择。3.引入JWTextensioncomposerrequirewhereof/signature4。登录控制器中JWT具体使用步骤$key='e10adc3949ba59abbe56e057f20f883e';//自定义key,加解密需要用到$time=time();//当前时间$token=['iat'=>$time,//发行时间'nbf'=>$time,//(NotBefore):只能在某个时间点之后才能访问,比如设置时间+30,表示当前时间只能在30秒后使用'exp'=>3600//过期时间'data'=>['userid'=>1,'username'=>'zqw.xyz',]];$jwt=new\whereof\Signature\Jwt($key);$token=$jwt->encode($payload);3、登录成功后,将生成的token返回给前端。前端记录用户信息的token,将token放入head中,后续所有请求都要求head中包含token。4、我们可以定义一个AppID和AppSecret,同时通知前端。前端在每次请求中携带AppID,并在请求参数中添加必要的参数符号。sign是一个加密的加密字符串,由所有的请求参数拼接而成。注意:sign参数的值需要添加到AppID需要的对应的AppSecret中。请求参数和后端约定相同的排序规则,然后加密。5、后端验证签名是否通过$token=$request->instance()->header('token');if(empty($token)){abort(0,'token验证失败');}$appid=$request->param('appid');if(empty($appid)){abort(0,'appid验证失败');}$request_time=$request->param('request_time');if(empty($request_time)){abort(0,'时间戳校验失败');}$random_number=$request->param('random_number');if(empty($random_number)){abort(0,'号码校验failed');}//记录每次请求的uuid,如果uuid已经存在,则请求无效。$request_uuid=Db::name('request')->where('uuid',$random_number)->find();if(count($request_uuid)>1){abort(0,'无效请求');}else{Db::name('request')->insert(['uuid'=>$random_number,'add_time'=>time(),'url'=>$request->baseUrl(),]);}$secret_type=['appid1'=>'bd98e16b5eaf3e49fa2ecd3f9ee8f6ae','appid2'=>'b7e23061042f2799180e41d94cdbf861',];$secret=$secret_type[$appid];if(empty($random_number(0,)验证失败');}$sign=$request->param('sign');if(empty($sign)){中止(0,'签名验证失败');}$all_obj['secret']=$secret;ksort($all_obj);$sign_key='';foreach($all_objas$k=>$v){$sign_key.=$k.='='.$v.'&';}$sign_key=substr_replace($sign_key,"",-1);$md_sign=md5($sign_key);if($sign!==$md_sign){abort(0,'signatureverificationfailed');}注意:为了防止重复请求,建议前端每次都传入uuid,根据uuid请求是否重复。6.验证后是通过,进行相关业务逻辑代码处理。//$result=array('status'=>1,'msg'=>'获取成功','result'=>array());返回json($结果)