如何在php后端中实现一个JWT认证

  介绍

如何在php后端中实现一个JWT认证?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强> JWT是什么

JWT是json web标记缩写。它将用户信息加密到令牌里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证令牌的正确性,只要正确即通过验证。基于令牌的身份验证可以替代传统的饼干+会话身份验证方法。

它定义了一种用于简洁,自包含的用于通信双方之间以json对象的形式安全传递信息的方法.JWT可以使用HMAC算法或者是RSA的公钥密钥对进行签名。它具备两个特点:

简洁(契约):可以通过URL,文章参数或者在HTTP头发送,因为数据量小,传输速度快

自包含(独立):负载中包含了所有用户所需要的信息,避免了多次查询数据库

JWT由三个部分组成:<代码> header.payload。代码签名

以下示例以JWT官网为例

页眉部分:

{   ,“alg":,“HS256"   ,“typ":“JWT"   }

对应base64UrlEncode编码为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

说明:该字段为json格式.alg字段指定了生成签名的算法,默认值为HS256, typ默认值为JWT

有效载荷部分:

{   ,“sub":“1234567890”,   ,“name":“John  Doe"   ,“iat": 1516239022   }

对应base64UrlEncode编码为:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
说明:该字段为json格式,表明用户身份的数据,可以自己自定义字段,很灵活.sub面向的用户,名字姓名,iat签发时间,例如可自定义示例如下:

{   “iss"才能:,“admin",,,,,,//该JWT的签发者   “iat"才能:,1535967430,,,,,//签发时间   “exp"才能:,1535974630,,,,,//过期时间   “nbf"才能:,1535967430,,,,,,//该时间之前不接收处理该令牌   “sub"才能:,“www.admin.com",,,//面向的用户   “jti"才能:,“9 f10e796726e332cec401c569969e13e",,//该令牌唯一标识   }

签名部分:

HMACSHA256 (   ,base64UrlEncode(头),+,“干净+   ,base64UrlEncode(载荷),   123456年,   )

对应的签名为:keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU

最终得到的智威汤逊的json为(header.payload.signature): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ。keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU
说明:对报头和有效载荷进行base64UrlEncode编码后进行拼接。通过关键(这里是123456)进行HS256算法签名。

<强> JWT使用流程

<李>

初次登录:用户初次登录,输入用户名密码

<李>

密码验证:服务器从数据库取出用户名和密码进行验证

<李>

生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT

<李>

返还JWT:服务器的HTTP响应中将JWT返还

<李>

带JWT的请求:以后客户端发起请求,HTTP请求

<李>

页眉中的Authorizatio字段都要有值,为JWT

<李>

服务器验证JWT

<强> PHP如何实现JWT

作者使用的是PHP 7.0.31,不废话,直接上代码,新建JWT。php,复制粘贴如下:

& lt; php ?/* *   ,* PHP实现jwt   ,*/class  Jwt  {//头才能部   private 才能;static  $头=阵列(   ,,,& # 39;alg # 39;=祝辞& # 39;HS256& # 39;,,//生成签名的算法   ,,,& # 39;typ& # 39;=祝辞& # 39;jwt # 39;,,//类型   ,,);//使才能用HMAC生,成信息摘要时所使用的密钥   private 才能;static  $关键=& # 39;123456 & # 39;;         ,/* *   ,,*,获取jwt 令牌   ,,*,@param  array  payload 美元;jwt载荷,,格式如下非必须   ,,*,(   ,,*,& # 39;iss # 39;=祝辞& # 39;jwt_admin& # 39;,,//该JWT的签发者   ,,*,& # 39;iat # 39;=在时间(),,//签发时间   ,,*,& # 39;exp # 39;=在时间()+ 7200,,//过期时间   ,,*,& # 39;nbf& # 39;=在时间()+ 60,,//该时间之前不接收处理该令牌   ,,*,& # 39;子# 39;=祝辞& # 39;www.admin.com& # 39;,,//面向的用户   ,,*,& # 39;jti& # 39;=祝辞md5(函数(& # 39;jwt # 39;) .time()),//该令牌唯一标识   ,,*,)   ,,*,@return  bool |字符串   ,,*/public 才能static  function  getToken (array 载荷美元)   {才能   ,,,如果(is_array(载荷)美元)   ,,,{   ,,,,,$ base64header=self:: base64UrlEncode (json_encode (self:: $头,JSON_UNESCAPED_UNICODE));   ,,,,,$ base64payload=self:: base64UrlEncode (json_encode(有效载荷美元,JSON_UNESCAPED_UNICODE));   ,,,,,令牌=美元base64header强生,强生的# 39;。美元base64payload强生,强生的# 39;.self:签名(美元base64header强生,强生的# 39;base64payload美元,self::美元关键,自我::$头[& # 39;alg # 39;]);   ,,,,,return 美元令牌;   还有,,,}{   ,,,,,return 假;   ,,,}   ,,}         ,/* *   ,,*,验证令牌是否有效,默认验证实验,nbf, iat时间   ,,*,@param  string  Token 美元;需要验证的令牌   ,,*,@return  bool |字符串   ,,*/public 才能static  function  verifyToken (string 令牌美元)   {才能   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何在php后端中实现一个JWT认证