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

我第一次接触PHPJWT

时间:2023-03-29 18:19:32 PHP

直到前两天要做web验证时,朋友才向我推荐了jwt。才发现jwt已经被大家广泛使用了。看来我有点out了。哈哈,趁着这个世界好好看看这个。JWT(JSONWebToken),顾名思义,就是一种可以在Web上传输的token。此令牌采用JSON格式。它是一个开源标准(RFC7519),它定义了一种紧凑、独立的方式来在不同实体之间安全地传输JSON格式的信息。由于现在很多项目都是前后端分离的,restfulapi模式。因此,传统的会话模式无法满足认证需求。这时候jwt的作用就来了。可以说restfulapi认证是jwt一个很好的应用场景。下面是一个小demo$user=['uid'=>'dadsa-12312-vsd1s1-fsds','account'=>'daisc','password'=>'123456'];$redis=redis();$action=$_GET['action'];switch($action){case'login':login();休息;案例“信息”:信息();break;}//登录,写入验证tokenfunctionlogin(){global$user;$account=$_GET['账户'];$pwd=$_GET['密码'];$res=[];如果($account==$user['account']&&$pwd==$user['password']){取消设置($user['password']);$时间=时间();$token=['iss'=>'http://test.cc',//发行者'iat'=>$time,'exp'=>$time+60,'data'=>$user];$jwt=\Firebase\JWT\JWT::encode($token,KEY);$res['代码']=200;$res['消息']='登录成功';$res['jwt']=$jwt;}别的{$res['message']='用户名或密码错误';$res['代码']=401;}exit(json_encode($res));}functioninfo(){$jwt=$_SERVER['HTTP_AUTHORIZATION']??错误的;$res['代码']=200;if($jwt){$jwt=str_replace('Bearer','',$jwt);如果(空($jwt)){$res['code']=401;$res['msg']='您没有访问权限。';退出(json_encode($res));}try{$token=(array)\Firebase\JWT\JWT::decode($jwt,KEY,['HS256']);if($token['exp']connect('127.0.0.1');return$redis;}这个dmeo使用jwt做一个简单的认证,使用了一个php-jwt加密包https://github.com/firebase/php-jwt其中KEY是定义的私钥,是jwt中的sign部分,必须妥善保管。php-jwt包的header部分已经帮我们完成了,加密代码如下*/publicstaticfunctionencode($payload,$key,$alg='HS256',$keyId=null,$head=null){$header=array('typ'=>'JWT','alg'=>$alg);如果($keyId!==null){$header['kid']=$keyId;}if(isset($head)&&is_array($head)){$header=array_merge($head,$header);}$段=数组();$segments[]=static::urlsafeB64Encode(static::jsonEncode($header));$segments[]=static::urlsafeB64Encode(static::jsonEncode($payload));$signing_input=implode('.',$segments);$signature=static::sign($signing_input,$key,$alg);$segments[]=static::urlsafeB64Encode($signature);返回内爆('。',$段);}可以看出默认的加密方式是HS256。这也是jwt安全的原因。现阶段HS256加密还是很安全的。该软件包还支持证书加密。这个包已经为我们完成了加密和解密的过程。所以我们只需要在jwt中定义poyload部分即可。那是演示中的令牌部分。如果加密成功,会得到一个加密后的Jwt字符串。下次前端请求API时需要携带这个jwt串作为鉴权。在标头中添加授权。在服务器端验证时,通过获取这个值来验证session的有效性。下面是poyload的一些常用配置$token=[#不需要。issuer请求实体,可以是发起请求的用户信息,也可以是jwt的发布者。"iss"=>"http://example.org",#不需要。发出于。Token创建时间,unix时间戳格式"iat"=>$_SERVER['REQUEST_TIME'],#不需要。expire指定令牌的生命周期。Unix时间戳格式"exp"=>$_SERVER['REQUEST_TIME']+7200,#不需要。接收JWT的一方。"aud"=>"http://example.com",#不需要。JWT用于“sub”的用户=>“jrocket@example.com”,#不需要。之前没有。如果当前时间早于nbf中的时间,则不接受该Token;一般会有一些回旋余地,比如几分钟。"nbf"=>1357000000,#不需要。智威汤逊ID。当前令牌的唯一标识符"jti"=>'222we',#自定义字段"GivenName"=>"Jonny",#自定义字段"name"=>"Rocket",#自定义字段"Email"=>"jrocket@example.com",];其中包含的配置可以随意配置,也可以自己添加一些其他的。这些都是网上大家常用的,可以说是一种约定。jwt还有很多疑惑,我慢慢研究,比如续约和退出问题。查看原文