一、Token和JWT
1、什么是Token
token 通过一次登录验证,得到一个鉴权字符串,以后带着这个鉴权字符串进行后续操作,这样就可以解决每次请求都要带账号密码的问题,而且也不需要反复使用账号和密码,安全方便。
2、什么是JWT
JWT 全称 JSON Web Tokens ,是一种规范化的 token。可以理解为对 token 这一技术提出一套规范。
二、准备
1、安装JWT
我们采用composer安装,首先我们进入项目目录下面执行composer命令(不懂composer的可以学习composer安装方法)。
composer require tymon/jwt-auth
2、新建jwt.confg文件
使用以下命名在项目的config文件中新建jwt.confg 文件。
php artisan vendor:publish –provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
3、生成密匙
php artisan jwt:secret
三、用户模型
利用Laravel框架开发用户模型代码,需要在用户模型里面使用implements实现对应的接口类。然后实现接口类中的方法,因为interface类的特性,我们在子类中必须实现它的方法。代码如下:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
use HasApiTokens, HasFactory, Notifiable;
protected fillable = [
'name',
'email',
'password'
];
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()::array
{
return [];
}
}
四、授权配置
打开配置文件 config/auth.php,执行下面操作。
1)把guards的key改为api,默认验签为api
2)把driver改为jwt
3)provider可以自己取名,我这里取名users因为是user表为用户表,方便维护
4)文件往下的providers中定义我们刚刚guards中命名的provider的字段
5)在providers中的driver中本次取用的是模型eloquent验证,这个根据自身需要
6)model为我们用户的模型命名空间
'guards'=>[
'api'=>[
'driver'=>'jwt',
'provider'=>'users'
]
],
'providers'=>[
'users'=>[
'driver'=>'eloquent',
'model'=>app\Models\User::class
]
],
五、登录
新建一个AuthController控制器并创建login方法。
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
class AuthController extends Controller
{
public function login(): JsonResponse
{
$credentials = request(['email', 'password']);
if (! $token = auth()->guard('api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth()->factory()->getTTL() * 60
]);
}
}
token保存到数据库中,用户下次请求带上token,服务器验证数据库中的token实现用户登录。