Laravel 通过 Sanctum 进行 API 认证

2024-06-02 渥太华微生活

1_wKARgLrJbytGkHHJJt3f-w.png

Laravel Sanctum 提供了一个轻量级的认证系统,可用于 SPA(单页应用程序)、移动应用程序和基于简单令牌的 API。

Sanctum 允许应用程序中的每个用户为他们的账户生成多个 API 令牌。这些令牌可以被授予权限 / 范围,以指定令牌允许执行哪些操作。 

除非您需要所有的oauth服务,否则还是更推荐您使用轻量级的Sanctum进行认证处理。


1、创建项目

composer create-project laravel/laravel laravel-sanctum

通过下面命令启动本地服务器,访问 http://127.0.0.1:8000 检查是否成功。

php artisan serve

2、安装Sanctum

使用下面一个命令将安装Sanctum的扩展包、配置和迁移文件,并添加API路由

php artisan install:api


3、修改配置文件

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_db
DB_USERNAME=my_user
DB_PASSWORD=my_pwd


4、修改User model:

添加 Laravel\Sanctum\HasApiTokens trait 进入User model.

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

5、模拟数据:

修改 database\seeders\DatabaseSeeder.php 文件:

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        User::factory()->create([
            'name' => 'User1',
            'email' => '[email protected]',
        ]);
    }
}

运行下面命令产生用户数据。

php artisan db:seed

6、添加访问路由:

修改 routes\api.php 文件

<?php

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::post('/tokens/create', function(Request $request) {
    $user = User::find(1);
    $token = $user->createToken($user->name);
    return ['token' => $token->plainTextToken];
});

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

7、测试获取token:

用 postman 测试:

URL: http://127.0.0.1:8000/api/tokens/create
Method: post

结果拿到User1的token,

{
    "token": "1|DfapLtnxCtKW7TxUmR7lnzCm978K5xOqcp2D0ilq9d6caf12"
}

如下图:

2024-06-03_162805.jpg


8、测试其他接口:

用 postman 测试:

1) 当没有带token访问时

URL: http://127.0.0.1:8000/api/user
Method: get

得到 RouteNotFoundException,如下图:

2024-06-03_163916.jpg

2) 当带token访问时

URL: http://127.0.0.1:8000/api/user
Method: get
Authorization --> Bearer Token: 1|DfapLtnxCtKW7TxUmR7lnzCm978K5xOqcp2D0ilq9d6caf12

带上 Authorization Bearer Token 后,得到正常的用户信息,如下图:

2024-06-03_164555.jpg


3) 修改一下路由,再次带token访问时:

路由如下:

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user()->tokens;
});

postman 设置:

URL: http://127.0.0.1:8000/api/user
Method: get
Authorization --> Bearer Token: 1|DfapLtnxCtKW7TxUmR7lnzCm978K5xOqcp2D0ilq9d6caf12

带上 Authorization Bearer Token 后,得到用户所有的token信息:

[
    {
        "id": 1,
        "tokenable_type": "App\\Models\\User",
        "tokenable_id": 1,
        "name": "User1",
        "abilities": [
            "*"
        ],
        "last_used_at": "2024-06-03T21:04:15.000000Z",
        "expires_at": null,
        "created_at": "2024-06-03T20:26:19.000000Z",
        "updated_at": "2024-06-03T21:04:15.000000Z"
    }
]

如下图:

2024-06-03_170918.jpg

二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

127
全部评论 (0)
展开快速发表评论

科技专栏