使用 Laravel Passport 的 Laravel 11 API 身份验证

389 阅读1分钟

第 1 步:使用 Composer 安装 Laravel 11

首先,选择要安装 Laravel 的文件夹,然后在终端或 CMD 上执行以下命令以安装 Laravel 11:

composer create-project laravel``/laravel laravel-11-passport

通过 Laravel 安装程序安装:

laravel new laravel-11-passport

步骤 2:设置数据库配置

打开 .env 文件并设置数据库配置:

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=your database name(laravel_11_passport)

DB_USERNAME=your database username(root)

DB_PASSWORD=your database password(root)

步骤 3:启用 API 并更新身份验证异常

php artisan ``install``:api

启用 API 后,我们现在将更新 API 中间件的身份验证异常,以便它不会重定向到 login,而是会引发异常: bootstrap/app.php 引导/app.php

<?php
 
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Http\Request;
 
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->render(function (AuthenticationException $e, Request $request) {
            if ($request->is('api/*')) {
                return response()->json([
                    'message' => $e->getMessage(),
                ], 401);
            }
        });
    })->create();

第 4 步:安装 Laravel Passport

执行以下命令以安装 Passport: composer require laravel``/passport

步骤 5:创建加密密钥和迁移

Laravel passport 有其数据库迁移目录。passport 迁移将创建表来存储客户端和访问令牌。让我们创建用于生成安全访问令牌的加密密钥并运行迁移。运行以下命令: php artisan passport:``install 该命令将创建个人访问和密码授予,用于生成访问令牌。

步骤 6:更新用户模型

将 Laravel\Passport\HasApiTokens 特征添加到 App\Modles\User 模型。该特征为模型提供了帮助程序方法,用于检查经过身份验证的用户的令牌和范围。

app\Models\User.php 应用\模型\User.php

`<?php`

 

`namespace` `App\Models;`

 

`// use Illuminate\Contracts\Auth\MustVerifyEmail;`

`use` `Illuminate\Database\Eloquent\Factories\HasFactory;`

`use` ` Illuminate\Foundation\Auth\User  ``as` `Authenticatable;`

`use` `Illuminate\Notifications\Notifiable;`

`use` `Laravel\Passport\HasApiTokens;`

 

`class` ` User  ``extends` `Authenticatable`

`{`

`    ``use` `HasApiTokens, HasFactory, Notifiable;`

 

`    ``/**`

`     ``* The attributes that are mass assignable.`

`     ``*`

`     ``* @var array<int, string>`

`     ``*/`

`    ``protected` `$fillable` `= [`

`        ``'name'``,`

`        ``'email'``,`

`        ``'password'``,`

`    ``];`

 

`    ``/**`

`     ``* The attributes that should be hidden for serialization.`

`     ``*`

`     ``* @var array<int, string>`

`     ``*/`

`    ``protected` `$hidden` `= [`

`        ``'password'``,`

`        ``'remember_token'``,`

`    ``];`

 

`    ``/**`

`     ``* Get the attributes that should be cast.`

`     ``*`

`     ``* @return array<string, string>`

`     ``*/`

`    ``protected` `function` ` casts():  ``array`

`    ``{`

`        ``return` `[`

`            ``'email_verified_at'` ` =>  ``'datetime'``,`

`            ``'password'` ` =>  ``'hashed'``,`

`        ``];`

`    ``}`

`}`

第 7 步:更新 AppServiceProvider.php

我们不会使用 passport 默认路由,我们将创建自定义身份验证,因此我们将删除默认路由。您可以通过执行以下命令来检查路由:php artisan route:listapp/Providers/AppServiceProvider.php

`<?php`

 

`namespace` `App\Providers;`

 

`use` `Illuminate\Support\ServiceProvider;`

`use` `Laravel\Passport\Passport;`

 

`class` ` AppServiceProvider  ``extends` `ServiceProvider`

`{`

`    ``/**`

`     ``* Register any application services.`

`     ``*/`

`    ``public` `function` `register(): void`

`    ``{`

`        ``Passport::ignoreRoutes();`

`    ``}`

 

`    ``/**`

`     ``* Bootstrap any application services.`

`     ``*/`

`    ``public` `function` `boot(): void`

`    ``{`

`        ``//`

`    ``}`

`}`

第 8 步:设置 API 驱动程序选项

传入的 API 请求将由 Passport 的 TokenGuard 进行身份验证。 config/auth.php 配置/auth.php

1234567891011 | `'guards'` `=> [``      ``'web'` `=> [``          ``'driver'` ` =>  ``'session'``,``          ``'provider'` ` =>  ``'users'``,``      ``],` `      ``'api'` `=> [``          ``'driver'` ` =>  ``'passport'``,``          ``'provider'` ` =>  ``'users'``,``      ``],``  ``],`

步骤 9:创建身份验证控制器

现在,让我们创建一个控制器,该控制器将负责注册和验证用户。运行以下命令: php artisan ``make``:controller Api``/AuthenticationController | 然后打开 AuthenticationController 文件,并添加以下代码: app/Http/Controllers/Api/AuthenticationController.php

`<?php`

 

`namespace` `App\Http\Controllers\Api;`

 

`use` `App\Http\Controllers\Controller;`

`use` `Illuminate\Http\Request;`

`use` `Illuminate\Support\Facades\Auth;`

`use` `App\Models\User;`

` ` 

` ` 

`class` ` AuthenticationController  ``extends` `Controller`

`{`

`    ``public` `function` ` register(Request  ``$request``)`

`    ``{`

`        ``$formData` `= [`

`            ``'name'` ` =>  ``$request``->name,`

`            ``'email'` ` =>  ``$request``->email,`

`            ``'password'` ` =>  ``$request``->password,`

`        ``];`

` ` 

`        ``$formData``[``'password'``] = bcrypt(``$request``->password);`

` ` 

`        ``$user` `= User::create(``$formData``);       `

` ` 

`        ``return` `response()->json([`

`            ``'user'` ` =>  ``$user``,`

`            ``'token'` ` =>  ``$user``->createToken(``'passportToken'``)->accessToken`

`        ``], 200);`

`         ` 

`    ``}`

` ` 

`    ``public` `function` ` login(Request  ``$request``)`

`    ``{`

`        ``$credentials` `= [`

`            ``'email'`    ` =>  ``$request``->email,`

`            ``'password'` ` =>  ``$request``->password`

`        ``];`

` ` 

`        ``if` `(Auth::attempt(``$credentials``))`

`        ``{`

`            ``$token` `= Auth::user()->createToken(``'passportToken'``)->accessToken;`

`            ` 

`            ``return` `response()->json([`

`                ``'user'` `=> Auth::user(),`

`                ``'token'` ` =>  ``$token`

`            ``], 200);`

`        ``}`

` ` 

`        ``return` `response()->json([`

`            ``'error'` ` =>  ``'Unauthorised'`

`        ``], 401);`

` ` 

`    ``}`

`}`

步骤 10:创建 API 路由

最后,让我们为用户创建一个用于注册和登录的路由。 routes/api.php 路线/api.php

`<?php`

 

`use Illuminate\Http\Request;`

`use Illuminate\Support\Facades\Route;`

`use App\Http\Controllers\Api\AuthenticationController;`

 

`Route::get('/user', function (Request $request) {`

`    ``return $request->user();`

`})->middleware('auth:api');`

 

`Route::post('register', [AuthenticationController::class, 'register'])->name('register');`

`Route::post('login', [AuthenticationController::class, 'login'])->name('login');`

我们将使用 Postman 进行测试,但您可以按照自己喜欢的方式进行测试。 Register 注册

image Binaryboxtuts

Login 登录

image 1 Binaryboxtuts 访问令牌将在访问需要身份验证的 API 路由时使用。尝试访问 /api/user 路由。 image 2 Binaryboxtuts 现在我们的 API 身份验证已完成。