百科狗-知识改变命运!
--

laravel9 + vue3 后端使用 passport 来生成验证 token - vue3 项目实战

百变鹏仔1年前 (2023-11-21)阅读数 27#技术干货
文章标签令牌

laravel9 + vue3 后端使用 passport 来生成验证 token

在 Laravel 9 中后端支持用户认证,生成 token,有三类实现办法:

传统认证
认证套件:Laravel JetstreamLaravel BreezeLaravel Fortify。他们的都能自动生成:访问路由、访问控制器类、视图文件。适用于传统 MVC 编程方式,php+blade 模板。基于cookie+session身份验证服务。
中文网址:https://learnku.com/docs/laravel/9.x/authentication/12239

Sanctum 认证
Sanctum 使用 Laravel 内置的基于cookie+session身份验证服务,默认已经安装配置。为 SPA(单页面应用程序)、移动应用程序和简单的、基于访问令牌token的 API 提供轻量级身份验证系统。
中文网址:https://learnku.com/docs/laravel/9.x/sanctum/12272

Passport 认证
采用oauth2.0认证方式。适用于前后端分离模式 API,移动应用程序 API。使用token认证。其使用说明中有前端vue代码示例,以及axios网络请求示例。Passport 可以在几分钟之内为你的应用程序提供完整的 OAuth2 服务端实现。
中文网址:https://learnku.com/docs/laravel/9.x/passport/12270

OAuth 是一个开发授权标准,允许通过授权的方式让第三方应用访问该用户在某一网站上存储的需要认证的资源,而无需将用户名和密码提供给第三方应用。在前后端分离的 API 认证中,我们可以把前端应用看作第三方应用,后端应用自然就是这里的网站了,用户认证信息存储在后端网站,当前端需要访问认证资源时,通过后端应用授权的方式访问(授权的前提是前端应用在后端应用注册过,否则不能授权),只有用户允许授权,才可以访问认证资源,否则还是不能访问。


Passport 支持五种认证模式的安装配置方式:
token 类型认证模式使用场景
Password Grant授权码授权令牌通过 PKCE(Proof Key for Code Exchange,中文译为”代码交换的证明密钥”)发放授权码,是对单页面应用或原生应用进行认证,以便访问 API 接口的安全方式。这种颁发方式的适用场景是当你不能保证客户端密钥被安全存储,或者为了降低攻击者拦截授权码的威胁。在这种模式下,当通过授权码获取访问令牌 token时,用“验证码”(code verifier)和“质疑码”(code challenge,“challenge”,名词可译为‘挑战;异议;质疑’等)的组合来交换客户端密钥。
密码授权令牌OAuth2 密码授权机制可以让你自己的客户端(又称第一方客户端),例如移动应用,使用用户名和密码(或邮箱地址+密码)获取访问令牌 token。这使得你可以安全地向自己的客户端发出访问令牌 token,而不必走整个 OAuth2 授权代码重定向流程。
隐式授权令牌隐式授权和授权码授权有点相似,不过,无需获取授权码,访问令牌 token就会返回给客户端。通常适用于同一个公司自有系统之间的认证,尤其是客户端应用不能安全存储令牌信息的时候。无法安全存储客户端凭据的 javascript 或移动应用。
客户端授权令牌客户端凭证授予访问令牌 token适用于计算机到计算机的身份验证。不涉及到用户的互动。例如,你可以在调度任务中,使用这种授权来通过 API 执行维护任务。
Personal Access私人访问令牌有时候,你的用户可能想要颁发访问令牌 token给自己而不走典型的授权码重定向流程。允许用户通过应用程序用户界面给自己发出访问令牌 token,有助于用户体验你的 API,或者也可以将其作为一种更简单的发布访问令牌 token的方式。



需求实现:

  • 此前后端分离的项目,前后端都有各自的独立域名(www.example.com、admin.example.com、api.example.com)、独立的程序语言代码(前端 vue,后端 PHP)。还可以分别部署在不同的物理服务器上。
  • 前端内容浏览支持 PC、移动端、还可以扩展为支持微信小程序调用、支持 app 调用
  • 前端前台,无需登录,即可浏览展示内容;前端前台,用户中心登录,进行个人内容管理。前端后台管理,需要登录管理。

综上所述,需要三个 token 访问令牌。前端前台展示内容,客户端凭证令牌:access_token;前端前台用户中心,密码授权令牌:user_token;前端后台登录管理,密码授权令牌:admin_token



安装 Passport

Laravel 9 安装配置 Passport,官方文档。

第一步:下载 Passport

cd /var/web/www/exampleApi

composer require laravel/passport

contOS 操作系统下,查看变更和新增加的目录文件

cd /var/web/www/exampleApi
ls -lt --time-style=long-iso ./

//显示如下:
total 54044
drwxr-xr-x 52 root root     4096 2022-05-31 20:33 vendor
-rw-r--r--  1 root root   332236 2022-05-31 20:33 composer.lock
-rw-r--r--  1 root root     1776 2022-05-31 20:33 composer.lock
......

laravel9 + vue3 后端使用 passport 来生成验证 token - vue3 项目实战

参数-lt分别表示:

  • l:表示使用长列表格式。
  • t:表示按照文件的修改时间。
  • r:表示逆序显示内容。

参数--time-style=long-iso表示,设置列表中的显示时间样式,使用long-iso样式。

被安装目录vendor/laravel/passport版本:passport 11.0


composer.json 内容:

"require": {
    "php": "^8.0.2",
    "guzzlehttp/guzzle": "^7.2",
    "laravel/framework": "^9.19",
    "laravel/passport": "^11.0",
    "laravel/sanctum": "^3.0",
    "laravel/tinker": "^2.7"
},

查看已经安装的拓展包,在根目录下执行 Linux 命令:

composer show -i
......
guzzlehttp/guzzle                  7.5.0     Guzzle is a PHP HTTP client library
guzzlehttp/promises                1.5.2     Guzzle promises library
guzzlehttp/psr7                    2.4.1     PSR-7 message implementation that also provides common utility methods
hamcrest/hamcrest-php              v2.0.1    This is the PHP port of Hamcrest Matchers
laravel/framework                  v9.26.1   The Laravel Framework.
laravel/passport                   v11.0.0   Laravel Passport provides OAuth2 server support to Laravel.
laravel/pint                       v1.1.1    An opinionated code formatter for PHP.
laravel/sail                       v1.15.4   Docker files for running a basic Laravel application.
laravel/sanctum                    v3.0.1    Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.
laravel/serializable-closure       v1.2.0    Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.
laravel/tinker                     v2.7.2    Powerful REPL for the Laravel framework.
......


第二步:运行 Passport 的迁移命令

Passport 服务提供器使用框架注册自己的数据库迁移目录,因此在注册提供器后,就应该运行 Passport 的迁移命令来自动创建存储客户端和令牌的数据表:

php artisan migrate

显示如下:
INFO Preparing database.
Creating migration table ............................................... 131ms DONE

INFO Running migrations.
2016_06_01_000001_create_oauth_auth_codes_table ........................ 605ms DONE
2016_06_01_000002_create_oauth_access_tokens_table ..................... 459ms DONE
2016_06_01_000003_create_oauth_refresh_tokens_table .................... 303ms DONE
2016_06_01_000004_create_oauth_clients_table ........................... 176ms DONE
2016_06_01_000005_create_oauth_personal_access_clients_table ........... 120ms DONE
2019_12_14_000001_create_personal_access_tokens_table .................. 340ms DONE

执行上面命令后,会在数据库中生成五个数据表:

  • db_oauth_access_tokens:通过认证token表。
  • db_oauth_auth_codes:认证code表。
  • db_oauth_clients:认证客户端。
  • db_oauth_refresh_tokens:刷新token表。
  • db_oauth_personal_access_clients:个人授权客户端。
  • db_personal_access_tokens:Laravel 中内置了 santum,它是专门用来 api 认证生成 token 的扩展包,不过需要自己配置才能使用。这个表就是 sanctum 定义的,存放用户对应的 token 相关字段信息。


第三步:生成客户端和密钥

创建生成安全访问,「personal access」客户端 client id、密钥 client secret令牌。同时,也会创建用于生成,「password grant」客户端 client id、密钥 client secret:

php artisan passport:install

类型数据适用
personal access客户端 Client ID: 1
加密密钥 Client secret: aJ9qYvzKMY3h5rG14gG5iWo2edcDn2vfaYJxLrBi
私人模式
password grant客户端 Client ID: 2
加密密钥 Client secret: ILk55sc8swghKbvl4qfU4to3aW1gMbZq1z6lyKpL
  • 授权码授权模式
  • 账号密码授权模式
  • 隐式授权模式
  • 客户端授权模式
  • 上面的命令,会在storage目录下生成oauth-private.keyoauth-public.key,分别包含 OAuth 服务的私钥和公钥,用于安全令牌的加密解密。
  • 上面的命令,会在db_oauth_clients数据表中生成两条记录,相当于注册了两个客户端应用,一个用于密码授权令牌认证,一个用于私人访问令牌认证。db_oauth_personal_access_clients有一条记录。至此其他 token 数据表中仍然无数据。

⚠️注意:上传到服务器生成环境中,为了密钥安全,需要重新生成一次密钥。密钥文件storage/oauth-private.key和storage/oauth-public.key,可以拥有777权限(-rwxrwxrwx),也可以是644权限(-rw-r--r--)。

php artisan passport:keys --force


登录 mysql 数据库,查看数据表内容:

select * from db_oauth_personal_access_clients\G

*************************** 1. row ***************************
        id: 1 client_id: 1created_at: xxxxxx
updated_at: xxxxxx
select * from db_oauth_clients\G

*************************** 1. row *************************** id: 1 user_id: NULL name: Laravel Personal Access Client secret: aJ9qYvzKMY3h5rG14gG5iWo2edcDn2vfaYJxLrBi
              provider: NULL
              redirect: http://localhost
personal_access_client: 1
       password_client: 0
               revoked: 0
            created_at: xxxxxx
            updated_at: xxxxxx
*************************** 2. row *************************** id: 2 user_id: NULL name: Laravel Password Grant Client secret: ILk55sc8swghKbvl4qfU4to3aW1gMbZq1z6lyKpL
              provider: users
              redirect: http://localhost
personal_access_client: 0
       password_client: 1
               revoked: 0
            created_at: xxxxxx
            updated_at: xxxxxx


Laravel 框架生命周期

  1. 首先,所有的请求request都是经由入口public/index.php文件,加载Composer生成的自动加载设置。然后,进入bootstrap/app.php,创建 Laravel 应用程序的实例。然后启动创建一个应用程序/服务容器。
  2. 然后,所有的请求request被发送到 HTTP 内核(用于处理 Web 请求)或控制台内核(用于处理Artisan 命令)。HTTP 内核文件app/Http/Kernel.php,继承了Illuminate\Foundation\Http\Kernel。

    HTTP 内核启动【配置】中的程序。配置在bootstrappers数组内,包括错误处理,日志,检测应用环境,以及其它在请求被处理前需要执行的任务。
    HTTP 内核注册启动【服务】。配置在config/app.php中。服务提供者给予框架开启多种多样的组件,像数据库,队列,验证器,以及路由组件。只要被启动服务提供者就可支配框架的所有功能。默认的服务存放在app/Providers下。
    HTTP 内核册启动【HTTP中间件】。配置在app/Http/Kernel.php中。这些中间件处理 HTTP 会话、读写 HTTP session、判断应用是否处于维护模式、验证 CSRF 令牌等等。所有的这些中间件都位于app/Http/Middleware目录。

  3. 然后,所有的请求request将会被交给路由器进行分发。配置在routes目录下。路由将会调度请求,先执行路由绑定的 HTTP中间件,后执行路由绑定的控制器,控制器位于app/Http/Controllers下。



客户端凭证令牌

第四步:生成客户端令牌

客户端凭证令牌。这种授权方式不需要走典型的登录或授权重定向流程,适用于机器与机器之间的接口认证。

php artisan passport:client --client

此命令在db_oauth_clients数据表又生成一条记录。其他四个表,无新增数据。

 select * from db_oauth_clients\G


*************************** 3. row *************************** id: 3 user_id: NULL name: accessToken secret: wE8I3TehjA9Xxkrubu9miUUnFlMMfljsMA9lJL5p
              provider: NULL
              redirect:
personal_access_client: 0
       password_client: 0
               revoked: 0
            created_at: xxxxxx
            updated_at: xxxxxx


第五步:添加验证中间件

passport 内置提供了客户端 token 验证的中间件CheckClientCredentials。要使用这种授权,需要在app/Http/Kernel.php的$routeMiddleware属性中添加。若全部站点内容,只使用这一个 token ,可以直接添加到$middlewareGroups属性中。由于业务需求,分别控制路由,所以,这里添加到$routeMiddleware。

protected $routeMiddleware = [
    'accessToken'=> \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
  ];


第六步:添加路由控制

在/routes/api.php路由上,添加中间件,控制多个访问路径,使访问必须经过此 token 令牌认证。登录 login、验证路由 oauth 等,不受其验证控制。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)