我的编程空间,编程开发者的网络收藏夹
学习永远不晚

laravel Sanctum 认证 — API令牌认证

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

laravel Sanctum 认证 — API令牌认证

laravel Sanctum介绍

Laravel Sanctum 为 SPA (单页面应用程序)、移动应用程序和简单的、基于令牌的 API 提供轻量级身份验证系统。Sanctum 允许应用程序的每个用户为他们的帐户生成多个 API 令牌。这些令牌可能被授予指定允许令牌执行哪些操作的能力 / 范围。

工作原理

Laravel Sanctum 是为了解决两个独立问题而生。

API 令牌

它是一个简单的包,用于向用户发出 API 令牌,同时可以通过Sanctum来生成和管理这些令牌。

例如:

  1. 当用户登信息校验通过,可以发放令牌用于后续信息核验;
  2. 类似于 GitHub 的「访问令牌」,用户通过控制台页面生成一个令牌提供给其他用户使用。

Laravel Sanctum 的这个特性是通过将用户 API令牌存储在单个数据库表中,并通过包含了有效 API 令牌的 Authorization标头对传入请求进行身份验证而实现的。

这些令牌通常有很长的过期时间 (以年计),当然用户是可以随时手动撤销它们的。

SPA 身份验证

Sanctum 提供了一种简单的方法来认证需要与基于 Laravel 的 API 进行通信的单页应用程序 (SPAs)。这些 SPA 可能与 Laravel 应用程序存在于同一仓库中,也可能是一个完全独立的仓库,例如使用 Vue CLI 创建的单页应用程序。

对于此功能,Sanctum 不使用任何类型的令牌。相反,Sanctum 使用 Laravel 内置的基于 cookie 的会话身份验证服务。这提供了 CSRF 保护,会话身份验证以及防止因 XSS 攻击而泄漏身份验证凭据。仅当传入请求来自您自己的 SPA 前端时,Sanctum 才会尝试使用 Cookie 进行身份验证。

安装

1、 你可以通过 Composer 安装 Laravel Sanctum:

composer require laravel/sanctum

2、你需要使用 vendor:publish Artisan 命令发布 Sanctum 的配置和迁移文件。Sanctum 的配置文件将会保存在 config 文件夹中:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

3、你需要执行数据库迁移文件。Sanctum 将创建一个数据库表用于存储 API 令牌:

php artisan migrate

注:由于这里是讲解API令牌认证,所以下面不需要操作

4、假如你需要使用 Sanctum 来验证 SPA,你需要在 app/Http/Kernel.php 文件中将 Sanctum 的中间件添加到你的 api 中间件组中:

use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;

'api' => [
    EnsureFrontendRequestsAreStateful::class,
    'throttle:60,1',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

自定义迁移

如果你不想使用 Sanctum 的默认迁移,你可以在你的 AppServiceProvider 中的 register 里调用 Sanctum::ignoreMigrations 方法。 你可以使用 php artisan vendor:publish --tag=sanctum-migrations 导出默认迁移。

API令牌认证

令牌发放场景

1、用户主动触发发放:例如登录、api获取等等

2、管理员发放:例如对特定用户开发资源访问的时候,通过sanctum进行临牌发放

当使用 API 令牌进行请求的时,令牌可以以 Bearer 的形式包含在 Authorization header 头里。

令牌发放

给用户发行令牌的时候,User 模型里应该使用 HasApiTokens trait:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

发行一个令牌,需要使用 createToken 方法。createToken 方法返回一个 Laravel\Sanctum\NewAccessToken实例。
在存入数据库之前,API 令牌已使用 SHA-256 哈希加密过,但是可以用 NewAccessToken 实例的 plainTextToken 属性访问令牌的纯文本值。

令牌创建后,应该立即向用户展示这个纯文本值:

//创建API令牌
$token = $user->createToken('token-name');

//获取令牌明文
return $token->plainTextToken;

//令牌:6|F9cyAXAb7yxWpOUDq7nGfzFIt7K7Ag0bfuN1xC8O4IjnaWQNt7djMVacyphjqmVKmCC6dSIMHDSuLGQd

可以使用 HasApiTokens trait 提供的 tokens Eloquent 关联关系来获取所有的用户令牌:

foreach ($user->tokens as $token) {
    //
}

令牌能力(权限)

Sanctum 可以为令牌分配 “abilities”,类似于 OAuth 的“scopes”。可以将字符串能力数组作为第二个参数传递给 createToken 方法:

//1、可以限制令牌拥有哪些权限
return $user->createToken('token-name', ['server:view'])->plainTextToken;

//2、在使用 Sanctum 处理一个请求的时候,可以使用 tokenCan方法来决定令牌是否具有给定的能力:
if ($user->tokenCan('server:update')) {
    //
}

路由令牌校验

为了保护路由,所有进来的请求都必须进行认证,应该将 Sanctum 认证守卫附加到routes/api.php 的 API 路由里:

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

令牌销毁

我们可以使用 HasApiTokens trait 提供的 tokens关联关系从数据库删除它们,以达到撤销令牌的目的:

// 撤销所有令牌...
$user->tokens()->delete();

// 撤销用户最近的令牌...
$request->user()->currentAccessToken()->delete();

// 撤销一个特定的令牌...
$user->tokens()->where('id', $id)->delete();

API令牌扩展

场景

由于API令牌明文组成是ID|Token格式,既不利于记忆也暴露了token主键所以,最好是将明文进行再次加密:
//令牌明文:6|F9cyAXAb7yxWpOUDq7nGfzFIt7K7Ag0bfuN1xC8O4IjnaWQNt7djMVacyphjqmVKmCC6dSIMHDSuLGQd
//令牌密文:AXAb7yxWpOUDq7nGfzFIt7K7Ag0bfuN1xC8O4IjnaWQNt7djMVacyphjqmVKmCC6dSIMH

token加密扩展

1、创建加解密方法


    
    function encryptHash($token,$key,$iv)
    {
        $encrypt = openssl_encrypt($token, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
        return base64_encode($encrypt);
    }

    
    function decryptHash($token,$key,$iv)
    {
        $token = base64_decode($token);
        return openssl_decrypt($token, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
    }

2、加密明文令牌

//创建API令牌
$token = $user->createToken('token-name');

//获取令牌明文
return encryptHash($token->plainTextToken,$key,$iv);

3、重写PersonalAccessToken token校验

创建PersonalAccessToken文件同时继承Laravel\Sanctum\PersonalAccessToken,重写令牌查询方法,在方法中对令牌进行解密操作,再进行处理匹配查询


use Laravel\Sanctum\PersonalAccessToken as BaseToken;

class PersonalAccessToken extends BaseToken
{
    
    public static function findToken($token)
    {
        if ($_token = decryptHash($token,$key,$iv)) {
            $token = $_token;
        }

        if (strpos($token, '|') === false) {
            return static::where('token', hash('sha256', $token))->first();
        }

        [$id, $token] = explode('|', $token, 2);

        if ($instance = static::find($id)) {
            return hash_equals($instance->token, hash('sha256', $token)) ? $instance : null;
        }
    }
}

4、重新指定Sanctum的accessToken处理model

 //重新指定Sanctum的accessToken处理model
Sanctum::$personalAccessTokenModel = 'App\\Models\\SdkCn\\Common\\PersonalAccessToken';

到此完成了laravel Sanctum认证的API令牌认证功能,以及对token明文加密解密的扩展功能

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

laravel Sanctum 认证 — API令牌认证

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用 Laravel Passport 处理 API 认证

我们将会学习使用 Laravel 的 Passport API OAuth 来创建一个验证系统。第一步. 安装 Laravel我们需要用以下命令来创建一个最新
2022-11-17

api认证方式有哪些

API认证方式有以下几种:1. 基本认证(Basic Authentication):使用用户名和密码进行认证。2. OAuth认证(OAuth Authentication):通过授权令牌进行认证,常用于第三方应用程序和服务之间的认证。3
2023-06-14

阿里云金牌代理认证

阿里云金牌代理认证需要经过多重严格的审核和认证,以确保代理商的专业性和可靠性。首先,代理商需要具备一定的技术实力和运营能力,能够为阿里云客户提供专业的技术支持和服务,并及时响应客户需求。其次,代理商需要具备良好的商业信誉和口碑,能够保证阿里云客户的合法权益和服务质量。此外,代理商还需要具备完善的管理体系和客户服务能力,
2023-10-27

阿里云金牌代理认证有用吗

那么,阿里云金牌代理认证制度究竟有没有用呢?我认为,这个制度至少有以下几个方面的作用:一、增强代理商的品牌形象金牌代理商被阿里云官方认证,说明他们在阿里云产品的销售和分销方面有一定的经验和实力,这将对阿里云的品牌形象产生积极的影响。通过阿里云金牌代理认证,代理商将被赋予更高的信誉度和更广泛的分销渠道,这将增强他们在市场
2023-10-27

Web API如何实现Basic基础认证

这篇文章主要介绍了Web API如何实现Basic基础认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API如何实现Basic基础认证文章都会有所收获,下面我们一起来看看吧。一、WebApi中为什么需
2023-06-29

Laravel unit test : 模拟认证的用户是什么

小编给大家分享一下Laravel unit test : 模拟认证的用户是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Laravel 是什么Laravel
2023-06-14

Laravel 和 CodeIgniter 的授权和认证机制有何区别?

laravel 和 codeigniter 授权和认证机制比较:认证:- laravel 使用 eloquent orm,codeigniter 使用内置认证库。授权:- laravel 提供基于策略的授权,codeigniter 使用基于
Laravel 和 CodeIgniter 的授权和认证机制有何区别?
2024-05-12

怎样使用Jwt身份认证保护 Asp.Net Core Web Api

怎样使用Jwt身份认证保护 Asp.Net Core Web Api,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。网络上有许多资源可以教你如何保护ASP.NET
2023-06-19

.net core api接口如何实现JWT方式认证Token

这篇文章主要介绍.net core api接口如何实现JWT方式认证Token,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、项目>管理Nuget包 安装二、.appsettings.json添加"JWT": {
2023-06-22

php实现动态口令认证的示例代码

本文介绍了PHP中实现动态口令认证的步骤,包括生成、存储、发送、验证和清除动态口令。提供了完整的示例代码,涵盖了用户交互和数据库操作的各个方面。强调了安全性措施,包括加密存储、有效期限制和次数限制。通过遵循这些步骤,开发人员可以增强在线帐户的安全性,防止未经授权的访问。
php实现动态口令认证的示例代码
2024-04-02

怎么用Linux htpasswd命令创建密码认证文件

这篇文章主要介绍了怎么用Linux htpasswd命令创建密码认证文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Linux htpasswd命令创建密码认证文件文章都会有所收获,下面我们一起来看看吧
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录