PHP JsonWebToken的实现
2019-09-19 10:36
686 查看
废话不多说,上码(thinkphp环境)
<?php namespace app\index\controller; class Jwt { /** * @var array jwt头部 */ private static $header = [ //生成signature的算法 'alg' => 'HS256', //类型 'typ' => 'JWT' ]; /** * @var array jwt 载荷 */ private static $payload = [ //签发人 'iss' => '', //签发时间 'iat' => '', //过期时间 'exp' => '', //该时间之前不处理该token 'nbf' => '', //面向的用户 'sub' => '', //该Token唯一标识 'jti' => '' ]; /** * @var string 摘要密钥 */ private static $key = 'abc123'; /** * Jwt constructor. * @param string $sub 用户 * @param int $exp 过期时间(时间戳) * @param int $nbf 处理时间(时间戳) */ public function __construct() { } /** * 参数 * * @param string $sub * @param integer $exp * @param integer $nbf * @return void */ public static function setPayload(string $sub, int $exp, int $nbf = null) { if (!$nbf) { $nbf = time(); } self::$payload = [ 'iss' => 'program_name', 'iat' => time(), 'exp' => $exp, 'nbf' => $nbf, 'sub' => $sub, 'jti' => md5(uniqid('JWT') . time()) ]; } /** * 获取token * * @param string 签发用户 * @param int 过期时间戳 * @param int 该时间戳内不处理 * @return string 获取token */ public static function getToken(string $sub, int $exp, int $nbf=null) { // 设置json参数 if ($nbf) { self::setPayload($sub, $exp, $nbf); }else { self::setPayload($sub, $exp); } //base编码头 $base64header = self::base64UrlEncode(json_encode(self::$header, JSON_UNESCAPED_UNICODE)); $base64payload = self::base64UrlEncode(json_encode(self::$payload, JSON_UNESCAPED_UNICODE)); $token = $base64header . '.' . $base64payload . '.' . self::signature($base64header . '.' . $base64payload, self::$key, self::$header['alg']); return $token; } /** * @param string $Token 需要验证的token * @return bool|string */ public static function verifyToken(string $Token) { //分割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)); } }
演示一下如何使用
<?php namespace app\index\controller; class Index { public function index() { /* 获取一个在1小时后过期的token */ echo \app\index\controller\Jwt::getToken('user1',time()+3600); } public function verifyToken($token=null) { /* get方法输入之前的token验证 */ var_dump(\app\index\controller\Jwt::verifyToken($token)); } }
ps: jwt还有其他的功能查看代码注释
相关文章推荐
- python使用json web token (jwt)实现http api的加密传输
- jwt(json-web-token)在rest中的实现–jersey
- jwt(json-web-token)在rest中的实现--jersey
- python使用json web token (jwt)实现http api的加密传输
- 【2012年最新原创AJAX案例,重磅推出】1、使用ajax+js+json+dom+php+mysql实现超强 Web聊天室V2.0
- json web token的简单实现 JAVA
- JWT(JSON Web Token) Java与.Net简单编码实现
- Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signature,
- egg基于jsonwebtoken的Token实现认证机制
- Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证
- node.js+captchapng+jsonwebtoken实现登录验证示例
- JWT(Json Web Token)实现状态保持
- python使用json web token (jwt)实现http api的加密传输
- jQuery.getJSON与PHP 实现跨网站提交数据
- PHP Ajax JavaScript Json获取天气信息实现代码
- mysql+php+ajax实现分页查询(JSON拼接)
- php + WebUploader实现图片批量上传功能
- php操作JSON格式数据的实现代码
- 八幅漫画理解使用 JSON Web Token 设计单点登录系统
- 八幅漫画理解使用JSON Web Token(JWT)设计单点登录系统