自学的菜鸟 2021-12-01 13:06 采纳率: 62.5%
浏览 78
已结题

PHP怎么使用jwt生成 token并且验证

我现在需要写一个用户登录的端口,前端发送登录信息用户名:xiaoming,密码:123456到端口www.abc.com/php/login.php,这个PHP要验证用户名和密码,然后生成一个token和用户信息返回给前端,然后前端再次请求的时候会带上这个token,php要怎么验证解析这个token并返回相应的用户信息,这个php文件要怎么写呢?

<?php
require_once '../vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

?>


  • 写回答

2条回答 默认 最新

  • 呼叫007 2021-12-01 14:45
    关注

    第一 账号密码登录 获取token
    JWT需要composer安装下,然后调用

    $jwt_config = [
        'iss' => config('jwt.iss'), //签发者 可选
        'aud' => config('jwt.iss'), //接收该JWT的一方,可选
        'iat' => time(), //签发时间
        'nbf' => time() , //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
        'exp' => time()+7200, //过期时间,这里设置2个小时
        'data' => [ //自定义信息,不要定义敏感信息
            'user_id' => $user_data['id']
        ]
    ];
    $token=JWT::encode($jwt_config,config('jwt.key'),'HS256');
    

    第二 解密token

    //检测token
    public function check_token($token){
      try {
        JWT::$leeway = 60;//当前时间减去60,把时间留点余地
        $decoded = JWT::decode($token, config('jwt.key'), ['HS256']); //HS256方式,这里要和签发的时候对应
        $arr = (array)$decoded;
        $result=['code'=>200,'msg'=>'OK','user_id'=>$arr['data']->user_id];
      } catch(SignatureInvalidException $e) {  //签名不正确
        $result=['code'=>400,'msg'=>$e->getMessage()];
      }catch(BeforeValidException $e) {  // 签名在某个时间点之后才能用
        $result=['code'=>400,'msg'=>$e->getMessage()];
      }catch(ExpiredException $e) {  // token过期
        $result=['code'=>400,'msg'=>$e->getMessage()];
      }catch(\Exception $e) {  //其他错误
        $result=['code'=>400,'msg'=>$e->getMessage()];
      }
      return $result;
    }
    这样就能得到用户id
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 已采纳回答 12月6日
  • 修改了问题 12月1日
  • 创建了问题 12月1日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效