go-zero jwt 鉴权快速实战
前面我们分享了 go-zero 的快速实战以及日志组件的剖析,本次我们来实战使用 go-zero jwt 鉴权
本次文章主要是分享关于 go-zero 中 jwt 的使用方式,会以一个 demo 的方式来进行实战,对于使用 goctl 工具以及安装细节就不在赘述,有需要的话可以查看:
- 官网
本次文章主要分为如下几个部分:
- Jwt 的简单介绍
- Go-zero 中使用 jwt 实战
Jwt 的简单介绍
关于 jwt 鉴权的细节和原理,感兴趣的朋友可以查看历史文章:JWT身份认证(附带源码讲解) | GO主题月
那么我们如何识别什么时候需要使用 jwt 呢?
- 用于授权
例如某个系统通过例如账号密码登录之后,后台会生成一个 jwt,这个用户在这个系统之后的任何操作,都会去校验这个 jwt,就不需要用户操作系统内其他模块的时候,还去进行一次登录
当然,这是需要我们做好设定,这个 jwt 针对哪一些路由可以使用,从而允许用户访问该令牌允许的路由,服务和资源
- 用于信息交换
因为 jwt 可以与各方进行安全的传输,内部使用了签名算法,公钥加密,私钥解密,而且 jwt 的数据各种中有标头,有效载荷,以及其他的签发时间,过期时间,颁发人等等,可以用来校验信息是否被篡改了
Go-zero 中使用 jwt 实战
话不多说,咱们就来开始实战吧,先来给自己提一个需求:
需求
- 同学们平时去图书馆,都是需要登录自己的账号,才可以进入系统查询书籍余量的
- 那么我们就来实现一下,用账号密码登录图书系统,并生成一个 jwt,后续该用户进行书籍查询的时候,就可以直接使用 jwt 来进行鉴权
分析
那么,根据上述需求,显然,咱们会使用到数据库,本次这里咱们仍然使用 mysql 进行演示,并且会涉及到用户表和图书表
我们可以现在创建一下这两张表
- user table
user.sql
CREATE TABLE `user`
(`stu_id` varchar(255) NOT NULL COMMENT 'stu_id',`name` varchar(255) NOT NULL COMMENT 'name',`password` varchar(255) NOT NULL COMMENT 'password',`gender` varchar(255) NOT NULL COMMENT 'gender',PRIMARY KEY(`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
| stu_id | 学号 |
|---|---|
| name | 姓名 |
| password | 密码 |
| gender | 性别 |
- book table
book.sql
CREATE TABLE `book`
(`book_id` varchar(255) NOT NULL COMMENT 'stu_id',`name` varchar(255) NOT NULL COMMENT 'name',`count` INTEGER (255) NOT NULL COMMENT 'password',PRIMARY KEY(`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
| book_id | 图书 id |
|---|---|
| name | 图书名称 |
| count | 图书剩余数量 |
咱们可以向表中插入一些 demo 数据,便于后续使用
insert into book(book_id,name,count)values("000001","kubernetes in action",99);
insert into book(book_id,name,count)values("000002","effective go",88);
insert into book(book_id,name,count)values("000003","穷爸爸富爸爸",21);insert into user(stu_id,name,password,gender)values("13141549", "小胖", "Aa123123", "男");
insert into user(stu_id,name,password,gender)values("15161766", "阿强", "6r*,oo", "男");
insert into user(stu_id,name,password,gender)values("1325590", "marry", "123456", "女");
开始实战 go-zero 的 jwt
先来看看基本的代码目录

- 新建代码目录,并编写 book 和 user 的 api
新建目录
mkdir my_test_demo/my_book_sys/book/api -p
mkdir my_test_demo/my_book_sys/book/model -p
mkdir my_test_demo/my_book_sys/user/api -p
mkdir my_test_demo/my_book_sys/user/rpc -p
mkdir my_test_demo/my_book_sys/user/model -p
cd my_test_demo
go mod init my_test_demo
go mod tidy
编写 api 文件 并生成 go 代码
book.api
定义 book api
-
GET /search/do 查询书籍接口,使用
jwt: Auth进行标识- 通过请求书名,鉴权完毕之后,响应响应书名对应的剩余数量

user.api
定义 user api
-
定义 POST /user/login 接口
- 通过账号密码请求接口,内部校验完毕之后,返回 jwt token

\
使用工具将上述 api 生成 go 对应的代码
cd my_test_demo/my_book_sys/book/api
vim book.api
goctl api go -api book.api -dir .cd my_test_demo/my_book_sys/user/api
vim user.api
goctl api go -api user.api -dir .
- 编写数据库的 sql 语句,使用 goctl 生成 go 代码
- 直接将上述的 ****
book.sql拷贝到my_test_demo/my_book_sys/book/model下
- 将 user.sql 拷贝到 ****
my_test_demo/my_book_sys/user/model下
生成数据库相关的 go 代码文件
cd my_test_demo/my_book_sys/book/model
goctl model mysql ddl -src book.sql -dir .cd my_test_demo/my_book_sys/user/model
goctl model mysql ddl -src user.sql -dir .
这个时候,咱们就已经完成了大部分的准备工作,接下来我们来查看一下代码目录

添加数据库配置和 jwt 相关配置
User 部分
- 修改
my_test_demo/my_book_sys/user/api/etc/user-api.yaml,加上数据库配置和 Auth 配置
- DataSource 数据库配置
-
Auth jwt 配置
- AccessSecret jwt 需要的密钥
- AccessExpire 过期时间,单位 秒

- 修改
my_test_demo/my_book_sys/user/api/internal/config/config.go增加配置对应的数据结构

- 补充 svc 层的数据结构,修改
my_test_demo/my_book_sys/user/api/internal/svc/servicecontext.go,以及补充 NewServiceContext 的实现

- 补充咱们的核心逻辑层的代码,
my_test_demo/my_book_sys/user/api/internal/logic/loginlogic.go,大体逻辑如下
- 校验入参,去掉输入的用户名和密码的前后空格
- 查询数据库进行数据校验,此处我们手动在
my_test_demo/my_book_sys/user/model/usermodel_gen.go文件中添加了数据库操作的 FindOneByName 方法
- 校验通过之后生成 jwt token 进行响应

此处的 model 方法可以加在 my_test_demo/my_book_sys/user/model/usermodel_gen.go



Book 部分
- 修改
my_test_demo/my_book_sys/book/api/etc/book-api.yaml,加上数据库配置和 Auth 配置
其中 AccessSecret 和 AccessExpire 的字段名和值保持和上述 user 路径下的内容一致
Name: search-api
Host: 0.0.0.0
Port: 9001
DataSource: root:123456@tcp(localhost:3306)/test_demo
Auth:AccessSecret: secretoooppppooooAccessExpire: 3600
- 同理,添加配置对应的数据结构,修改
my_test_demo/my_book_sys/book/api/internal/config/config.go
type Config struct {rest.RestConfDataSource stringAuth struct {AccessSecret stringAccessExpire int64}
}
- 补充 svc 层的数据结构,修改
my_test_demo/my_book_sys/book/api/internal/svc/servicecontext.go,以及补充 NewServiceContext 的实现

- 补充咱们的核心逻辑层的代码,
my_test_demo/my_book_sys/book/api/internal/logic/searchlogic.go,大体逻辑如下
- 通过书名查询数据库
- 返回具体书名的剩余数量

上述代码中 l.svcCtx.BookHttpModel.FindOneByName 是我们自定义修改了 model 下的文件内容,新增 FindOneByName 方法 ,修改 my_test_demo/my_book_sys/book/model/bookmodel_gen.go



验收成果
咱们分别进入到项目对应的 api 路径下,启动服务
终端1:
cd my_test_demo/my_book_sys/book/api
go run search.go
终端2:
cd my_test_demo/my_book_sys/user/api
go run user.go
终端3:
- 咱们先来请求 book 的 api,在没有登录系统的情况下来查询书籍,看看是什么样的效果
curl -i -X GET \'http://localhost:9001/search/do?name=effective%20go'

- 很明显,服务给我们返回了一个未授权,说明咱们的鉴权机制此处是有效果的,那么接下来登录一个用户
// post 用户登录curl -i -X POST http://localhost:9002/user/login -H 'Content-Type: application/json' -d '{"username":"小胖","password":"Aa123123"
}'

可以看到是登录成功了,且服务端给我们返回了对应的 jwt token,接下来咱们执行第一步,请求查询一下数据的数量
// get 书籍
curl -i -X GET \'http://localhost:9001/search/do?name=effective%20go' -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjA5NzMwNDEsImlhdCI6MTY2MDk2OTQ0MSwic3R1SWQiOiIxMzE0MTU0OSJ9.Jae_5GPr-xuB2mfqospfisV93ReUnGTZJ87WsIQ-bhE'

很明显,此处的鉴权机制 ok,鉴权完毕之后,正确查询数据库,查询到我们期望的书籍剩余数量
兄弟们,动起手来吧,先来应用 go-zero 的 jwt ,再去看 go-zero 的实际源码细节,很快就能明白
具体的源码地址可以查看:https://github.com/qingconglaixueit/my_test_Demo
至此,本篇内容结束
感谢阅读,欢迎交流,点个赞,关注一波 再走吧
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
\
\
// get 书籍
curl -i -X GET \'http://localhost:9001/search/do?name=effective%20go' -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjA5NzMwNDEsImlhdCI6MTY2MDk2OTQ0MSwic3R1SWQiOiIxMzE0MTU0OSJ9.Jae_5GPr-xuB2mfqospfisV93ReUnGTZJ87WsIQ-bhE'// post 用户登录curl -i -X POST http://localhost:9002/user/login -H 'Content-Type: application/json' -d '{"username":"小胖","password":"Aa123123"
}'
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI
相关文章:
go-zero jwt 鉴权快速实战
前面我们分享了 go-zero 的快速实战以及日志组件的剖析,本次我们来实战使用 go-zero jwt 鉴权 本次文章主要是分享关于 go-zero 中 jwt 的使用方式,会以一个 demo 的方式来进行实战,对于使用 goctl 工具以及安装细节就不在赘述,有…...
9.8day58 单调栈
739. 每日温度 - 力扣(LeetCode) 知识点:1.建栈 2.如果后面要加入的数小于栈顶元素就把数组的下标压进栈里 3.反之 就让该数于栈顶元素进行比较 如果该数大于栈顶元素(while) 就把栈顶元素下表对应的arr数组的值进行…...
快速完成工信部APP备案流程_以阿里云APP备案为例
阿里云APP备案流程分为6步,APP备案成功后应用可以上架,登录阿里云账号填写APP信息,等待阿里云初审,初审通过后进行工信部短信核验,管局审核通过后APP即可备案成功,最后移动APP应用可以分发平台上架…...
uniapp中UView中 u-form表单在v-for循环下如何进行表单校验
1、数据data格式 注:rule绑定的tableFromRule中要和表单tableFrom下面放置一个同名数组,确保u-form能找到 tableFrom: {tableData: [//数据详情列表]},tableFromRule: {//校验tableData: [//数据详情列表]},formRules:{localation:[{required: true,mes…...
工作新时代,腾讯轻联塑造高效办公未来
腾讯轻联:开启便捷、高效的集成新纪元 ⭐ 写在前面⭐ 使用模板快速起步⭐ 自定义流程初体验⭐ 无与伦比的集成强者⭐ 写在最后 ⭐ 写在前面 在当今竞争激烈的商业环境中,提高企业的办公效率和工作流程自动化变得至关重要。腾讯轻联,作为新一…...
JavaScript实现广告倒计时和跳过广告
倒计时和跳过广告 最近打开手机上的app,映入眼帘的都是一个几秒的广告,带有倒计时,当然如果不喜欢的话可以点击跳过,跳过广告其实质应该就是关闭广告。以前用JavaScript做过一个定时关闭的广告,于是把代码完善了一下&…...
蚂蚁发布金融大模型:两大应用产品支小宝2.0、支小助将在完成备案后
9月8日,在上海举办的外滩大会上,蚂蚁集团正式发布金融大模型。据了解,蚂蚁金融大 模型基于蚂蚁自研基础大模型,针对金融产业深度定制,底层算力集群达到万卡规模。该大 模型聚焦真实的金融场景需求,在“认知…...
Jenkins 持续集成:Linux 系统 两台机器互相免密登录
背景知识 我们把public key放在远程系统合适的位置,然后从本地开始进行ssh连接。 此时,远程的sshd会产生一个随机数并用我们产生的public key进行加密后发给本地,本地会用private key进行解密并把这个随机数发回给远程系统。 最后…...
Golang-GJSON 快速而简单的方法来从 json 文档获取值
GJSON 是一个 Go 包,它提供了一种快速而简单的方法来从 json 文档获取值。它具有单行搜索、点符号路径、迭代和解析 json 行等功能。 GJSON 也可用于Python和Rust 入门 安装中 要开始使用GJSON 请安装 Go 并运行 go get : $ go get -u github.com/ti…...
echarts根据x轴数据长度判断是否倾斜展示/柱状图上方显示数字
showChart1() { // 通过id初始化let chart1 echarts.init(document.getElementById(this.idName))var option {// 到容器的距离grid: {top: 18,left: 0,right: 4,bottom: 0,},xAxis: [{type: category,data: this.xData,axisLine: {lineStyle: {color: rgba(255, 255, 255, .…...
Eviews用向量自回归模型VAR实证分析公路交通通车里程与经济发展GDP协整关系时间序列数据和脉冲响应可视化...
全文下载链接:http://tecdat.cn/?p27784 河源市是国务院1988年1月7日批准设立的地级市,为了深入研究河源市公路交通与经济发展的关系,本文选取了1988-2014年河源市建市以来24年的地区生产总值(GDP)和公路通…...
群晖NAS:通过Docker 部署宝塔面板【注册表:cyberbolt/baota】
群晖NAS:通过 Docker 部署宝塔面板【注册表:pch18/baota】 由于 docker 源地址被墙,在面板里面查询不到注册表,使用 ssh 命令行拉取 1、打开 SSH,链接后打开命令行 这里不赘述,具体自行百度 2、下载 镜像…...
pdfjs在线预览组件的使用
前言 pdfjs在线预览组件。 原生浏览器预览pdf文件,存在pdf xss跨站攻击风险。推荐使用pdfjs第三方组件在线预览pdf文件。 如何使用 下载 官方插件下载地址:https://mozilla.github.io/pdf.js/getting_started/ 安装 把下载的文件复制到项目中 使用pd…...
python线程、协程
线程 创建线程对象 from threading import Threadt Thread() # 功能:创建线程对象 # 参数:target 绑定线程函数 # args 元组 给线程函数位置传参 # kwargs 字典 给线程函数键值传参启动线程 t.start() # 启动线程回收线程 t.join([timeout]) # …...
AttributeError: module ‘OpenSSL.SSL’ has no attribute ‘SSLv3_METHOD
这个错误是由于在OpenSSL.SSL模块中找不到SSLv3_METHOD属性导致的。解决这个问题的方法如下: 首先,确保你已经安装了最新版本的cryptography和pyOpenSSL。你可以使用以下命令卸载并重新安装它们: 卸载cryptography:pip uninstall …...
DTCC 2023丨云原生环境下,需要什么样的 ETL 方案?
2023年8月16日~18日,第14届中国数据库技术大会(DTCC 2023)于北京隆重召开,拓数派受邀参与本次大会,PieCloudDB 技术专家邱培峰在大会做了《云原生虚拟数仓 PieCloudDB ETL 方案设计与实现》的主题演讲,详…...
在UE4虚幻引擎中加入导航网格体边界体积后丧尸不能移动和发现玩家
UE4系列文章目录 文章目录 UE4系列文章目录前言一、用到的知识点二、问题原因 前言 最近使用ue4做第一人称视角射击游戏发现问题,加入导航网格体边界体积后丧尸不能移动和发现玩家。下图是出现的问题图片 一、用到的知识点 1.行为树:控制并显示AI的决…...
华为数通方向HCIP-DataCom H12-821题库(单选题:221-240)
第201题 BGP 协议用 beer default-route-advertise 命令来给邻居发布缺省路由,那么以下关于本地 BGP 路由表变化的描述,正确的是哪一项? A、在本地 BGP 路由表中生成一条活跃的缺省路由并下发给路由表 B、在本地 BGP 路由表中生成一条不活跃的缺省路由,但不下发给…...
aarch64 arm64 部署 stable diffusion webui 笔记 【1】准备 venv 安装pytorch 验证cuda
aarch64 pytorch(没有aarch64对应版本,自行编译) pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记【2】验证cuda安装 成功_hkNaruto的博客-CSDN博客 创建venv [rootceph3 stable-diffusion-webui]# /usr/local/Python-3.10.12/bin/python3 -m v…...
从方法到目标了解什么是机器学习?
一、什么是机器学习 1、简述 机器学习是 人工智能(AI) 和计算机科学的一个分支,专注于利用数据和算法来模仿人类的学习方式,逐步提高其准确性。过去几十年来,存储和处理能力方面的技术进步催生了一些基于机器学习的创新产品,例如 Netflix 的推荐引擎和自动驾驶汽车。 机…...
微信读书助手wereader:革新数字阅读体验的全方位解决方案
微信读书助手wereader:革新数字阅读体验的全方位解决方案 【免费下载链接】wereader 一个功能全面的微信读书笔记助手 wereader 项目地址: https://gitcode.com/gh_mirrors/we/wereader 在信息爆炸的时代,如何高效管理数字阅读内容、系统化整理读…...
tcc-g15:硬件级散热控制的开源替代方案 | 轻量无广告设计
tcc-g15:硬件级散热控制的开源替代方案 | 轻量无广告设计 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 tcc-g15作为Dell G15系列游戏本的开源替代…...
StructBERT情感分类模型部署架构设计
StructBERT情感分类模型部署架构设计 1. 引言 情感分类是自然语言处理中的核心任务之一,能够自动分析文本中的情感倾向,在用户评价分析、舆情监控、智能客服等场景中发挥着重要作用。StructBERT作为基于Transformer架构的预训练模型,在中文…...
OpenClaw局域网访问配置
根据OpenClaw最新官方文档(截至2026年3月),以下是更新后的局域网访问配置指南,整合了网络架构、安全加固和自动化配对等新特性:一、核心配置命令(基于新版网关协议)启用LAN多接口监听 使用新参数…...
TM1651驱动LED条形图模块原理与嵌入式驱动开发
1. Whadda LED Bar Graph 模块技术解析与嵌入式驱动开发实践1.1 模块硬件架构与核心芯片特性Whadda WPI471 是一款基于 TM1651 驱动 IC 的 10 段 LED 条形图显示模块,广泛应用于嵌入式系统中的模拟量可视化指示场景,如电池电量、信号强度、温度梯度、音频…...
LabelImg图像标注工具:3分钟掌握高效目标检测数据标注技巧
LabelImg图像标注工具:3分钟掌握高效目标检测数据标注技巧 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check ou…...
AIGlasses_for_navigation 开发环境快速配置:Anaconda虚拟环境指南
AIGlasses_for_navigation 开发环境快速配置:Anaconda虚拟环境指南 你是不是也遇到过这种情况:好不容易在本地跑通了一个项目,换台电脑或者更新了几个库,结果就报了一堆莫名其妙的错误。或者,你想同时维护两个需要不同…...
PingFangSC字体全栈应用指南:从技术原理到性能优化
PingFangSC字体全栈应用指南:从技术原理到性能优化 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 解析字体技术原理:为什么格式选…...
Day4 Python的函数和参数机制
函数的定义与调用最基本的函数结构如下:def greet(name): return f"Hello, {name}!" print(greet("Alice")) def 定义函数调用时传入对应参数如果参数数量或顺序不匹配,就会报错,这是最常见的问题之一。默认参数默认参数…...
用STM32F411和CLion从零搭建三轮全向小车:PID调参、VOFA+上位机调试全记录
用STM32F411和CLion从零搭建三轮全向小车:PID调参、VOFA上位机调试全记录 第一次接触全向轮机器人时,我被它灵活的运动方式深深吸引——不同于传统轮式机器人,它能实现任意方向的平移和旋转。这种独特的移动能力在狭小空间作业、仓储物流等领…...
