ZoneMinder 仓库内 jwt-cpp 的 Conan 示例:从构建、运行到源码级解析
音视频后端计算机视觉【免费下载链接】zoneminderZoneMinder is a free, open source Closed-circuit television software application developed for Linux which supports IP, USB and Analog cameras.项目地址https://gitcode.com/gh_mirrors/zo/zoneminder点击查看免费下载本篇技术指南以 dep/jwt-cpp/example/conan/README.md 为骨架完整讲解如何通过 Conan 包管理器在 Linux 上构建并运行 jwt-cpp 的官方示例程序。文章不仅逐条拆解构建命令、conanfile.txt、CMakeLists.txt与main.cpp的协作关系还会结合 ZoneMinder 仓库中 jwt-cpp 的真实调用src/zm_crypt.cpp说明 JWT 解码与验签的工程化用法让读者读完既能跑通示例也能理解 JWT 解码、Claims 提取背后的完整链路。示例目录一览一个最小可复现的 Conan jwt-cpp 工程示例位于仓库的dep/jwt-cpp/example/conan/目录下共四个文件构成一个最小但完整的、可被 Conan 与 CMake 构建的 JWT 解码程序文件作用README.md构建与运行说明本文讲解对象conanfile.txtConan 依赖清单与生成器声明CMakeLists.txtCMake 构建脚本消费 Conan 生成的信息main.cpp解码一个 HS256 签名的 JWT并打印全部 Claims这个示例的价值在于它演示了「header-only 的 jwt-cpp 一个 JSON 库 一个可执行目标」如何在 Conan 的依赖解析与 CMake 的生成文件机制下被组织起来是任何想在自己的 C 项目里引入 jwt-cpp 的开发者可以直接照搬的最小模板。完整构建流程四条命令跑通示例原文档给出的构建步骤非常精炼面向 Linux 环境在当前目录下执行mkdir build cd build conan install .. cmake .. cmake --build .逐条拆解这四条命令背后的动作mkdir build cd build创建独立的构建目录。Conan 生成的文件conanbuildinfo.cmake等与 CMake 的产物都会落在这里不污染源码目录。conan install ..Conan 读取上一级目录的 conanfile.txt解析并下载依赖同时根据[generators] cmake声明生成conanbuildinfo.cmake等 CMake 可消费的构建信息文件。cmake ..CMake 配置阶段会include()这份 Conan 生成的conanbuildinfo.cmake从而拿到 jwt-cpp 与 picojson 的头文件路径与链接库列表见下文 CMakeLists.txt 解析。cmake --build .编译main.cpp并链接出可执行文件。构建完成后运行可执行程序$ ./bin/conan-example sub jrocketexample.com iss Online JWT Builder exp 1641559177 aud www.example.com Surname Rocket Role [Manager,Project Administrator] iat 1610023177 GivenName Johnny Email jrocketexample.com可执行文件名为conan-example其来源在 CMakeLists.txt 中project(conan-example)定义了工程名add_executable(${PROJECT_NAME} main.cpp)将可执行目标命名为${PROJECT_NAME}即conan-example。conanfile.txt 解析依赖声明与生成器conanfile.txt 全文仅两段却承载了 Conan 工作流的全部声明[requires] jwt-cpp/0.6.0 picojson/cci.20210117 [generators] cmake[requires]声明两个依赖。jwt-cpp/0.6.0是 ConanCenter 上发布的 jwt-cpp 版本picojson/cci.20210117是 picojson 这个 header-only JSON 库的一个社区版本。为什么需要 JSON 库因为 JWT 的 Payload 本身就是一段 JSONjwt-cpp 在解码时要把 Claims 解析成 JSON 数据结构。仓库内 jwt-cpp 的 README 说明了这种设计jwt-cpp 本身不绑定任何 JSON 库而是通过模板化的jwt::basic_claim接入不同的 JSON 实现picojson 是其默认通过jwt::claim特化使用的那个。[generators] cmake指示 Conan 生成 CMake 集成文件。执行conan install ..后构建目录里会出现conanbuildinfo.cmake、conanbuildinfo.multi等文件供下一步 CMake 使用。值得说明的是示例使用的是 Conan 1.x 时代的经典写法conan installconanbuildinfo.cmake这也是该示例 README 所在时代的主流集成方式对更现代的 Conan 2 来说可以将其理解为同等工作流的旧式表达。CMakeLists.txt 解析Conan 生成信息的消费方式CMakeLists.txt 展示了 CMake 侧如何接入 Conancmake_minimum_required(VERSION 3.8) project(conan-example) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)把 Conan 在conan install阶段生成的文件引入当前构建。注意路径使用的是CMAKE_BINARY_DIR这正是前文conan install ..必须在 build 目录内执行的原因——CMake 与 Conan 共享同一个二进制目录。conan_basic_setup()Conan 提供的宏负责设置头文件搜索路径、编译选项、链接目录等全局变量。add_executable(${PROJECT_NAME} main.cpp)定义可执行目标。target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})把conan_basic_setup()解析出的依赖库列表jwt-cpp 与 picojson链接到目标上。这条链路与 ZoneMinder 主工程消费 jwt-cpp 的方式互为补充。仓库在 dep/CMakeLists.txt 中通过add_subdirectory(jwt-cpp EXCLUDE_FROM_ALL)将 vendored 的 jwt-cpp 作为 header-only INTERFACE 目标直接纳入构建在 src/CMakeLists.txt 中则通过target_link_libraries(... jwt-cpp::jwt-cpp)引用它。可见 jwt-cpp 无论是走 Conan 拉取、还是作为子目录编译对使用方来说最终都是链接一个 header-only 库。main.cpp 源码解析JWT 的解码链路main.cpp 是示例的核心先看它解码的 tokenstd::string token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9. eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2MTAwMjMxNzcsImV4cCI6MTY0MTU1OTE3NywiYXVkIjoid3 d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5h bWUiOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20iLCJSb2xlIjpbIk1hbmFnZXIiLCJQcm9qZWN0IE FkbWluaXN0cmF0b3IiXX0.5EOfHnBmpdPvRHAuVDttgJQvbFuGEF7fC4uBSXAGg6c;这是一个标准的三段式 JWTHeader.Payload.Signature。仅凭肉眼很难分辨但其 Payload 段解码后正是运行输出中的那些 Claims——这也是 Base64Url 编码的本质。解码逻辑只有寥寥数行auto decoded jwt::decode(token); for (auto e : decoded.get_payload_json()) std::cout e.first e.second std::endl;jwt::decode(token)对 token 进行 Base64Url 解码得到jwt::decoded_jwt对象。注意这一步只解码、不验签。签名是否合法需要显式构造 verifier 并调用verify()见下文从解码到验签。get_payload_json()返回 Payload 的 JSON 表示。遍历后逐项输出Claim 名 Claim 值即运行结果中sub、iss、exp等字段。这个解码 遍历输出的模式同样出现在 jwt-cpp 的另一个示例 example/print-claims.cpp 中两者共享同一套 API可作为对照阅读。运行输出解析Claims 的语义与类型将运行输出与 JWT 规范RFC 7519中的标准 Claims 逐一对照Claim值含义subjrocketexample.comSubject令牌主体通常是用户标识issOnline JWT BuilderIssuer签发者exp1641559177Expiration Time过期时间Unix 时间戳audwww.example.comAudience受众iat1610023177Issued At签发时间Unix 时间戳其余三个是自定义私有Claims展示了 jwt-cpp 对复杂 JSON 值的处理能力Surname Rocket字符串值。GivenName Johnny字符串值。Email jrocketexample.com字符串值。Role [Manager,Project Administrator]字符串数组解码后被表示成 JSON 数组形式输出。这一输出与 jwt-cpp 的 traits 机制直接相关jwt-cpp 的 Claims 是建立在值/对象/数组/字符串/数字/整数/布尔等 JSON 语义类型之上的模板化结构参见 jwt-cpp README 对jwt::basic_claim的说明因此数组这类嵌套 JSON 也能被完整保留并打印。从解码到验签jwt-cpp 在 ZoneMinder 中的真实用法Conan 示例演示的只是「解码」而工程实践中更关键的是「验签」。jwt-cpp 的 README 给出了验证的基本范式auto verifier jwt::verify() .allow_algorithm(jwt::algorithm::hs256{ secret }) .with_issuer(auth0); verifier.verify(decoded_token);ZoneMinder 本体正是这样使用 jwt-cpp 的。在 src/zm_crypt.cpp 的verifyToken()函数中可以看到完整的解码→验签→校验 Claims 调用链auto decoded jwt::decode(jwt_token_str); auto verifier jwt::verify() .allow_algorithm(jwt::algorithm::hs256{ key }) .with_issuer(ZoneMinder); verifier.verify(decoded); if (decoded.has_payload_claim(type)) { std::string type decoded.get_payload_claim(type).as_string(); if (type ! access) { ... } } else { ... } if (decoded.has_payload_claim(user)) { username decoded.get_payload_claim(user).as_string(); ... }这段代码与 Conan 示例形成完美的进阶对照同样先jwt::decode得到解码对象随后构造jwt::verify()限制算法为 HS256、并校验issuer必须是ZoneMinder——这正是 Conan 示例没有展示的签名校验环节最后用has_payload_claim(type)/get_payload_claim(type).as_string()等接口读取并校验业务 Claimstoken 类型必须为access并从中提取user用户名。从源码结构看verifyToken()同时维护了#ifdef HAVE_LIBJWT走系统 libjwt与#else走 jwt-cpp两条分支jwt-cpp 是 ZoneMinder 在无系统 libjwt 环境下的默认实现路径。这证明了 Conan 示例中演示的解码 API正是 ZoneMinder 生产代码中实际使用的同一套接口。创建与签发从只读解码到完整生命周期虽然 Conan 示例只覆盖了「解码 打印」但 jwt-cpp 是创建与验证一体化的库签发流程同样简洁引自 jwt-cpp READMEauto token jwt::create() .set_issuer(auth0) .set_type(JWS) .set_payload_claim(sample, jwt::claim(std::string(test))) .sign(jwt::algorithm::hs256{ secret });结合 ZoneMinder 的 src/zm_crypt.cpp 可以推断其配套关系既然verifyToken()要求 token 的issuer为ZoneMinder、且携带type与user两个业务 Claim那么签发端必然是用jwt::create()的链式 API 设置这些字段后再用 HS256 签名。换言之Conan 示例中的main.cpp是看JWT 的入口而 ZoneMinder 中的 zm_crypt.cpp 是用JWT 的完整范例。小结与延伸阅读通过本文可以掌握三条完整技能Conan 集成conanfile.txt的[requires]/[generators]声明 conan installconanbuildinfo.cmake的消费链路是 header-only C 库在 Conan 工作流中的标准接入方式JWT 解码jwt::decode()get_payload_json()足以读取任意 token 的全部 Claims包括字符串数组等复杂 JSON 结构验签进阶jwt::verify()链式配置算法、issuer 等约束后调用verify()才是生产环境安全校验的完整形态——ZoneMinder 的 zm_crypt.cpp 给出了可直接参考的工程实现。若想继续深入建议按以下顺序阅读仓库内相关文件官方示例合集example/含rsa-create.cpp、rsa-verify.cpp、jwks-verify.cpp等更复杂的验签示例库的能力总览jwt-cpp README支持的算法清单、OpenSSL/LibreSSL/wolfSSL 兼容性ZoneMinder 侧集成方式dep/CMakeLists.txt 与 src/CMakeLists.txt赞分享音视频后端计算机视觉【免费下载链接】zoneminderZoneMinder is a free, open source Closed-circuit television software application developed for Linux which supports IP, USB and Analog cameras.项目地址https://gitcode.com/gh_mirrors/zo/zoneminder点击查看免费下载相关推荐jwt-cpp 的 JSON Traits 机制深入解析四种 JSON 库适配示例与 ZoneMinder 集成实践jwt cpp 的 JSON Traits 机制深入解析四种 JSON 库适配示例与 ZoneMinder 集成实践 本文以仓库内 dep/jwt cpp/e音视频后端计算机视觉Angular 源码仓库中的可运行示例库packages/examples 的结构、运行与测试指南Angular 源码仓库中的可运行示例库packages/examples 的结构、运行与测试指南 本指南围绕 Angular 主仓库中的 packages/前端Web框架Android NDK Samples官方 NDK 示例仓库的构建、运行与架构全解析Android NDK Samples官方 NDK 示例仓库的构建、运行与架构全解析 本文以 README.md https://link.gitcode.c示例工程移动开发上一篇qm 部署中的 Slack 集成指南Bot 应用与 SSO 登录的完整配置下一篇Lark CLI 云空间搜索实战指南用 drive search 扁平 flag 精准检索飞书文档、Wiki 与表格创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Pulse v6.4.4-beta.3 发布解析:History 目标选择修正、PBS 遥测关联与监控生命周期同步

Pulse v6.4.4-beta.3 发布解析:History 目标选择修正、PBS 遥测关联与监控生命周期同步

可观测性运维后端 【免费下载链接】Pulse Real-time monitoring dashboard for Proxmox VE, PBS, Docker, Kubernetes, TrueNAS and vSphere. Self-hosted, with smart alerts and AI patrols that catch silent failures. 项目地址: https://gitcode.com/gh_mirror…

2026/10/10 2:43:03 阅读更多 →
第125篇Fragment 通信演进:从接口回调到共享 ViewModel

第125篇Fragment 通信演进:从接口回调到共享 ViewModel

先把结论放在前面:Fragment 通信方案的历史是一条"从松耦合到紧耦合再回到解耦"的弯路,最终答案只有三个——Fragment Result API 适合一次性结果回传、共享 ViewModel 适合状态共享、事件总线只留给跨模块解耦的场景。 这题的考点不在 API 名字,而在你知不知道每…

2026/10/10 2:43:03 阅读更多 →
微信小程序医院预约挂号毕设资源包:业务闭环与部署避坑指南

微信小程序医院预约挂号毕设资源包:业务闭环与部署避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 2:43:03 阅读更多 →

最新新闻

SpringBoot3多数据源实战:从选型配置到避坑指南

SpringBoot3多数据源实战:从选型配置到避坑指南

做后端这些年,只要业务稍微复杂一点,“一个应用连一个库”的理想状态基本撑不住。用户数据放用户库、订单数据放订单库、日志又要独立一套,再加上读写分离和多租户隔离的需求,所有问题都指向同一个核心:一个SpringBoot…

2026/10/10 3:20:15 阅读更多 →
07_在k8s集群中安装ingress-nginx

07_在k8s集群中安装ingress-nginx

文章目录0 背景与架构0.1 为什么需要ingress-nginx0.2 环境架构0.3 镜像拉取方案1 安装前准备1.1 下载ingress-nginx部署文件1.2 替换镜像地址1.3 修复DNS解析问题1.3.1 问题现象1.3.2 修复方法2 安装ingress-nginx2.1 应用部署文件2.2 验证部署3 测试Ingress3.1 部署测试应用3…

2026/10/10 3:20:15 阅读更多 →
基于Spring Boot的宠物用品商城系统开发与实践指南

基于Spring Boot的宠物用品商城系统开发与实践指南

毕业设计季总有人拿着“宠物用品系统”这个题目来找我聊,说白了这个题在Java Web方向的选题清单里几乎年年出现。还有一类人不是学生,是宠物店老板想把自己那套手工记账和微信群接单的流程搬到线上。这两类人虽然出发点不一样,但最终要的东西…

2026/10/10 3:20:15 阅读更多 →
河北省口碑好的母婴护理服务商盘点,资质齐全的正规家政机构不踩坑

河北省口碑好的母婴护理服务商盘点,资质齐全的正规家政机构不踩坑

在衡水,找月嫂、请育婴师,几乎是每个新手家庭的必经之路。可真到了挑选的时候,很多父母才发现,家政市场鱼龙混杂,有的机构只管牵线不管服务,有的月嫂短期培训就匆匆上岗,出了问题连人都找不到。…

2026/10/10 3:20:15 阅读更多 →
个人微信API二次开发:号掉线别急着新建,先救映射表

个人微信API二次开发:号掉线别急着新建,先救映射表

线上最危险的操作不是掉线本身,而是值班同学随手「再建一个号顶上」。半小时后你会看到:一半消息失败、一半回错人、客服觉得有两个机器人在抢答。 多设备与恢复路径见 GeWe 开放文档。 真正炸掉的是什么 不是微信,是你的 客户 → 主责设备…

2026/10/10 3:20:15 阅读更多 →
Docker安装报错全解析:从daemon权限到内核模块的排查指南

Docker安装报错全解析:从daemon权限到内核模块的排查指南

你有没有遇到过这样的场景:费了好大劲把 Docker 装上,兴冲冲地敲下docker ps,结果屏幕上一行红字:permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock这种感觉就像门锁装好了…

2026/10/10 3:19:15 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →