美文网首页
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