广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >laravel Sanctum 认证 — API令牌认证
  • 473
分享到

laravel Sanctum 认证 — API令牌认证

2024-04-02 19:04:59 473人浏览 安东尼
摘要

laravel Sanctum介绍 Laravel Sanctum 为 SPA (单页面应用程序)、移动应用程序和简单的、基于令牌的 api 提供轻量级身份验证系统。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明文加密解密的扩展功能

--结束END--

本文标题: laravel Sanctum 认证 — API令牌认证

本文链接: https://www.lsjlt.com/news/99313.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • laravel Sanctum 认证 — API令牌认证
    laravel Sanctum介绍 Laravel Sanctum 为 SPA (单页面应用程序)、移动应用程序和简单的、基于令牌的 API 提供轻量级身份验证系统。Sanctum 允许应用程序的每个用户为他们的帐户生成多个 API 令牌...
    99+
    2022-10-22
  • 使用 Laravel Passport 处理 API 认证
    我们将会学习使用 Laravel 的 Passport API OAuth 来创建一个验证系统。第一步. 安装 Laravel我们需要用以下命令来创建一个最新的 Laravel 应用,所以请打开终端执行:laravel new&n...
    99+
    2022-11-17
    Passport api Laravel
  • Oracle中两种认证方式:OS认证与口令文件认证
    相关链接:SYS,SYSTEM,DBA,SYSDBA,SYSOPER的区别与联系    首先谈谈Oracle安装与OS用户组.Oracle在安装和维护过程...
    99+
    2022-10-18
  • 学历认证API接口
    概述 学历认证在现代社会已经成为了不可或缺的一部分,然而传统的学历认证方式存在繁琐、耗时、低效等问题。为了解决这些问题,我们开发了一种基于学信网验证码的学历认证API接口。 API介绍 该API接口可以快速提取用户提交的学历证书电子注册备案...
    99+
    2023-08-31
    php
  • 阿里云金牌代理认证
    阿里云金牌代理认证需要经过多重严格的审核和认证,以确保代理商的专业性和可靠性。首先,代理商需要具备一定的技术实力和运营能力,能够为阿里云客户提供专业的技术支持和服务,并及时响应客户需求。其次,代理商需要具备良好的商业信誉和口碑,能够保证阿里...
    99+
    2023-10-27
    阿里 金牌
  • api认证方式有哪些
    API认证方式有以下几种:1. 基本认证(Basic Authentication):使用用户名和密码进行认证。2. OAuth认证...
    99+
    2023-06-14
    api认证
  • 阿里云金牌代理认证有用吗
    那么,阿里云金牌代理认证制度究竟有没有用呢?我认为,这个制度至少有以下几个方面的作用: 一、增强代理商的品牌形象 金牌代理商被阿里云官方认证,说明他们在阿里云产品的销售和分销方面有一定的经验和实力,这将对阿里云的品牌形象产生积极的影响。通...
    99+
    2023-10-27
    阿里 金牌 有用吗
  • .net core api接口JWT方式认证Token
    一、项目>管理Nuget包 安装 二、.appsettings.json添加 "JWT": { "Secret": "~!@#$%^&*()_+qwert...
    99+
    2022-11-12
  • Web API如何实现Basic基础认证
    这篇文章主要介绍了Web API如何实现Basic基础认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API如何实现Basic基础认证文章都会有所收获,下面我们一起来看看吧。一、W...
    99+
    2023-06-29
  • Laravel unit test : 模拟认证的用户是什么
    小编给大家分享一下Laravel unit test : 模拟认证的用户是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Laravel 是什么Laravel ...
    99+
    2023-06-14
  • 身份证实名认证API接口有什么意义与作用?
    身份证实名认证API接口有什么意义?   中国公民的身份证是一种对外证明自己身份的有效证件,随着国家对实名制要求的落实,工作与生活中许多场景都会需要进行身份验证。比如出门外出乘座火车与飞机时、注册互联网络平台时、网络游戏与购物时等等,都得用...
    99+
    2023-09-30
    数据库 php 大数据 eclipse mvc
  • laravel 中如何使用二维码实现身份认证?
    Laravel 中如何使用二维码实现身份认证? 二维码在现代社会已经普及,它不仅仅是一种方便的扫描方式,也成为了一种重要的安全认证方式。在 Laravel 中,我们可以使用二维码实现身份认证,提高系统的安全性。本文将介绍如何使用 Larav...
    99+
    2023-10-25
    二维码 laravel 面试
  • 详解docker API管理接口增加CA安全认证
    目录一、模拟创建CA证书(中间边框的部分)二、签发服务器端证书(右边蓝色背景部分)三、签发客户端证书(左边黄色背景的部分)四、签发证书收尾工作五、配置docker服务端六、IDEA配...
    99+
    2022-11-13
  • 怎样使用Jwt身份认证保护 Asp.Net Core Web Api
    怎样使用Jwt身份认证保护 Asp.Net Core Web Api,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。网络上有许多资源可以教你如何保护ASP.NET...
    99+
    2023-06-19
  • .net core api接口如何实现JWT方式认证Token
    这篇文章主要介绍.net core api接口如何实现JWT方式认证Token,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、项目>管理Nuget包 安装二、.appsettings.js...
    99+
    2023-06-22
  • 怎么用Linux htpasswd命令创建密码认证文件
    这篇文章主要介绍了怎么用Linux htpasswd命令创建密码认证文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Linux htpasswd命令创建密码认证文件文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-28
  • 基于聚合数据的身份证实名认证API接口调用示例-Java版
    一、申请接口 通过https://www.juhe.cn/docs/api/id/103自助申请开通接口,获取API请求KEY 二、请求参数 名称 是否必填 说明 idcard 是 身份证号码 realname 是 姓名 ...
    99+
    2022-10-22
  • 基于聚合数据的身份证实名认证API接口调用示例-PHP版
    一、申请接口 通过https://www.juhe.cn/docs/api/id/103自助申请开通接口,获取API请求KEY。 二、用示例代码PHP //如需请求加密接口,加密方式请参考https://www.sdk.cn/detail...
    99+
    2022-10-22
  • laravel8.x用户认证vite指令不生效如何解决
    这篇文章主要介绍“laravel8.x用户认证vite指令不生效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel8.x用户认证vite指令不生效如何解决”文章能帮助大家解决问题。...
    99+
    2023-07-04
  • kubernetes中安全机制API Server认证之Service Account Token的示例分析
    这篇文章主要介绍了kubernetes中安全机制API Server认证之Service Account Token的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作