所有文章 > API使用场景 > 使用Laravel 8和Sanctum创建带认证的RESTful API
使用Laravel 8和Sanctum创建带认证的RESTful API

使用Laravel 8和Sanctum创建带认证的RESTful API

1. 环境准备

在开始之前,确保你已经安装了 PHP 和 Composer。我们将使用 Composer 来创建一个新的 Laravel 项目。此外,为了简化数据库设置,我们将使用 SQLite,但你也可以选择其他数据库如 MySQL 或 PostgreSQL。

composer create-project laravel/laravel laravel-sanctum-api

进入项目目录并启动 Laravel 内置服务器:

cd laravel-sanctum-api
php artisan serve

2. 配置 SQLite 数据库

.env 文件中,将数据库连接设置为 SQLite:

DB_CONNECTION=sqlite

创建 SQLite 数据库文件:

touch database/database.sqlite

3. 创建产品模型和迁移


使用 Artisan 命令创建产品模型和迁移文件:

php artisan make:model Product --migration

database/migrations 目录中找到新创建的迁移文件,编辑其 up 方法以定义产品表的结构:

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('slug')->nullable();
        $table->text('description')->nullable();
        $table->decimal('price', 5, 2);
        $table->timestamps();
    });
}

运行迁移以创建数据库表:

php artisan migrate

4. 创建产品控制器和方法


生成产品控制器:

php artisan make:controller ProductController --api

app/Http/Controllers/ProductController.php 中定义 CRUD 方法:

use App\Models\Product;

class ProductController extends Controller
{
    public function index()
    {
        return Product::all();
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string',
            'slug' => 'required|string',
            'description' => 'nullable|string',
            'price' => 'required|numeric',
        ]);

        return Product::create($validated);
    }

    public function show($id)
    {
        return Product::findOrFail($id);
    }

    public function update(Request $request, $id)
    {
        $product = Product::findOrFail($id);
        $product->update($request->all());
        return $product;
    }

    public function destroy($id)
    {
        return Product::destroy($id);
    }
}

5. 定义路由

routes/api.php 中定义 API 路由:

use App\Http\Controllers\ProductController;

Route::get('/products', [ProductController::class, 'index']);
Route::post('/products', [ProductController::class, 'store']);
Route::get('/products/{id}', [ProductController::class, 'show']);
Route::put('/products/{id}', [ProductController::class, 'update']);
Route::delete('/products/{id}', [ProductController::class, 'destroy']);

6. 搜索功能


ProductController 中添加搜索方法,并在 routes/api.php 中定义相应的路由:

public function search(Request $request)
{
    $query = $request->input('name');
    return Product::where('name', 'like', "%{$query}%")->get();
}
Route::get('/products/search', [ProductController::class, 'search']);

7. 配置 Laravel Sanctum

安装 Laravel Sanctum:

composer require laravel/sanctum

发布 Sanctum 配置和迁移文件:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" --tag="sanctum"

运行迁移以创建令牌表:

php artisan migrate

app/Http/Kernel.php 中添加 Sanctum 中间件:

protected $middlewareGroups = [
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // ...
    ],
];

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

use Laravel\Sanctum\HasApiTokens;

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

8. 创建认证控制器

生成认证控制器:

php artisan make:controller AuthController

app/Http/Controllers/AuthController.php 中实现注册、登录和登出功能:

use App\Models\User;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $fields = $request->validate([
            'name' => 'required|string',
            'email' => 'required|string|unique:users,email',
            'password' => 'required|string|confirmed',
        ]);

        $user = User::create([
            'name' => $fields['name'],
            'email' => $fields['email'],
            'password' => bcrypt($fields['password'])
        ]);

        $token = $user->createToken('myapptoken')->plainTextToken;

        return response([
            'user' => $user,
            'token' => $token
        ], 201);
    }

    public function login(Request $request)
    {
        $fields = $request->validate([
            'email' => 'required|string',
            'password' => 'required|string'
        ]);

        $user = User::where('email', $fields['email'])->first();

        if (!$user || !Hash::check($fields['password'], $user->password)) {
            return response([
                'message' => 'Bad credentials'
            ], 401);
        }

        $token = $user->createToken('myapptoken')->plainTextToken;

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

    public function logout(Request $request)
    {
        $request->user()->tokens()->delete();

        return response([
            'message' => 'Logged out'
        ], 200);
    }
}

9. 定义认证路由

routes/api.php 中定义认证路由:

use App\Http\Controllers\AuthController;

Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);

Route::middleware('auth:sanctum')->group(function () {
    Route::post('/logout', [AuthController::class, 'logout']);
    Route::post('/products', [ProductController::class, 'store']);
    Route::put('/products/{id}', [ProductController::class, 'update']);
    Route::delete('/products/{id}', [ProductController::class, 'destroy']);
});

10. 测试 API

使用 Postman 或其他 HTTP 客户端测试你的 API。首先注册一个新用户并获取访问令牌:

POST http://localhost:8000/api/register
Content-Type: application/json

{
    "name": "Brad",
    "email": "brad@gmail.com",
    "password": "123456",
    "password_confirmation": "123456"
}

使用访问令牌进行认证请求:

POST http://localhost:8000/api/products
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json

{
    "name": "Test Product",
    "slug": "test-product",
    "description": "This is a test product",
    "price": 99.99
}

结论

通过这个教程,你已经成功创建了一个带有认证的 RESTful API。你可以使用这个 API 来管理产品数据,并通过 Sanctum 实现基于令牌的认证。Laravel 的强大功能和 Sanctum 的简洁性使得这个过程变得非常高效。

原文引自YouTube视频:https://www.youtube.com/watch?v=MT-GJQIY3EU

#你可能也喜欢这些API文章!

我们有何不同?

API服务商零注册

多API并行试用

数据驱动选型,提升决策效率

查看全部API→
🔥

热门场景实测,选对API

#AI文本生成大模型API

对比大模型API的内容创意新颖性、情感共鸣力、商业转化潜力

25个渠道
一键对比试用API 限时免费

#AI深度推理大模型API

对比大模型API的逻辑推理准确性、分析深度、可视化建议合理性

10个渠道
一键对比试用API 限时免费