使用Sanctum包进行Laravel API认证
在本教程中,我们将看看Laravel的sanctum包。我们将讨论如何使用它来验证单页应用程序(SPA)甚至是基于令牌的API。
我们将创建一个简单的Laravel项目, 向用户发放API令牌, 并使用Laravel内置的会话来验证应用程序.
这篇文章还将强调Sanctum包相对于Laravel passport的优势。
前提条件
- 有Laravel的基本知识.
- 你需要安装API测试工具, 如Postman.
目标
在本教程结束时, 你应该能够使用Laravel Sanctum来验证你的用户的API调用和单页应用程序(SPA).
项目设置
让我们建立一个Laravel项目并安装Sanctum包。
laravel new sanctumApp
上面的命令会生成你的Laravel项目骨架.这可能需要一些时间,取决于你的网络连接。
接下来,cd 进入你的项目根目录并运行以下命令:
cd sanctumApp
composer require laravel/sanctum
输出。
- Installing laravel/sanctum (v2.11.2): Downloading (100%)
.................
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
....................
现在我们已经安装了sanctum, 我们需要通过运行以下命令来配置和迁移文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
输出。
Copied Directory [/vendor/laravel/sanctum/database/migrations] To [/database/migrations]
Copied File [/vendor/laravel/sanctum/config/sanctum.php] To [/config/sanctum.php]
Publishing complete.
随着sanctum文件的发布,现在让我们通过编辑.env 文件内容来设置我们的数据库,如下所示。
.............................
DB_CONNECTION = mysql #edit this connection depending on your connection
DB_HOST = 127.0.0.1 #edit this to meet your requirements
DB_PORT = 3306
DB_DATABASE = sanctum #this is generated by default
DB_USERNAME = EnterYourDBUsername
DB_PASSWORD = EnterYourDBPassoword
..........................
现在让我们继续,通过在命令行中运行以下命令在MySQL server 上创建我们的数据库。
mysql -u root -p
输出。
.................
Enter password:
.....................
mysql>
在mysql> 的前面,运行下面的SQL命令来创建一个sanctum 数据库。
mysql> CREATE DATABASE sanctum;
输出。
Query OK, 1 row affected (0.06 sec)
现在让我们继续迁移我们的应用程序,如下所示。
php artisan migrate
输出。
Migration table created successfully.
.........................................
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated: 2019_12_14_000001_create_personal_access_tokens_table (203.38ms)
你会注意到,personal_tokens 表已经生成。这一点很重要,因为我们在文章的后面会用到它。
在数据库设置完毕后,我们需要做的最后一步是将这个包通知给User 模型。
让我们看看这是如何做到的。
<?php
..........................................
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
....................
use HasApiTokens;
..............................
protected $fillable = [
'name',
'email',
'password',
];
.............................
}
在上面的User 模型中,我们从Laravel\Sanctum\HasApiTokens 中导入了HasApiTokens 特质。这个特质暴露了create token() 方法,我们将用它来发放令牌。
路由认证
路由是Laravel应用程序的核心功能之一。在这一部分, 我们将在routes/api.php 文件中设置我们的api 路由, 具体如下:
<?php
...............
//import controller
use App\Http\Controllers\AuthenticationController;
................
//register new user
Route::post('/create-account', [AuthenticationController::class, 'createAccount']);
//login user
Route::post('/signin', [AuthenticationController::class, 'signin']);
//using middleware
Route::group(['middleware' => ['auth:sanctum']], function () {
Route::get('/profile', function(Request $request) {
return auth()->user();
});
Route::post('/sign-out', [AuthenticationController::class, 'logout']);
});
在上面的脚本中, 我们定义了四个路由.第一个是一个POST ,使用AuthenticationController.createAccount() 方法,请求register 一个新的用户。
我们还定义了其他路由,到log in ,查看用户profile ,以及logout 用户。
你可能已经注意到,我们还使用了AuthenticationController ,而它还没有被创建。
让我们继续,通过运行下面的命令来创建这个控制器。
php artisan make:controller AuthenticationController
现在继续并编辑这个控制器,如下所示。
<?php
..............................................
class AuthenticationController extends Controller
{
//this method adds new users
public function createAccount(Request $request)
{
$attr = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
]);
$user = User::create([
'name' => $attr['name'],
'password' => bcrypt($attr['password']),
'email' => $attr['email']
]);
return $this->success([
'token' => $user->createToken('tokens')->plainTextToken
]);
}
//use this method to signin users
public function signin(Request $request)
{
$attr = $request->validate([
'email' => 'required|string|email|',
'password' => 'required|string|min:6'
]);
if (!Auth::attempt($attr)) {
return $this->error('Credentials not match', 401);
}
return $this->success([
'token' => auth()->user()->createToken('API Token')->plainTextToken
]);
}
// this method signs out users by removing tokens
public function signout()
{
auth()->user()->tokens()->delete();
return [
'message' => 'Tokens Revoked'
];
}
}
我们在上面的控制器中有一个简单的逻辑。createAccount() 方法创建新的验证用户。如果注册成功,它就会生成令牌。
signin() 函数对用户进行验证,并在成功登录后生成access tokens 。最后,signout() 方法删除用户的会话。
现在在Postman上测试你的应用程序。根据你所使用的路由,你应该能够看到以下输出。

注册输出。

结论
在这个教程中, 我们看了什么是Laravel Sanctum以及它的作用。我们还看了它与Laravel Passport的区别,以及何时使用它。
最后, 我们涵盖了如何使用Laravel Sanctum来验证和给予用户访问权.因此, 你可以使用这些知识来建立强大的API.