讲解JWTJWT是一个字符串,经过加密验证,由三部分组成。基于令牌的认证可以替代传统的cookie+session认证方式。三部分如下:header.payload.signatureheader部分由header格式组成:{"typ":"JWT","alg":"HS256"}这是一个json字符串,两个字段都是必填的,alg字段指定生成签名的算法,默认值为HS256,可以指定其他加密算法,如RSA。base64encode后,可以得到header.payload部分组成payload基本组成:简单:$payload=['iss'=>$issuer,//Issuer'iat'=>$_SERVER['REQUEST_TIME'],//发出时'exp'=>$_SERVER['REQUEST_TIME']+7200//过期时间'uid'=>1111];复杂点:官方声明,由三部分组成(Reservedclaims,Publicclaims,Privateclaims)$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",];payload也是一个json数据,是表示用户身份的数据。可以自己自定义字段,非常灵活。也可以简单的使用,比如简单的方式。经过json_encode和base64_encode,就可以得到payloadsignature组件。使用标头中指定的加密算法对标头和有效负载进行加密。当然,加密过程还需要自定义秘钥,自己选择一个字符串即可。官网示例:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)自己使用:'JWT','alg'=>$alg]))。'.'.self::urlsafeB64Encode(json_encode($payload));返回$jwt。'.'.self::signature($jwt,$key,$alg);}publicstaticfunctionsignature(string$input,string$key,string$alg){returnhash_hmac($alg,$input,$key);}这三个部分都用到了。将它们连接在一起就是高大上的JWT,然后就可以使用了。JWT使用流程官方使用流程说明:翻译:firstlogin:用户首次登录,输入用户名密码passwordverification:服务端从数据库中取出用户名和密码进行验证生成JWT:服务端验证通过,根据返回的信息从数据库和预设规则,生成JWT并返回JWT:ReturnJWTwithJWTintheserver'sHTTPRESPONSERequest:客户端发起请求后,HTTPREQUESTHEADER中的Authorizatio字段必须有值,即JWTJWT。验证过程是自己写的,没有使用框架,所以还是需要简单记录下验证过程。客户端有带有JWT信息的请求头,后端得到$_SERVER[HTTP_AUTHORIZATION]:但是注意,我的Authorization没有加Bearer,官方用的是Bearer,你自己也可以用:Authorization:Bearer<代币>php验证伪代码:$time)返回false;如果(isset($payload['exp'])&&$payload['exp']<$time)返回false;返回$有效载荷;}publicstaticfunctionurlsafeB64Decode(string$input){$remainder=strlen($输入)%4;如果($剩余){$padlen=4-$剩余;$input.=str_repeat('=',$padlen);}returnbase64_decode(strtr($input,'-_','+/'));}publicstaticfunctionurlsafeB64Encode(string$input){returnstr_replace('=','',strtr(base64_encode($input),'+/','-_'));}参考文章:https://jwt.io/introduction/http://www.cnblogs.com/zjutzz...
