当前位置: 首页 > article >正文

swoole方案 统一鉴权与鉴权代理中心

?php/** * 鉴权代理网关 * * 大白话流程 * 请求进来 → 验JWT → 通过了 → 转发给PHP-FPM后端 * → 不通过 → 直接拒绝后端根本看不到这个请求 * * 为什么这么做 * PHP-FPM 每个请求都要启动框架、连数据库验token很慢 * Swoole 常驻内存JWT验证是纯计算不需要查数据库极快 * 把鉴权前置非法请求在门口就挡掉FPM只处理合法请求 * * 依赖 * composer require firebase/php-jwt * * 运行 * php8.4 auth.php */require__DIR__./vendor/autoload.php;useFirebase\JWT\JWT;useFirebase\JWT\Key;useFirebase\JWT\ExpiredException;useFirebase\JWT\SignatureInvalidException;useSwoole\Http\Server;useSwoole\Http\Request;useSwoole\Http\Response;useSwoole\Coroutine\Http\Client;// JWT 签名密钥生产环境换成长随机字符串或RSA公钥constJWT_SECRETyour-secret-key-change-this;// 不需要鉴权的白名单路径constWHITE_LIST[/login,/register,/healthz];// 后端 PHP-FPM 地址通常是 nginxfpm或直接 fpm 的 fastcgi 端口// 这里用 HTTP 方式转发假设后端是个普通 HTTP 服务constBACKEND_HOST127.0.0.1;constBACKEND_PORT8080;$servernewServer(0.0.0.0,9300);$server-set([worker_numswoole_cpu_num(),enable_coroutinetrue,]);$server-on(request,function(Request$req,Response$res){$path$req-server[request_uri];// ── 白名单直接放行不验token ──────────────────────────if(in_array($path,WHITE_LIST,true)){forward($req,$res,null);return;}// ── 从 Header 里拿 token ──────────────────────────────────// 标准格式Authorization: Bearer eyJhbGci...$authHeader$req-header[authorization]??;if(!str_starts_with($authHeader,Bearer )){deny($res,401,missing token);return;}$tokensubstr($authHeader,7);// ── 验证 JWT ──────────────────────────────────────────────// JWT 是三段 base64头.载荷.签名// 验签名 用密钥重新算一遍和第三段对比不一样就是伪造的// 验过期 载荷里有 exp 字段和当前时间比// 这两步都是纯计算不查数据库微秒级try{$payloadJWT::decode($token,newKey(JWT_SECRET,HS256));}catch(ExpiredException$e){deny($res,401,token expired);return;}catch(SignatureInvalidException$e){deny($res,401,invalid token);return;}catch(\Throwable$e){deny($res,401,bad token);return;}// ── 验通过把用户信息透传给后端 ─────────────────────────// 后端直接从 Header 读不用再验一遍forward($req,$res,$payload);});// 转发请求到后端functionforward(Request$req,Response$res,?object$payload):void{$cnewClient(BACKEND_HOST,BACKEND_PORT);$c-set([timeout10]);$headers$req-header??[];// 把解析出来的用户信息塞进 Header后端直接用if($payload){$headers[x-user-id](string)($payload-sub??);$headers[x-user-role](string)($payload-role??);$headers[x-user-name](string)($payload-name??);}// 防止后端被伪造删掉原始 Authorization换成内网信任标记unset($headers[authorization]);$headers[x-auth-verified]1;$c-setHeaders($headers);$c-setMethod($req-server[request_method]);$body$req-rawContent();if($body!$body!false){$c-setData($body);}$qs$req-server[query_string]??;$uri$req-server[request_uri].($qs!??$qs:);$c-execute($uri);if($c-statusCode0){$res-status(502);$res-end(json_encode([errorbackend unavailable]));$c-close();return;}$res-status($c-statusCode);foreach($c-headers??[]as$k$v){$res-header($k,$v);}$res-end($c-body);$c-close();}// 拒绝请求functiondeny(Response$res,int$code,string$msg):void{$res-status($code);$res-header(Content-Type,application/json);$res-end(json_encode([error$msg]));}$server-on(workerStart,function($s,$wid){if($wid0)echoAuth Gateway → http://0.0.0.0:9300\n;});$server-start();装依赖跑起来cd/mnt/d/auth composerrequirefirebase/php-jwt php8.4auth.php 测试没有token被拒 curl http://localhost:9300/api/user生成一个测试token验证通过 php8.4-r require vendor/autoload.php; echo \Firebase\JWT\JWT::encode( [sub123,roleadmin,name张三,exptime()3600], your-secret-key-change-this, HS256 ); 把输出的token带上请求 curl-HAuthorization: Bearer 上面的tokenhttp://localhost:9300/api/user---大白话解释JWT是什么 三段 base64 拼起来的字符串头.载荷.签名-头说明用什么算法-载荷用户信息比如用户ID、角色、过期时间明文的任何人都能解开看-签名用密钥把前两段算一遍防止有人篡改载荷 验证时只需重新算一遍签名对比不查数据库纯计算极快。 为什么删掉 Authorization 换成 x-auth-verified 后端服务在内网如果直接透传 Authorization后端还要再验一遍浪费。换成 x-auth-verified:1加上解析好的用户信息后端直接读x-user-id 就行信任网关已经验过了。 白名单/login/register 不需要token直接放行转发给后端。

相关文章:

swoole方案 统一鉴权与鉴权代理中心

<?php /*** 鉴权代理网关** 大白话流程&#xff1a;* 请求进来 → 验JWT → 通过了 → 转发给PHP-FPM后端* → 不通过 → 直接拒绝&#xff0c;后端根本看不到这个请求** 为什么这么做&#xff1a;* PHP-FPM 每个请求都要启动框架、连数据库验toke…...

别再让PID调参折磨你了:手把手教你用积分分离和变速积分搞定电机定位不准

电机精准定位的PID调参实战&#xff1a;积分分离与变速积分的黄金组合 机械臂末端总是抖动停不准&#xff1f;云台回中时反复震荡&#xff1f;这些让工程师头疼的定位问题&#xff0c;90%源于PID积分项的粗放管理。传统调参方法像用钝刀雕花——要么积分不足导致静差残留&#…...

关于岩溶隧道突水渗流及围岩损伤的流固耦合行为分析的全面探讨(500M参考资源的岩土建模技术与方法)

Comsol隧道围岩流固耦合 1主题&#xff1a;岩溶隧道突水渗流和损伤 2内容&#xff1a;mph文件、力学参数文件&#xff0c;围岩损伤课题参考文献&#xff08;500M&#xff09; 3备注&#xff1a;看懂每一步建模过程&#xff0c;特别注意研究模态及matlab和comsol的连接&#xff…...

无需代码基础!LiuJuan20260223Zimage开箱即用:WebUI一键生成创意图片

无需代码基础&#xff01;LiuJuan20260223Zimage开箱即用&#xff1a;WebUI一键生成创意图片 1. 引言&#xff1a;让创意图片生成变得简单 你是否曾经遇到过这样的情况&#xff1a;想要一张独特的创意图片&#xff0c;但既不会使用专业设计软件&#xff0c;也没有绘画基础&am…...

基于大语言模型的交易策略感知型电价预测方法研究

由于这是一个完整的学术研究方案,将构建一份详尽的文档,包含方法论、代码实现、模型架构、损失函数设计及实验分析。将提供深入的理论推导、完整的Python代码(基于PyTorch及HuggingFace Transformers)以及详细的代码解释。 基于大语言模型的交易策略感知型电价预测方法研究…...

PADS Logic格点设置优化指南:提升设计效率与美观性

1. 为什么格点设置如此重要&#xff1f; 刚接触PADS Logic时&#xff0c;我和很多新手一样&#xff0c;觉得格点设置就是个可有可无的小功能。直到有一次设计一个复杂电路板&#xff0c;元件摆放怎么都对不齐&#xff0c;连线歪歪扭扭像蚯蚓爬&#xff0c;才意识到格点的重要性…...

Git贡献全流程:从入门到进阶

开源项目Git贡献全流程拆解准备工作注册GitHub/GitLab等代码托管平台账号安装Git并配置基础信息&#xff08;用户名、邮箱&#xff09;熟悉基础Git命令&#xff08;clone、commit、push等&#xff09;了解目标项目的贡献规范&#xff08;CONTRIBUTING.md&#xff09;寻找合适的…...

SAS程序员必看:ADaM数据集里这8个函数,能帮你省下一半调试时间

SAS程序员效率革命&#xff1a;ADaM数据集8个核心函数的深度实战指南 临床试验统计分析编程中&#xff0c;ADaM数据集的构建往往占据SAS程序员70%以上的工作时间。当项目周期压缩到两周时&#xff0c;如何用函数组合替代冗长的条件判断和循环逻辑&#xff0c;成为区分普通程序员…...

效率对比实测:OpenClaw+GLM-4.7-Flash与传统RPA工具任务完成速度

效率对比实测&#xff1a;OpenClawGLM-4.7-Flash与传统RPA工具任务完成速度 1. 测试背景与实验设计 去年我在团队内部推动自动化工具选型时&#xff0c;发现传统RPA工具虽然稳定&#xff0c;但面对非结构化数据处理时显得力不从心。最近接触到OpenClaw框架后&#xff0c;决定…...

PP-DocLayoutV3行业落地:法律合同要素定位、医疗报告结构识别实战解析

PP-DocLayoutV3行业落地&#xff1a;法律合同要素定位、医疗报告结构识别实战解析 1. 新一代文档布局分析引擎&#xff1a;突破传统限制 在日常工作中&#xff0c;我们经常需要处理各种文档——扫描的合同、拍摄的报告、电子文档截图等。传统文档分析工具往往只能识别规整的矩…...

比迪丽SDXL效果展示:多语言提示词支持(中/英/日)实测报告

比迪丽SDXL效果展示&#xff1a;多语言提示词支持&#xff08;中/英/日&#xff09;实测报告 1. 引言&#xff1a;当《龙珠》角色遇上AI绘画 如果你是《龙珠》的粉丝&#xff0c;一定对那个坚强、勇敢的比迪丽印象深刻。现在&#xff0c;有个好消息&#xff1a;通过AI绘画技术…...

COMSOL仿真模型下的石墨烯与钙钛矿太阳能电池光电耦合模型研究

COMSOL石墨烯/钙钛矿太阳能电池仿真模型。 光电耦合模型&#xff0c;文章复现。在太阳能电池的研究领域&#xff0c;石墨烯和钙钛矿的结合无疑是一个热门话题。今天&#xff0c;我们来聊聊如何在COMSOL中构建一个石墨烯/钙钛矿太阳能电池的仿真模型&#xff0c;特别是光电耦合模…...

告别手动录入!用WfForm API实现泛微E9明细表数据自动填充(附完整JS代码)

泛微E9智能表单实战&#xff1a;基于WfForm API的明细表动态填充技术解析 在OA系统实施过程中&#xff0c;明细表数据的手动录入一直是效率瓶颈。以采购申请为例&#xff0c;当选择"紧急采购"状态时&#xff0c;需要自动加载备用供应商清单&#xff1b;在设备报修场景…...

老旧Intel Mac系统焕新指南:用OpenCore Legacy Patcher实现设备重生

老旧Intel Mac系统焕新指南&#xff1a;用OpenCore Legacy Patcher实现设备重生 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款强大的开源…...

AI 写代码快得飞起,但怎么让生成的项目能改、能维护、不崩?

AI Coding 让代码生成速度飙升&#xff0c;但“跑通”绝不等于“可维护”。当团队沉浸在快速上线的快感中时&#xff0c;往往忽略了底层隐患。不少开发者发现&#xff0c;缺乏像 Oinone 这样具备严格框架纪律的工程化底座&#xff0c;生成的系统就像临时拼装的乐高&#xff0c;…...

VITS凭什么能“以假乱真”?拆解其背后让语音更自然的三个设计巧思

VITS如何突破语音合成的自然度瓶颈&#xff1f;三大核心技术解析 在语音合成领域&#xff0c;从早期的拼接式系统到如今的神经网络模型&#xff0c;技术迭代始终围绕一个核心目标&#xff1a;如何让机器发出的声音更像真人。传统TTS系统虽然已经能够生成清晰可懂的语音&#xf…...

CosyVoice数据库应用实战:结合MySQL存储与管理海量语音资产

CosyVoice数据库应用实战&#xff1a;结合MySQL存储与管理海量语音资产 想象一下&#xff0c;你正在开发一个智能客服系统&#xff0c;每天需要为成千上万的用户生成个性化的语音回复。或者&#xff0c;你在做一个有声书平台&#xff0c;需要管理数万本图书的语音合成资产。很…...

Wan2.1 VAE爬虫数据增强实战:将爬取的图像数据转化为统一艺术风格

Wan2.1 VAE爬虫数据增强实战&#xff1a;将爬取的图像数据转化为统一艺术风格 你有没有遇到过这种情况&#xff1f;辛辛苦苦从网上爬下来一堆图片&#xff0c;准备用来训练自己的AI模型&#xff0c;结果发现这些图片风格五花八门——有的明亮&#xff0c;有的灰暗&#xff0c;…...

Deepsort跟踪器在车辆检测中的表现如何?我用MOT16数据集做了这些实验

DeepSORT在车辆跟踪中的实战评估&#xff1a;从MOT16数据集改造到指标分析 当目标跟踪技术从学术研究走向工业落地时&#xff0c;车辆跟踪成为智能交通和自动驾驶领域的关键环节。本文将带您深入探索如何将原本针对行人跟踪设计的MOT16数据集改造为车辆跟踪评估基准&#xff0c…...

Jupyter Notebook新手必看:5分钟搞定环境配置与常见问题解决

Jupyter Notebook新手极简指南&#xff1a;从零配置到高效编码 第一次打开Jupyter Notebook时&#xff0c;那种既期待又忐忑的心情我至今记忆犹新——面对这个看似简单却功能强大的交互式笔记本工具&#xff0c;如何快速搭建起自己的开发环境&#xff1f;本文将带你用最短的时…...

从零开始C语言调用MiniCPM-V-2_6:轻量级本地推理引擎开发

从零开始C语言调用MiniCPM-V-2_6&#xff1a;轻量级本地推理引擎开发 1. 引言 如果你是一名嵌入式开发者&#xff0c;或者正在为一个资源受限的边缘设备寻找AI能力&#xff0c;那么“用C语言直接调用大模型”这个想法&#xff0c;可能既让你兴奋&#xff0c;又让你觉得无从下…...

别再死记硬背了!用Python代码和动画图解帮你彻底搞懂DFA/NFA(附Jupyter Notebook)

用Python代码与动画彻底掌握DFA/NFA&#xff1a;从理论到正则表达式引擎实战 引言&#xff1a;为什么我们需要可视化学习自动机理论&#xff1f; 第一次接触有限自动机概念时&#xff0c;你是否曾被那些抽象的状态转移图弄得晕头转向&#xff1f;作为计算机科学的核心基础理论&…...

python学习笔记--集和的内置方法

# 集合的特点是无序且去重 # 集合 变量名 {元素1,元素2, 元素3, ...} # 【1】支持类型强制转换 # 可以将其他类型转换为 集合 print(set("dreammmmm")) # {m, d, e, a, r} print(set(list("dreammmmm"))) # {m, d, e, a, r} print(set(tuple("dream…...

深刻思考Python 装饰器——不输Java Aop的切面编程利器

先说结论 java 注解能实现的功能&#xff0c;python 的装饰器绝大部分都是可以胜任的&#xff0c;装饰器更像 Java 中注解加上Aop两者的组合 python 是一门极简的语言&#xff0c;语言简洁学习起来也是相当轻松的&#xff0c;但是依然有一些高级技巧&#xff0c;例如装饰器&am…...

TinyPICO Helper库:嵌入式胶水层设计与低功耗实践

1. TinyPICO Helper Library 深度技术解析TinyPICO 是一款基于 ESP32-PICO-D4 封装的超紧凑型 Wi-Fi 微控制器开发板&#xff0c;其物理尺寸仅为 21mm 21mm&#xff0c;却集成了 Wi-Fi、蓝牙双模无线能力、板载 APA102 LED&#xff08;DotStar&#xff09;、锂电充电管理与电压…...

树莓派5实战:NCNN部署YOLOv8n实现实时视频目标检测

1. 为什么选择树莓派5部署YOLOv8n&#xff1f; 树莓派5作为最新的单板计算机&#xff0c;性能相比前代提升了2-3倍&#xff0c;特别适合边缘计算场景。我在实际测试中发现&#xff0c;其搭载的Cortex-A76四核处理器和VideoCore VII GPU&#xff0c;在处理轻量级AI模型时表现突出…...

智能助盲新方案:CYBER-VISION零号协议实战案例分享

智能助盲新方案&#xff1a;CYBER-VISION零号协议实战案例分享 1. 技术背景与项目意义 视障人士在日常生活中面临着诸多挑战&#xff0c;其中最为关键的是环境感知与导航问题。传统助盲设备如白手杖虽然实用&#xff0c;但在复杂环境中的信息反馈有限。CYBER-VISION零号协议应…...

VideoAgentTrek-ScreenFilter惊艳时刻:复杂游戏界面UI元素的精准识别与艺术化处理

VideoAgentTrek-ScreenFilter惊艳时刻&#xff1a;复杂游戏界面UI元素的精准识别与艺术化处理 不知道你有没有过这样的经历&#xff1f;辛辛苦苦打了一局精彩游戏&#xff0c;想录下来分享给朋友&#xff0c;结果回放时发现&#xff0c;整个画面被各种血条、地图、技能图标和聊…...

买UPS 电源别懵!分类全解析看懂这几种,姐姐带你避坑! 必看

哈喽&#xff0c;各位老板、同行、还有刚入行的小伙伴们&#xff0c;我是你们卖 UPS 电源的姐姐&#xff01;平时经常有客户问我&#xff1a;“姐姐&#xff0c;UPS 到底怎么分啊&#xff1f;我看有不同尺寸&#xff0c;到底我该选哪种&#xff1f;”今天姐姐就用大白话&#x…...

数据治理-Doris-别名函数和存储过程

目的 记录使用Doris进行数据治理过程中的经验技巧 别名函数 数据治理-SQL生产过程中&#xff0c;需要将大量常用到的数据加工逻辑简化为单个函数&#xff0c;以精简SQL语句&#xff0c;提升可读性和可维护性。 Doris中创建函数的方法有两种&#xff1a; 1、UDF方式&#xff1a;…...