PHP 使用 jwt 方式用户身份认证
浏览量:280
why:
how:
封装类
// +----------------------------------------------------------------------
// | Created by PhpStorm
// +----------------------------------------------------------------------
// | Date: 2018/9/10
// +----------------------------------------------------------------------
// | Blog: ( https://www.woann.cn )
// +----------------------------------------------------------------------
// | Author: woann <304550409@qq.com>
// +----------------------------------------------------------------------
namespace AppUtility;
class Jwtbase {
//头部
private static $header=array(
\alg\=>\HS256\, //生成signature的算法
\typ\=>\JWT\ //类型
);
//使用HMAC生成信息摘要时所使用的密钥
private static $key=\KEY\;
public static function getToken(array $payload)
{
$arr = [
\iss\=>\yamecent\, //该JWT的签发者
\iat\=>time(), //签发时间
\exp\=>time()+36002415, //过期时间
\nbf\=>time(), //该时间之前不接收处理该Token
\sub\=>\\, //面向的用户
\jti\=>md5(uniqid(\JWT\).time()) //该Token唯一标识
];
$payload = array_merge($arr,$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;
}
}
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;
}
private static function base64UrlEncode(string $input)
{
return str_replace(\=\, \\, strtr(base64_encode($input), \+/\, \-_\));
}
private static function base64UrlDecode(string $input)
{
$remainder = strlen($input) 4;
if ($remainder) {
$addlen = 4 - $remainder;
$input .= str_repeat(\=\, $addlen);
}
return base64_decode(strtr($input, \-_\, \+/\));
}
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));
}
}
使用
1.生成
$token = Jwtbase::getToken([\user_id\=>$user->id]);//生成token
2.验证
$header = $request->header(\Authorization\);//验证
$token = explode(\ \,$header);
if(!$header || !$token){
return $this->json(419,\登录信息已过期,重新登录\);
}
$data = Jwtbase::verifyToken($token[1]);
if(!$data){
return $this->json(419,\登录信息已过期,重新登录\);
}


感谢支持与鼓励~