在Laravel API中实现JWT认证 - StackPuz博客

作者:API传播员 · 2025-11-19 · 阅读时间:6分钟

JWTJSON Web令牌)是一种高效且广泛应用的身份验证方式,主要用于保护API端点,确保只有经过身份验证的用户才能访问。与传统的基于会话的身份验证不同,JWT是无状态的,不需要服务器端会话存储,因此非常适合构建可扩展和高效的应用程序。在本指南中,我们将详细介绍如何在Laravel API中实现JWT身份验证,从生成用户登录令牌到验证这些令牌以保护API端点,全面提升应用程序的数据和资源安全性。


先决条件

在开始之前,请确保您已安装以下工具:

  • PHP >= 8.0
  • Composer
  • Laravel 11.0.3

此外,您需要具备基本的Laravel框架使用经验。


设置项目

  1. 创建一个新的Laravel项目:

    composer create-project laravel/laravel laravel_api 11.0.3
    cd laravel_api
  2. 安装必要的依赖包:

    composer require laravel/ui "^4.0"
    composer require tymon/jwt-auth

项目结构

以下是项目的基本目录结构:

├─ .env
├─ app
│ ├─ Http
│ │ ├─ 控制器
│ │ │ └─ Auth
│ │ │ └─ LoginController.php
│ │ └─ 中间件
│ │ └─ Authenticate.php
│ └─ 模型
│ └─ User.php
├─ 配置
│ └─ auth.php
├─ 数据库
│ └─ database.sqlite
├─ 资源
│ └─ 视图
│ ├─ index.html
│ └─ login.html
└─ 路由
├─ api.php
└─ web.php

配置项目文件

配置 .env 文件

更新 .env 文件以支持JWT身份验证:

SESSION_DRIVER=file
CACHE_STORE=file
DB_CONNECTION=sqlite
JWT_SECRET=b0WciedNJvFCqFRbB2A1QhZoCDnutaoen5g1FEDO0HsLTUGINP4GXh2OXVpTqQL

配置 api.php

定义API路由:

 'auth'], function () {
    Route::get('/user', [LoginController::class, 'getUser']);
});

配置 web.php

定义Web路由:

<?php

Route::get('/', function () {
    return view('index');
});Route::get('/login', function () {
    return view('login');
});

自定义中间件 Authenticate.php

修改默认的身份验证中间件以返回401错误:

<?php

namespace AppHttpMiddleware;use IlluminateAuthMiddlewareAuthenticate as Middleware;class Authenticate extends Middleware
{
    protected function redirectTo($request)
    {
        abort(401);
    }
}

配置 auth.php

设置JWT为默认的身份验证驱动:

 [
        'guard' => 'api',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => AppModelsUser::class,
        ],
    ],
];

配置 User.php

修改用户模型以支持JWT:

getKey();
    }    public function getJWTCustomClaims()
    {
        return [];
    }
}

配置 LoginController.php

实现用户登录和获取用户信息:

json(['name' => Auth::user()->name]);
    }    public function credentials()
    {
        return [
            'name' => request()->name,
            'password' => request()->password,
        ];
    }
}

前端视图文件

index.html

主页显示用户登录状态:




    
    
    
    
                                    

主页

>
ethod: 'POST', body: JSON.stringify({ name: document.getElementById('name').value, password: document.getElementById('password').value }), headers: { 'Content-Type': 'application/json' } }).then(response =>

您当前未登录。
几秒钟后将重定向到登录页面。d: 'POST', body: JSON.stringify({ name: document.getElementById('name').value, password: document.getElementById('password').value }), headers: { 'Content-Type': 'application/json' } }).then(response =>

login.html

登录页面:




    
    
    
    


    

登录

function login() { fetch('/api/login', { method: 'POST', body: JSON.stringify({ name: document.getElementById('name').value, password: document.getElementById('password').value }), headers: { 'Content-Type': 'application/json' } }).then(response => { if (response.ok) { response.json().then(data => { localStorage.setItem('token', data.token); location = '/'; }); } else { alert('登录失败,请检查用户名和密码'); } }); return false; }

测试项目

  1. 启动Laravel开发服务器:

    php artisan serve
  2. 在浏览器中访问 http://localhost:8000

  3. 测试登录、注销以及JWT令牌的功能。


结论

通过本指南,您学习了如何在Laravel API中实现JWT身份验证。这种基于令牌的身份验证方式不仅安全高效,还能简化会话管理,适用于现代Web和移动应用程序。通过正确的配置和错误处理,您可以为应用程序提供无缝的用户身份验证体验。

原文链接: https://blog.stackpuz.com/implementing-jwt-authentication-in-laravel-api/