composer require laravel/sanctum
使用 vendor:publish
命令发布 Sanctum
配置文件和数据库迁移文件。sanctum
配置文件会创建在 config
目录中。
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
将 Sanctum
中间件添加到 app/Http/Kernel.php
中的 api 中间件组中
../app/Http/Kernel.php
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
...
protected $middlewareGroups = [
...
'api' => [
EnsureFrontendRequestsAreStateful::class,
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
...
],
在 User 模型中添加 HasApiTokens。
../app/User.php
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
当然,如果是其他模型(表),也可以,比如有管理员 admins
表 对应 Admin
模型。也可以在 Admin
模型同样添加 HasApiTokens
。
使用过Laravel Auth模块、Passport的同学可能知道,需要 config
文件夹下 auth.php
配置 guard
等内容,但是在Sanctum
的文档中并没有发现关于此配置,其实 Sanctum
是不需要配置这个的,在这提醒一下大家,不要纠结该怎么配置config。
php artisan make:seeder UsersTableSeeder
在database/seeds/UsersTableSeeder.php 的 run()方法中,插入以下代码:
DB::table('users')->insert([
'name' => 'Laravel',
'email' => 'laravel@viencoding.com',
'password' => Hash::make('password')
]);
创建user
php artisan db:seed --class=UsersTableSeeder
现在我们的数据库里有一个新用户叫 "Laravel",邮箱是 "laravel@viencoding.com",密码是 "password"。
php artisan make:controller AuthController
在里面写两个方法:登录、登出
public function login(Request $request)
{
$data = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response([
'message' => ['These credentials do not match our records.']
], 404);
}
$token = $user->createToken('my-app-token')->plainTextToken;
$response = [
'user' => $user,
'token' => $token
];
return response($response, 201);
}
public function logout(Request $request)
{
$request->user()->currentAccessToken()->delete();
response = ['status' => 'success'];
return response($response, 201);
}
在 routes/api.php
中,添加登录
Route::post('/login', [AuthController::class, 'login']);
登出以及其他需要身份验证的Route需要添加sanctum中间件:
Route::middleware('auth:sanctum')->group(function () {
Route::post('/logout', [AuthController::class, 'logout']);
});
调用login接口并上传邮箱密码,会得到一个token,类似这样:
3|5zn2aa19COH1w78dnAkg3CP2WBPGQ63yDbiqwMIF
请求logout等需要身份认证的接口时需要在http请求的headers
添加Authorization
,值为Bearer
+ 空格 + token
,如下所示
Bearer 3|5zn2aa19COH1w78dnAkg3CP2WBPGQ63yDbiqwMIF
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/294