美文网首页
jwt web token php 实现

jwt web token php 实现

作者: 小哥哥吖Q | 来源:发表于2020-06-28 09:26 被阅读0次

JWT是什么

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

JWT由三个部分组成:header.payload.signature

JWT使用流程

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

密码验证:服务器从数据库取出用户名和密码进行验证 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT 返还JWT:服务器的响应中将JWT返还

以后客户端发起请求,http 请求头中的 自定义字段 或者传递 token 字段进行验证字段都要有值,服务器验证JWT正确性 正确则证明合法用户

class Jwt {

    //头部

    private static $header=array(

        'alg'=>'HS256', //生成signature的算法

        'typ'=>'JWT'    //类型

    );

    //使用HMAC生成信息摘要时所使用的密钥

    private static $key='123456';

    /**

    * 获取jwt token

    * @param array $payload jwt载荷  格式如下非必须

    * [

    *  'iss'=>'jwt_admin',  //该JWT的签发者

    *  'iat'=>time(),  //签发时间

    *  'exp'=>time()+7200,  //过期时间

    *  'nbf'=>time()+60,  //该时间之前不接收处理该Token

    *  'sub'=>'www.admin.com',  //面向的用户

    *  'jti'=>md5(uniqid('JWT').time())  //该Token唯一标识

    * ]

    * @return bool|string

*/

    public static function getToken($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']);

            return $token;

        }else{

            return false;

}

}

    /**

    * 验证token是否有效,默认验证exp,nbf,iat时间

    * @param string $Token 需要验证的token

    * @return bool|string

*/

    public static function verifyToken($Token)

{

        $tokens = explode('.', $Token);

        if (count($tokens) != 3)

            return false;

        list($base64header, $base64payload, $sign) = $tokens;

        //获取jwt算法

        $base64decodeheader = json_decode(self::base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY);

        if (empty($base64decodeheader['alg']))

            return false;

        //签名验证

        if (self::signature($base64header . '.' . $base64payload, self::$key, $base64decodeheader['alg']) !== $sign)

            return false;

        $payload = json_decode(self::base64UrlDecode($base64payload), JSON_OBJECT_AS_ARRAY);

        //签发时间大于当前服务器时间验证失败

        if (isset($payload['iat']) && $payload['iat'] > time())

            return false;

        //过期时间小宇当前服务器时间验证失败

        if (isset($payload['exp']) && $payload['exp'] < time())

            return false;

        //该nbf时间之前不接收处理该Token

        if (isset($payload['nbf']) && $payload['nbf'] > time())

            return false;

        return $payload;

}

    /**

    * base64UrlEncode  https://jwt.io/  中base64UrlEncode编码实现

    * @param string $input 需要编码的字符串

    * @return string

*/

    private static function base64UrlEncode($input)

{

        return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));

}

    /**

    * base64UrlEncode  https://jwt.io/  中base64UrlEncode解码实现

    * @param string $input 需要解码的字符串

    * @return bool|string

*/

    private static function base64UrlDecode($input)

{

        $remainder = strlen($input) % 4;

        if ($remainder) {

            $addlen = 4 - $remainder;

            $input .= str_repeat('=', $addlen);

}

        return base64_decode(strtr($input, '-_', '+/'));

}

    /**

    * HMACSHA256签名  https://jwt.io/  中HMACSHA256签名实现

    * @param string $input 为base64UrlEncode(header).".".base64UrlEncode(payload)

    * @param string $key

    * @param string $alg  算法方式

    * @return mixed

*/

    private static function signature($input, $key, $alg = 'HS256')

{

        $alg_config=array(

            'HS256'=>'sha256'

        );

        return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));

}

}

转载自 https://blog.csdn.net/qq_33858250/article/details/89419869

相关文章

网友评论

      本文标题:jwt web token php 实现

      本文链接:https://www.haomeiwen.com/subject/lxphfktx.html