php laravel中jwt的使用

这篇博客介绍了如何在Laravel中结合Composer安装Passport包,实现JWT(JSON Web Token)认证。首先通过`composer require laravel/passport=~9.0`安装,然后创建用户表并设置密码加密。接着,配置`auth.php`文件以使用Passport作为API的认证驱动,并设定token的过期时间。在登录控制器中,验证用户输入,成功后生成并返回JWT。Postman测试显示,无token无法访问接口,需携带token进行请求。

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

首先是理论,随后实现
JWT 出场

JWT 还有个好处,那就是你可以不用在服务端存储认证信息(比如 token),完全由客户端提供,服务端只要根据 JWT 自身提供的解密算法就可以验证用户合法性,而且这个过程是安全的。

JWT 数据结构
JWT 最后的形式就是个字符串,它由头部、载荷与签名这三部分组成,中间以「.」分隔。

在这里插入图片描述

1.composer安装

composer require laravel/passport=~9.0

2.具体实现步骤

最好搭配auth()登录一起使用 但需要注意 auth的登录密码需要使用 Hash类生成 从而符合其auth内部的密码规则

php artisan make:migration create_users_table --create=apiuser

数据库字段

  Schema::create('apiuser', function (Blueprint $table) {
            $table->id();
            $table->string('username',100)->comment('账号');
            $table->string('password',100)->comment('密码');
            $table->unsignedTinyInteger('click')->default(0)->comment('请求次数');
            $table->timestamps();
        });

密码要加密 可以手动写入
在这里插入图片描述

在这里插入图片描述

随后迁移,生成数据表,保存token数据

php artisan migrate 

执行完后会生成5张表
在这里插入图片描述

3.生成客户端授权码

php artisan passport:install 

4.修改config/auth.php文件中的api配置

 'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        //解决接口登录

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
          //  'hash' => false,
        ],
    ],


'providers' => [
        'users' => [
            'driver' => 'eloquent',
            //绑定模型层 新建
            'model' => \App\models\Apiuser::class,
        ],

     
    ],



创建模型层
在这里插入图片描述
写token的过期时间

令牌的有效期

use Laravel\Passport\Passport; 

// token*认证有效期*2*小时 

Passport::tokensExpireIn(now()>addHour(2)); 

//* 刷新*token*认证有效期*30*天 

Passport::refreshTokensExpireIn(now()>addDays(30)); 

在这里插入图片描述

解决auth在接口中登录没有attempt问题

在这里插入图片描述

代码
在这里插入图片描述

 public function login(Request $request) {
        // 表单验证
        // 异步捕获  ajax 和  接口会用
        try {
            // 验证不通过跳转到 首页  需要自定义异常走向,错误信息要让自己来确定
            $this->validate($request, [
                'username' => 'required',
                'password' => 'required'
            ]);
        } catch (\Exception $exception) {
            return response()->json(['status' => 1000, 'msg' => '账号或密码不能为空'], 400);
        }
        // 查看对象中可用的方法
        $bool=auth()->guard('web')->attempt($request->all());
        // 账号登录成功
        if ($bool) {
            // 生成token
            // 得到用户模型对象
            $userModel = auth()->guard('web')->user();

            // 判断接口当天是否超过2000次
//            if ($userModel->click > env('APINUM')) {
//                return response()->json(['status' => 1002, 'msg' => '当天请求次数超上限'], 500);
//            }
            // 生成token 保存在服务器端1份,给客户返回1份
            $token = $userModel->createToken('api')->accessToken;
//             dd($token);
            // 让当请求次数加 1  数据一致
            $aa=$userModel->increment('click'); //set click=click+1
//           dd($aa);
            $data = [
                'expire' => 7200,
                'token' => $token
            ];
            return response()->json($data);
        } else {
            return response()->json(['status' => 1001, 'msg' => '账号或密码不正确'], 401);
        }

    }

Postman 测试

在这里插入图片描述
在这里插入图片描述
测试数据 直接没用token 不能访问
需加入token进行访问
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值