首页 > 开发 > PHP > 正文

PHP JWT初识及其简单示例

2024-05-04 22:42:02
字体:
来源:转载
供稿:网友

一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt。才发现jwt已经被大家广泛的应用了。看来我有点out了。哈哈,趁着这个世界来好好看看这个。

JWT(JSON Web Token), 顾名思义就是可以在Web上传输的token,这种token是用JSON格式进行format的。它是一个开源标准(RFC 7519),定义了一个紧凑的自包含的方式在不同实体之间安全的用JSON格式传输信息。

由于现在很多项目都是前后端分离,restful api模式。所以传统的session模式就没有办法满足认证需求,这个时候jwt的作用就来了。可以说 restful api认证是jwt的一个很好的应用场景。

参数解释

名称 解释
iss (issuer) issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者
sub (Subject) 设置主题,类似于发邮件时的主题
aud (audience) 接收jwt的一方
exp (expire) token过期时间
nbf (not before) 当前时间在nbf设定时间之前,该token无法使用
iat (issued at) token创建时间
jti (JWT ID) 对当前token设置唯一标示

下面是一个很小的demo

<?phprequire_once 'src/JWT.php';header('Content-type:application/json');//定义Keyconst KEY = 'dasjdkashdwqe1213dsfsn;p';$user = [  'uid'=>'dadsa-12312-vsd1s1-fsds',  'account'=>'daisc',  'password'=>'123456'];$redis = redis();$action = $_GET['action'];switch ($action){  case 'login':    login();    break;  case 'info':    info();    break;}//登陆,写入验证tokenfunction login(){  global $user;  $account = $_GET['account'];  $pwd = $_GET['password'];  $res = [];  if($account==$user['account']&&$pwd==$user['password'])  {    unset($user['password']);    $time = time();    $token = [      'iss'=>'http://test.cc',//签发者      'iat'=>$time,      'exp'=>$time+60,      'data'=>$user    ];    $jwt = /Firebase/JWT/JWT::encode($token,KEY);    $res['code'] = 200;    $res['message'] = '登录成功';    $res['jwt'] = $jwt;  }  else  {    $res['message']= '用户名或密码错误';    $res['code'] = 401;  }  exit(json_encode($res));}function info(){  $jwt = $_SERVER['HTTP_AUTHORIZATION'] ?? false;  $res['code'] = 200;  if($jwt)  {    $jwt = str_replace('Bearer ','',$jwt);    if(empty($jwt))    {      $res['code'] = 401;      $res['msg'] = 'You do not have permission to access.';      exit(json_encode($res));    }    try{      $token = (array) /Firebase/JWT/JWT::decode($jwt,KEY, ['HS256']);      if($token['exp']<time())      {        $res['code'] = 401;        $res['msg'] = '登录超时,请重新登录';      }      $res['data']= $token['data'];    }catch (/Exception $E)    {      $res['code'] = 401;      $res['msg'] = '登录超时,请重新登录.';    }  }  else  {    $res['code'] = 401;    $res['msg'] = 'You do not have permission to access.';  }  exit(json_encode($res));}//连接redisfunction redis(){  $redis = new Redis();  $redis->connect('127.0.0.1');  return $redis;}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表