前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >插件篇〡JWT认证插件之基础篇

插件篇〡JWT认证插件之基础篇

作者头像
Tinywan
发布2025-02-24 11:08:07
发布2025-02-24 11:08:07
8400
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

简介

Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。 安装

代码语言:javascript
代码运行次数:0
复制

composer require tinywan/jwt

生成令牌

代码语言:javascript
代码运行次数:0
复制

$user = [
    'id'  => 2022, // 这里必须是一个全局抽象唯一id
    'name'  => 'Tinywan',
    'email' => 'Tinywan@163.com'
];
$token = Tinywan\Jwt\JwtToken::generateToken($user);
var_dump(json_encode($token));

开源技术小栈输出(json格式)

代码语言:javascript
代码运行次数:0
复制

{
    "token_type": "Bearer",
    "expires_in": 36000,
    "access_token": "eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI...",
    "refresh_token": "eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc..."
}

开源技术小栈参数描述

参数

类型

描述

示例值

token_type

string

Token 类型

Bearer

expires_in

int

凭证有效时间,单位:秒

36000

access_token

string

访问凭证

XXXXXXXXXXXXXXXXXXXX

refresh_token

string

刷新凭证(访问凭证过期使用 )

XXXXXXXXXXXXXXXXXXXX

已支持方法

开源技术小栈1、获取当前uid

代码语言:javascript
代码运行次数:0
复制

Tinywan\Jwt\JwtToken::getCurrentId();

开源技术小栈2、获取所有扩展字段

代码语言:javascript
代码运行次数:0
复制

Tinywan\Jwt\JwtToken::getExtend();

开源技术小栈3、获取自定义字段

代码语言:javascript
代码运行次数:0
复制

Tinywan\Jwt\JwtToken::getExtendVal('email');

开源技术小栈4、刷新令牌(通过刷新令牌获取访问令牌)

代码语言:javascript
代码运行次数:0
复制

Tinywan\Jwt\JwtToken::refreshToken();

开源技术小栈5、获取令牌有效期剩余时长(单位:秒)

代码语言:javascript
代码运行次数:0
复制

Tinywan\Jwt\JwtToken::getTokenExp();

开源技术小栈6、单设备登录。默认是关闭,开启请修改配置文件config/plugin/tinywan/jwt

代码语言:javascript
代码运行次数:0
复制

'is_single_device' => true,

开源技术小栈7、获取当前用户信息(模型)。需要插件大于版本 >=1.2.4

代码语言:javascript
代码运行次数:0
复制

Tinywan\Jwt\JwtToken::getUser();

开源技术小栈注意:该配置项目'user_model'为一个匿名函数,匿名函数参数$uid为当前登录用户id,默认返回空数组,可以根据自己项目ORM定制化自己的返回模型

ThinkORM 配置

代码语言:javascript
代码运行次数:0
复制

'user_model' => function($uid) {
 // 返回一个数组
 return \think\facade\Db::table('resty_user')
  ->field('id,username,create_time')
  ->where('id',$uid)
  ->find();
}

LaravelORM 配置

代码语言:javascript
代码运行次数:0
复制

'user_model' => function($uid) {
 // 返回一个对象
 return \support\Db::table('resty_user')
  ->where('id', $uid)
  ->select('id','email','mobile','create_time')
  ->first();
}

开源技术小栈8、令牌清理

代码语言:javascript
代码运行次数:0
复制

Tinywan\Jwt\JwtToken::clear();

注:只有配置项 is_single_devicetrue 才会生效

开源技术小栈9、自定义终端client。需要插件大于版本 >=v1.8.2

代码语言:javascript
代码运行次数:0
复制

// 生成WEB令牌
$user = [
    'id'  => 2022,
    'name'  => 'Tinywan',
    'client' => JwtToken::TOKEN_CLIENT_WEB
];
$token = JwtToken::generateToken($user);

// 生成移动端令牌
$user = [
    'id'  => 2022,
    'name'  => 'Tinywan',
    'client' => JwtToken::TOKEN_CLIENT_MOBILE
];
$token = JwtToken::generateToken($user);

默认是WEB

开源技术小栈

  1. 自定义访问令牌和刷新令牌过期时间
代码语言:javascript
代码运行次数:0
复制

$extend = [
    'id'  => 2024,
 'name'  => 'Tinywan',
    'access_exp'  => 600,  // 10 分钟
 'refresh_exp'  => 7200,  // 2 小时
];
$token = Tinywan\Jwt\JwtToken::generateToken($extend);

开源技术小栈11、支持GET方式获取令牌。需要插件大于版本 >=1.9.0

代码语言:javascript
代码运行次数:0
复制

/** 是否支持 get 请求获取令牌 */
'is_support_get_token' => true,

/** GET 请求获取令牌请求key */
'is_support_get_token_key' => 'authorization',

开源技术小栈12、自定义访问令牌和刷新令牌过期时间

代码语言:javascript
代码运行次数:0
复制

$extend = [
    'id'  => 2024,
    'access_exp'  => 7200,  // 2 小时
];
$token = Tinywan\Jwt\JwtToken::generateToken($extend);

开源技术小栈13、令牌过期错误码

  • 访问令牌
    • 身份验证令牌无效:401011
    • 身份验证令牌尚未生效:401012
    • 身份验证会话已过期,请重新登录!:401013
    • 获取的扩展字段不存在:401014
    • 访问令牌未知错误:401015
  • 刷新令牌
    • 刷新令牌无效:401021
    • 刷新令牌尚未生效:401022
    • 刷新令牌会话已过期,请再次登录!:401023
    • 刷新令牌获取的扩展字段不存在:401024
    • 刷新令牌未知错误:401025

签名算法

JWT 最常见的几种签名算法(JWA):HS256(HMAC-SHA256)RS256(RSA-SHA256) 还有 ES256(ECDSA-SHA256)

JWT 算法列表如下

代码语言:javascript
代码运行次数:0
复制

+--------------+-------------------------------+--------------------+
   | "alg" Param  | Digital Signature or MAC      | Implementation     |
   | Value        | Algorithm                     | Requirements       |
   +--------------+-------------------------------+--------------------+
   | HS256        | HMAC using SHA-256            | Required           |
   | HS384        | HMAC using SHA-384            | Optional           |
   | HS512        | HMAC using SHA-512            | Optional           |
   | RS256        | RSASSA-PKCS1-v1_5 using       | Recommended        |
   |              | SHA-256                       |                    |
   | RS384        | RSASSA-PKCS1-v1_5 using       | Optional           |
   |              | SHA-384                       |                    |
   | RS512        | RSASSA-PKCS1-v1_5 using       | Optional           |
   |              | SHA-512                       |                    |
   | ES256        | ECDSA using P-256 and SHA-256 | Recommended+       |
   | ES384        | ECDSA using P-384 and SHA-384 | Optional           |
   | ES512        | ECDSA using P-521 and SHA-512 | Optional           |
   | PS256        | RSASSA-PSS using SHA-256 and  | Optional           |
   |              | MGF1 with SHA-256             |                    |
   | PS384        | RSASSA-PSS using SHA-384 and  | Optional           |
   |              | MGF1 with SHA-384             |                    |
   | PS512        | RSASSA-PSS using SHA-512 and  | Optional           |
   |              | MGF1 with SHA-512             |                    |
   | none         | No digital signature or MAC   | Optional           |
   |              | performed                     |                    |
   +--------------+-------------------------------+--------------------+

   The use of "+"in the Implementation Requirements column indicates
   that the requirement strength is likely to be increased in a future
   version of the specification.

开源技术小栈可以看到被标记为 Recommended 的只有 RS256 和 ES256。

对称加密算法

开源技术小栈插件安装默认使用HS256 对称加密算法。

HS256 使用同一个「secret_key」进行签名与验证。一旦 secret_key 泄漏,就毫无安全性可言了。因此 HS256 只适合集中式认证,签名和验证都必须由可信方进行。

非对称加密算法

开源技术小栈RS256 系列是使用 RSA 私钥进行签名,使用 RSA 公钥进行验证。

公钥即使泄漏也毫无影响,只要确保私钥安全就行。RS256 可以将验证委托给其他应用,只要将公钥给他们就行。

开源技术小栈以下为RS系列算法生成命令,仅供参考

RS512

代码语言:javascript
代码运行次数:0
复制

ssh-keygen -t rsa -b 4096 -E SHA512 -m PEM -P "" -f RS512.key
openssl rsa -in RS512.key -pubout -outform PEM -out RS512.key.pub

RS512

代码语言:javascript
代码运行次数:0
复制

ssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384.key
openssl rsa -in RS384.key -pubout -outform PEM -out RS384.key.pub

RS256

代码语言:javascript
代码运行次数:0
复制

ssh-keygen -t rsa -b 4096 -E SHA256 -m PEM -P "" -f RS256.key
openssl rsa -in RS256.key -pubout -outform PEM -out RS256.key.pub

开源技术小栈具体算法配置请参考 config/plugin/tinywan/jwt/app.php 配置文件

🔰 下载

Package Installs

PHP Version

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 生成令牌
  • 已支持方法
    • ThinkORM 配置
    • LaravelORM 配置
  • 签名算法
    • JWT 算法列表如下
    • 对称加密算法
    • 非对称加密算法
    • RS512
    • RS512
    • RS256
  • 🔰 下载
    • Package Installs
    • PHP Version
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档