PHP
PHP实现JWT认证方法
PHP实现JWT认证方法
最近比较空闲,查看了接口安全方面的资料,看到了JWT(JSON Web Token),处于好奇研究看了下,并写了一个代码模拟了这个过程,在这里跟大家分享下,对于什么叫JWT,以及如何使用,在这里我就不重复了,官网写得很仔细了,大家可以访问查看JWT资料。
#设置头部 $headers = array( "typ" => "JWT", "alg" => "HS256" ); #设置秘钥 $key = '123456'; #############################demo############################# $payload = array( "iss" => "admin", //jwt签发者 'sub' => 'user', //jwt所面向的用户 'aud' => 'John Doe', //接收jwt的一方 'exp' => time() + 60 * 60, //jwt的过期时间,这个过期时间必须要大于签发时间 'iat' => time(), //jwt的签发时间 'jti' => md5(uniqid('JWT') . time()), //Token //token ); #生成token $token = getToken($payload, $headers, $key); echo "签发的签名" . $token; #检验token $getPayload = verifyToken($token, $key); var_dump($getPayload); #############################生成token############################# /** * 拼接生成token * @param $payload * @param $headers * @param $key * @return bool|string */ function getToken($payload, $headers, $key) { if (is_array($payload)) { $base64header = base64UrlEncode(json_encode($headers, JSON_UNESCAPED_UNICODE)); $base64payload = base64UrlEncode(json_encode($payload, JSON_UNESCAPED_UNICODE)); $token = $base64header . '.' . $base64payload . '.' . signature($base64header . '.' . $base64payload, $key, $headers['alg']); return $token; } else { return false; } } /** * 生成签名 * @param $input * @param $key * @param string $alg * @return mixed */ function signature($input, $key, $alg = 'HS256') { $alg_config = array( 'HS256' => 'sha256' ); return base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key, true)); } #############################解析token############################# /** * 验证签名 * @param $Token * @param string $key * @return bool|mixed */ function verifyToken($Token, $key = "") { $tokens = explode('.', $Token); if (count($tokens) != 3) return false; list($base64header, $base64payload, $sign) = $tokens; //获取jwt算法 $base64DecodeHeader = json_decode(base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY); if (empty($base64DecodeHeader['alg'])) return false; //签名验证 if (signature($base64header . '.' . $base64payload, $key, $base64DecodeHeader['alg']) !== $sign) return false; $payload = json_decode(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; } #############################公共方法############################# /** * base64链接编码 * @param $input * @return mixed */ function base64UrlEncode($input) { return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); } /** * base64链接解码 * @param $input * @return bool|string */ function base64UrlDecode($input) { $remainder = strlen($input) % 4; if ($remainder) { $addlen = 4 - $remainder; $input .= str_repeat('=', $addlen); } return base64_decode(strtr($input, '-_', '+/')); }
上面就是token的签发以及鉴定的过程,大家可以参考看看。
0条评论