Laravel JWT是一个基于JWT(JSON Web Token)的Laravel身份验证和授权包。JWT作为一种轻量级的身份验证和授权解决方案,在Web应用程序中越来越受欢迎。本文将从多个方面对Laravel JWT进行详细阐述。
一、安装和配置
1、安装和配置Laravel JWT非常简单,首先您需要使用composer安装Laravel JWT:
composer require tymon/jwt-auth
2、安装成功后,您需要发布配置文件以及一些必要的文件:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
3、在.env文件中添加一个密钥以用于JWT加密和解密:
JWT_SECRET=your-secret-key
4、接下来您需要对config/auth.php进行修改,将默认的guard和provider设置为JWT:
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
],
二、认证和授权
1、Laravel JWT提供了一个auth:api中间件,我们可以使用它来保护我们的API路由,只有经过身份验证的用户才能访问被保护的路由。
2、在您的路由文件中使用auth:api中间件来保护需要身份验证的路由:
Route::group(['middleware' => 'auth:api'], function () {
Route::get('/profile', 'UserController@profile');
Route::post('/logout', 'AuthController@logout');
});
3、Laravel JWT还提供了一个jwt.auth中间件,我们可以使用它来手动验证JWT并获取当前用户。只需要在需要手动验证JWT的方法中使用jwt.auth中间件即可:
public function profile()
{
$user = JWTAuth::parseToken()->authenticate();
return response()->json(['user' => $user]);
}
4、Laravel JWT还提供了jwt.auth和jwt.refresh路由,我们可以使用它们来获取新的JWT令牌或者刷新过期的JWT令牌:
Route::group(['middleware' => 'api', 'prefix' => 'auth'], function ($router) {
Route::post('login', 'AuthController@login');
Route::post('refresh', 'AuthController@refresh');
Route::post('logout', 'AuthController@logout');
});
5、最后是用户注册和登录的方法:
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = Auth::attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
}
public function register(Request $request)
{
$user = new User();
$user->name = $request->input('name');
$user->email = $request->input('email');
$user->password = Hash::make($request->input('password'));
$user->save();
$token = Auth::fromUser($user);
return $this->respondWithToken($token, 201);
}
三、JWT黑名单
1、Laravel JWT提供了一个JWT黑名单,我们可以使用它来撤销JWT。当一个JWT被加入到黑名单中,它就不能再被使用。
2、使用Laravel JWT的JWT黑名单需要进行以下配置:
(1)在config/jwt.php文件中将denylist中间件的启用状态设置为true:
'denylist_enabled' => true,
(2)在config/jwt.php文件中配置JWT黑名单的时间:
'ttl' => env('JWT_TTL', 60),
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),
'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0),
(3)运行以下命令进行JWT黑名单的迁移:
php artisan jwt:secret
php artisan jwt:blacklist:install
3、现在您可以在需要撤销JWT的时候使用以下方法:
public function logout(Request $request)
{
JWTAuth::invalidate($request->bearerToken());
return response()->json(['message' => 'Successfully logged out']);
}
四、自定义响应
1、默认情况下,Laravel JWT返回的响应是JSON格式的,如果您需要自定义响应格式或者添加一些额外的响应头(如Token-Expired),您可以自己定义RespondWithToken方法:
protected function respondWithToken($token, $code = 200)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => JWTAuth::factory()->getTTL() * 60
], $code);
}
2、在您的控制器方法中使用respondWithToken方法来自定义响应:
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = Auth::attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
}
五、总结
本文详细阐述了如何使用Laravel JWT进行基于JWT的身份验证和授权。从安装和配置、认证和授权、JWT黑名单和自定义响应等多个方面讲解了Laravel JWT的使用方法和注意事项。希望本文能够帮助您更好地使用Laravel JWT。