木木科技 网站艰涩,商品分类标准,松江网站开发培训学校,wordpress注册账号前面我们分享了 go-zero 的快速实战以及日志组件的剖析#xff0c;本次我们来实战使用 go-zero jwt 鉴权
本次文章主要是分享关于 go-zero 中 jwt 的使用方式#xff0c;会以一个 demo 的方式来进行实战#xff0c;对于使用 goctl 工具以及安装细节就不在赘述#xff0c;有…前面我们分享了 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)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4;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)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4;book_id图书 idname图书名称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:123456tcp(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?nameeffective%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?nameeffective%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?nameeffective%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