您的位置:

Laravel JWT:基于JWT的Laravel身份验证和授权

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。