首页 > 编程语言 >php jwt

php jwt

时间:2023-03-04 11:35:41浏览次数:47  
标签:return string jwt token input php payload

<?php
namespace app\api\library;
/**
 * PHP实现jwt
 */
class Jwt {

    //头部
    private static $header=array(
        'alg'=>'HS256', //生成signature的算法
        'typ'=>'JWT'  //类型
    );

    //使用HMAC生成信息摘要时所使用的密钥
    private static $key='526F21GV23A';

    /**
     * 获取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(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']);
            return $token;
        }else{
            return false;
        }
    }

    /**
     * 验证token是否有效,默认验证exp,nbf,iat时间
     * @param string $Token 需要验证的token
     * @return bool|string
     */
    public static function verifyToken(string $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(string $input)
    {
        return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
    }

    /**
     * base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现
     * @param string $input 需要解码的字符串
     * @return bool|string
     */
    private static function base64UrlDecode(string $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(string $input, string $key, string $alg = 'HS256')
    {
        $alg_config=array(
            'HS256'=>'sha256'
        );
        return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));
    }
}
//
////测试和官网是否匹配begin
//$payload=array('sub'=>'1234567890','name'=>'John Doe','iat'=>1516239022);
//$jwt=new Jwt;
//$token=$jwt->getToken($payload);
//echo "<pre>";
//echo $token;
//
////对token进行验证签名
//$getPayload=$jwt->verifyToken($token);
//echo "<br><br>";
//var_dump($getPayload);
//echo "<br><br>";
////测试和官网是否匹配end
//
////自己使用测试begin
//$payload_test=array('iss'=>'admin','iat'=>time(),'exp'=>time()+7200,'nbf'=>time(),'sub'=>'www.admin.com','jti'=>md5(uniqid('JWT').time()));;
//$token_test=Jwt::getToken($payload_test);
//echo "<pre>";
//echo $token_test;
//
////对token进行验证签名
//$getPayload_test=Jwt::verifyToken($token_test);
//echo "<br><br>";
//var_dump($getPayload_test);
//echo "<br><br>";
////自己使用时候end

  

标签:return,string,jwt,token,input,php,payload
From: https://www.cnblogs.com/jwyq/p/17177943.html

相关文章

  • php上传文件
    下面的代码放在一个名为UploadFile.class.php文件内<?phpclassUploadFile{private$max_size='2000000';//设置上传文件的大小,此为2Mprivate$rand_......
  • PHP实现将多个文件压缩成zip格式并下载到本地
    1//这里需要注意该目录是否存在,并且有创建的权限2$zipname='path/test.zip'3//这是要打包的文件地址数组4$files=array("mypath/test1.txt","mypath/test2......
  • NetCore JWT token
    在netcore中jwt使用场景很多,网上有很多的资料,这里不再累述,之后有机会会单独介绍,今天主要以实战为主。1、createjwttoken1publicinterfaceIJwtTokenService2......
  • Laravel运行项目提示/composer/autoload_real.php问题
    1.确保已安装Composer。如果没有请安装.安装步骤参考:http://www.360doc.com/content/22/0919/15/65839921_1048527526.shtml2.进入Laraver项目的根目录,通过命令窗口执行......
  • Linux运用一些常用命令,优秀的PHPer都需掌握
    作为一名优秀的phper,Linux是必备的一项技能,工作3-5年的基本能明白我讲的道理!今天搜集整理了一些Linux服务器运维常用命令,希望对大家有帮助:1.删除0字节文件 find -type......
  • PHP8安装(centos7环境)
    一、事先安装的模块yuminstall-ybzip2-devellibcurl-devellibxml2-develsqlite-develonigurumaoniguruma-devellibxml2libxml2-develbzip2bzip2-devellibcurl......
  • PHP 常见字符串函数
    1、字符串格式化1、trim():删除字符串两端的空格或其他预定义字符2、rtrim():删除字符串右边的空格或其他预定义字符3、ltrim():删除字符串左边的空格或其他预定义......
  • php之Opcache深入理解
    PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。......
  • PHP介绍和基础知识
    PHP(外文名:PHP:HypertextPreprocessor,中文名:“超文本预处理器”)是一种通用开源的、简单的,面向对象的,解释型的,健壮的,安全的,性能非常之高的,独立于架构的,可移植的,动态的脚......
  • PHP写UltraEdit插件脚本实现方法
    UltraEdit可以扩展许多函数来减少我们编写的体力劳动,这个功能的调用是比较实用的,下面是给大家带来的PHP写UltraEdit插件脚本实现方法,一起进入下文了解一下吧!需求:1svn上的......