如何使用Sanctum包进行Laravel API认证

986 阅读3分钟

使用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上测试你的应用程序。根据你所使用的路由,你应该能够看到以下输出。

account-details

注册输出。

registration-details

结论

在这个教程中, 我们看了什么是Laravel Sanctum以及它的作用。我们还看了它与Laravel Passport的区别,以及何时使用它。

最后, 我们涵盖了如何使用Laravel Sanctum来验证和给予用户访问权.因此, 你可以使用这些知识来建立强大的API.