php使用jwt作登录验证

本文介绍了如何在PHP项目中使用JWT进行用户身份验证,包括在登录控制器中生成并返回token,以及创建一个CheckToken类用于解密和验证token。作者详细展示了安装JWT库、生成token的代码以及在后续API接口中使用token的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 在项目根目录下,安装jwt

composer require firebase/php-jwt

2 在登录控制器中加入生成token的代码

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class Login extends Cross
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index(Request $request)
    {
        try{
            validate(LoginValidate::class)->scene('login')->check($this->request->param());
            $params = $request->param();
            $db = new UserModel();
            $result = $db->where("username='{$params['username']}' AND password='{$params['password']}'")->find();
            if(!empty($result)){
                $key = '!@#$%*&';         //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当于加密中常用的 盐  salt
                $token = array(
                    "iss" => $key,        //签发者 可以为空
                    "aud" => '',          //面象的用户,可以为空
                    "iat" => time(),      //签发时间
                    "nbf" => time() + 3,  //在什么时候jwt开始生效  (这里表示生成100秒后才生效)
                    "exp" => time() +200, //token 过期时间
                    "user_id" => $result['id']       //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
                );
                $jwt = JWT::encode($token, $key, 'HS256');
                $this->response(200,"登录成功",['token'=>$jwt]);
            }else{
                $this->response(401,"用户名或者密码错误");
            }
        }catch (Exception $exception){
            return $this->response(400,"请输入完整的信息",$exception->getMessage());
        }

    }
    


}

 可以看到返回token

3  创建一个checkToken类进行解密

<?php

namespace app\api\controller;
use think\Controller;
use think\Request;
use app\api\controller\Cross;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Firebase\JWT\SignatureInvalidException;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\ExpiredException;
use think\Exception;
class CheckToken extends Cross
{
    protected $user_id;
    protected function initialize()
    {
        parent::initialize(); // TODO: Change the autogenerated stub
//        解密token,存储用户id;
        $key = '!@#$%*&';
        $token =  request()->header('token');
        if(empty($token)){
            $this->response(300,"你还没有登录");
        }
        try {
            JWT::$leeway = 60; //当前时间减去60,把时间留点余地
            $key = new Key($key, 'HS256');

            $decoded = JWT::decode($token, $key); //HS256方式,这里要和签发的时候对应
            $arr = (array)$decoded;
            $this->user_id= $arr['user_id'];
        } catch (SignatureInvalidException $e) { //签名不正确

            $this->response(300,"签名不正确");
        } catch (BeforeValidException $e) { // 签名在某个时间点之后才能用
            $this->response(301,"登录失效,请重新登录");

        } catch (ExpiredException $e) { // token过期

            $this->response(301,"登录失效,请重新登录");
        } catch (Exception $e) { //其他错误
            $this->response(300,"未知错误");
        }
    }
}
 所有需要登录操作的接口,都继承这个类

<?php

namespace app\api\controller;

use app\api\controller\CheckToken;
use think\Controller;
use think\Request;

class Home extends CheckToken
{
    public function index(){
        $this->response(200,'成功',$this->user_id);
    }
}
 在前端请求拦截器中,将获得的token设置为请求头

 即可看到打印出来了用户id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值