首先是理论,随后实现
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进行访问