在Laravel开发中,使用JWT(JSON Web Tokens)进行用户身份认证是一种高效而安全的方式。JWT能够在跨多个系统的场景下验证和传输用户认证信息,本文将讲解如何在Laravel应用中集成JWT验证。

安装依赖库

$ composer require tymon/jwt-auth

配置 JWT

$ php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

上述命令将生成一个名为jwt.php的配置文件。您可以根据自己的需求修改该文件中的设置项。

生成 JWT 密钥

$ php artisan jwt:secret

该命令将在.env文件中添加一个新的JWT_SECRET配置项,该值将用于生成JWT。

创建认证控制器和路由

$ php artisan make:controller AuthController

在AuthController中实现用户认证逻辑

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            $user = Auth::user();

            $token = $user->createToken('YourAppName')->accessToken;

            return response()->json(['token' => $token], 200);
        }

        return response()->json(['error' => 'Unauthorized'], 401);
    }
}

定义路由

Route::post('login', 'AuthController@login');

创建中间件

$ php artisan make:middleware JWTMiddleware

在JWTMiddleware中实现中间件逻辑

use Closure;
use Tymon\JWTAuth\Facades\JWTAuth;
use Symfony\Component\HttpFoundation\Response;

class JWTMiddleware
{
    public function handle($request, Closure $next)
    {
        try {
            $user = JWTAuth::parseToken()->authenticate();
        } catch (\Exception $e) {
            if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException) {
                return response()->json(['error' => 'Token is Invalid'], Response::HTTP_UNAUTHORIZED);
            } elseif ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) {
                return response()->json(['error' => 'Token is Expired'], Response::HTTP_UNAUTHORIZED);
            } else {
                return response()->json(['error' => 'Something is wrong'], Response::HTTP_UNAUTHORIZED);
            }
        }

        return $next($request);
    }
}

注册中间件

protected $routeMiddleware = [
    'jwt' => \App\Http\Middleware\JWTMiddleware::class,
];

使用 JWT Middleware 保护路由

Route::group(['middleware' => ['jwt']], function () {
    // 在此处定义需要进行认证的路由
});

以上是在Laravel中使用JWT验证实现用户身份认证的基本流程。您可以根据项目的实际需求进行更进一步的扩展和优化。