JWT是什么?JWT是jsonwebtoken的缩写。它将用户信息加密成token,服务端不保存任何用户信息。服务器通过保存的密钥来验证token的正确性,只要正确就通过验证。基于令牌的认证可以替代传统的cookie+session认证方式。JWT由三部分组成:header.payload.signature下面以JWT官网为例。header部分:{"alg":"HS256","typ":"JWT"}对应的base64UrlEncode编码为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9说明:该字段为json格式。alg字段指定生成签名的算法,默认值为HS256,typ默认值为JWTpayload部分:{"sub":"1234567890","name":"李四","iat":1516239022}对应的base64UrlEncode编码为:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQDescription:该字段为json格式,表示用户身份数据。可以自己自定义字段,非常灵活。sub为目标用户,name为姓名,iat为发布时间。Forexample,thecustomizableexampleisasfollows:{"iss":"admin",//TheissueroftheJWT"iat":1535967430,//Issuingtime"exp":1535974630,//Expirationtime"nbf":1535967430,//TheTokenwillnotbereceivedandprocessedbeforethistime"sub":"www.admin.com",//Thetargetuser"jti":"9f10e796726e332cec401c569969e13e"//TheuniqueidentifieroftheToken}signaturepart:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),123456)对应的签名为:keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU最终得到的JWT的json为(header.payload.signature):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU说明:对header和payload进行base64UrlEncode编码后进行拼接。Usethekey(123456here)toperformHS256algorithmsignature.JWT使用流程首次登录:用户首次登录,输入用户名和密码验证:服务端从数据库中取出用户名和密码进行验证生成JWT:服务端验证通过后,生成JWT,根据返回的信息返回JWT数据库和预设规则:在服务端的HTTPRESPONSE中,将JWT返回给请求,JWT:以后客户端发起请求时,HTTPREQUESTHEADER中的Authorizatio字段必须要有值才能验证JWTP智威汤逊服务器。PHP是如何实现JWT的?笔者使用的是PHP7.0.31,废话不多说,直接上传代码,新建一个jwt.php,复制粘贴如下:'HS256',//生成签名的算法'typ'=>'JWT'//类型);//使用HMAC生成信息摘要时使用的keyprivatestatic$key='123456';/***获取jwttoken*@paramarray$payloadjwtpayload的格式不需要*[*'iss'=>'jwt_admin',//JWT的发行者*'iat'=>time(),//发行时间*'exp'=>time()+7200,//过期时间*'nbf'=>time()+60,//在此时间之前不要接收和处理Token*'sub'=>'www.admin.com',//面向用户*'jti'=>md5(uniqid('JWT').time())//Token的唯一标识*]*@returnbool|string*/publicstaticfunctiongetToken(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']);返回$令牌;}else{返回错误;}}/***验证token是否有效,默认验证exp、nbf、iat时间*@paramstring$Token待验证Token*@returnbool|string*/publicstaticfunctionverifyToken(string$Token){$tokens=explode('.',$Token);如果(count($tokens)!=3)返回false;列表($base64header,$base64payload,$sign)=$tokens;//获取jwt算法$base64decodeheader=json_decode(self::base64UrlDecode($base64header),JSON_OBJECT_AS_ARRAY);如果(空($base64decodeheader[‘alg’]))返回假;//签名验证if(self::signature($base64header.'.'.$base64payload,self::$key,$base64decodeheader['alg'])!==$sign)returnfalse;$payload=json_decode(self::base64UrlDecode($base64payload),JSON_OBJECT_AS_ARRAY);//签名时间If(isset($payload['iat'])&&$payload['iat']>time())returnfalse;//过期时间小鱼当前服务器时间验证失败if(isset($payload['exp'])&&$payload['exp']
