Laravel 12 实现 API 登录令牌认证

Laravel 12 实现 API 登录令牌认证

在 Laravel 12 中实现基于令牌(Token)的 API 认证,可以使用 Laravel Sanctum 或 Laravel Passport。以下是两种方式的实现方法:

方法一:使用 Laravel Sanctum (轻量级 API 认证)

1. 安装 Sanctum

复制代码
composer require laravel/sanctum

2. 发布 Sanctum 迁移和配置文件

复制代码
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

3. 运行数据库迁移

复制代码
php artisan migrate

4. 配置 Sanctum

在 config/sanctum.php 中配置(通常保持默认即可)

5. 修改用户模型

在 app/Models/User.php 中添加 HasApiTokens trait:

复制代码
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    // ...
}

6. 创建认证路由

在 routes/api.php 中添加:

复制代码
use App\Http\Controllers\AuthController;

Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->post('/logout', [AuthController::class, 'logout']);
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

7. 创建认证控制器

复制代码
php artisan make:controller AuthController

在 app/Http/Controllers/AuthController.php 中:

复制代码
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        if (!Auth::attempt($request->only('email', 'password'))) {
            return response()->json([
                'message' => 'Invalid login details'
            ], 401);
        }

        $user = User::where('email', $request['email'])->firstOrFail();
        $token = $user->createToken('auth_token')->plainTextToken;

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

    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();
        
        return response()->json([
            'message' => 'Successfully logged out'
        ]);
    }
}

8. 测试 API

使用 Postman 或 cURL 测试:

登录请求:‌

复制代码
curl --location --request POST 'http://your-app.test/api/login' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
    "email": "user@example.com",
    "password": "password"
}'

获取用户信息:‌

复制代码
curl --location --request GET 'http://your-app.test/api/user' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN_HERE'

方法二:使用 Laravel Passport (OAuth2 全功能实现)

1. 安装 Passport

复制代码
composer require laravel/passport

2. 运行数据库迁移

复制代码
php artisan migrate

3. 安装 Passport

复制代码
php artisan passport:install

4. 配置 Passport

在 app/Models/User.php 中添加:

复制代码
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    // ...
}

在 config/auth.php 中设置 API 驱动:

复制代码
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

5. 创建认证路由

在 routes/api.php 中添加:

复制代码
use App\Http\Controllers\AuthController;

Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:api')->post('/logout', [AuthController::class, 'logout']);
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

6. 创建认证控制器

复制代码
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;

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

        if (!Auth::attempt($credentials)) {
            return response()->json([
                'message' => 'Unauthorized'
            ], 401);
        }

        $user = $request->user();
        $tokenResult = $user->createToken('Personal Access Token');
        $token = $tokenResult->accessToken;

        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer',
            'expires_at' => $tokenResult->token->expires_at->toDateTimeString()
        ]);
    }

    public function logout(Request $request)
    {
        $request->user()->token()->revoke();
        
        return response()->json([
            'message' => 'Successfully logged out'
        ]);
    }
}

令牌刷新机制(可选)

如果需要实现令牌刷新功能,可以添加以下路由和方法:

复制代码
Route::post('/refresh', [AuthController::class, 'refresh']);

// 在 AuthController 中添加
public function refresh(Request $request)
{
    $user = $request->user();
    $user->token()->revoke();
    $tokenResult = $user->createToken('Personal Access Token');
    
    return response()->json([
        'access_token' => $tokenResult->accessToken,
        'token_type' => 'Bearer',
        'expires_at' => $tokenResult->token->expires_at->toDateTimeString()
    ]);
}

选择建议

Sanctum‌:适合简单的 SPA 或移动应用认证,轻量级

Passport‌:适合需要完整 OAuth2 功能的复杂应用

希望能帮助你在 Laravel 12 中成功实现基于令牌的认证系统!

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
BingoGo4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·laravel
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php