乐趣区

关于jwt:gozero-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

先来看看根本的代码目录

  1. 新建代码目录,并编写 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 .
  1. 编写数据库的 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 局部
  1. 批改 my_test_demo/my_book_sys/user/api/etc/user-api.yaml ,加上数据库配置和 Auth 配置
  • DataSource 数据库配置

<!—->

  • Auth jwt 配置

    • AccessSecret jwt 须要的密钥
    • AccessExpire 过期工夫,单位 秒
  1. 批改 my_test_demo/my_book_sys/user/api/internal/config/config.go 减少配置对应的数据结构
  1. 补充 svc 层的数据结构,批改 my_test_demo/my_book_sys/user/api/internal/svc/servicecontext.go,以及补充 NewServiceContext 的实现
  1. 补充咱们的外围逻辑层的代码,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 局部
  1. 批改 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: secretoooppppoooo
  AccessExpire: 3600
  1. 同理,增加配置对应的数据结构,批改 my_test_demo/my_book_sys/book/api/internal/config/config.go
type Config struct {
   rest.RestConf
   DataSource string
   Auth struct {
      AccessSecret string
      AccessExpire int64
   }
}
  1. 补充 svc 层的数据结构,批改 my_test_demo/my_book_sys/book/api/internal/svc/servicecontext.go,以及补充 NewServiceContext 的实现
  1. 补充咱们的外围逻辑层的代码,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:

  1. 咱们先来申请 book 的 api,在没有登录零碎的状况下来查问书籍,看看是什么样的成果
curl -i -X GET \
  'http://localhost:9001/search/do?name=effective%20go'
  1. 很显著,服务给咱们返回了一个未受权,阐明咱们的鉴权机制此处是有成果的,那么接下来登录一个用户
// 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"}'
退出移动版