如何在go-zero中使用jwt-token鉴权实践
发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,本篇文章给大家分享的是有关如何在go-zero中使用jwt-token鉴权实践,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建项目生成
千家信息网最后更新 2025年01月25日如何在go-zero中使用jwt-token鉴权实践
本篇文章给大家分享的是有关如何在go-zero中使用jwt-token鉴权实践,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创建项目
生成go.mod文件
以如下指令创建项目
mkdir jwttokencd jwttokengo mod init jwttoken
定义user.api
本文设计API如下 |描述|格式|方法|参数|返回|是否需要鉴权| |----|----|----|----|----|----| |用户登录|/open/authorization|post|mobile:手机号,passwd:密码,code:图片验证码|id:用户ID,token:用户token|否| |更新用户信息|/user/update|post|mobile:用户手机号|token:用户新的token|是|
根据以上描述,书写api的模板文件如下
type ( UserOptReq struct { mobile string `form:"mobile"` passwd string `form:"passwd"` code string `form:"code,optional"` } UserOptResp struct { id uint `json:"id"` token string `json:"token"` } //修改 UserUpdateReq struct { id uint `form:"id"` mobile string `form:"mobile,optional"` })service user-api { @server( handler: authorizationHandler folder: open ) post /open/authorization(UserOptReq) returns(UserOptResp) @server( handler: edituserHandler folder: user ) post /user/update(UserUpdateReq) returns(UserOptResp) }
注意
一个文件里面只能有一个service
工具最后会以type里面模型为样板生成各种结构体,所以参数和结构体保持一致即可
如果我们需要分文件夹管理业务, 可以用folder属性来定义
生成代码
采用如下指令生成代码
goctl api go -api user.api -dir .
运行一下
go run open.go
测试一下
curl http://127.0.0.1:8888/open/authorization -X POST -d "mobile=15367151352&passwd=123rte&code=asasa"\"passwd\":\"testpwd\",\"code\":\"asdf\"}{"id":0,"token":""}
中间件实现鉴权
在handler
下新建auth.go文件,关键代码如下
//鉴权白名单,在这里面的是不需要鉴权的var whiteList []string = []string{ "/open/",}//鉴权中间件func Auth(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Add("X-Middleware", "auth") uri := r.RequestURI //默认不在 isInWhiteList := false //判断请求是否包含白名单中的元素 for _, v := range whiteList { if strings.Contains(uri, v) { isInWhiteList = true } } //如果爱白名单里面直接通过 if isInWhiteList { next(w, r) return } //否则获取前端header 里面的X-Token字段,这个就是token token := r.Header.Get("X-Token") //工具类见util\jwttoken.go _, err := utils.DecodeJwtToken(token) //如果有错直接返回error if err != nil { httpx.Error(w, err) return } //没报错就继续 next(w, r) }}
在routers.go
中添加一行代码
func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) { //添加这行代码 engine.Use(Auth) ///。。}
生成jwttoken
在logic\open\authorizationlogic.go
中实现jwttoken的获取
func (l *AuthorizationLogic) Authorization(req types.UserOptReq) (*types.UserOptResp, error) { //这个是生成jwttoken的工具类 token, err := utils.EncodeJwtToken(map[string]interface{}{ "role": "kefu", "id": "10086", }) return &types.UserOptResp{ Token: token, }, err}
测试
不携带token时访问
>curl http://127.0.0.1:8888/user/update -X POST -d "mobile=15367151352&id=123"鉴权失败,缺少鉴权参数
获取token
>curl http://127.0.0.1:8081/open/authorization -X POST -d "mobile=15367151352&passwd=123rte&code=asasa"{"id":1599063149,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c"}
携带token时访问
>curl http://127.0.0.1:8888/user/update -X POST -H "X-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c" -d "mobile=15367151352&id=123"# 请求成功{"id":123,"token":""}
携带错误的token时访问
>curl http://127.0.0.1:8888/user/update -X POST -H "X-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c0000" -d "mobile=15367151352&id=123"# 返回签名无效signature is invalid
以上就是如何在go-zero中使用jwt-token鉴权实践,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
用户
生成
代码
文件
参数
名单
工具
实践
中间件
就是
手机
手机号
指令
更多
知识
篇文章
结构
项目
测试
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
mysql数据库快照
国外网络安全厂商
思科网络技术挑战赛
万方数据库收录的期刊
如何使用云服务器更安全
多人同时打开access数据库
服务器拒绝下载请求
好的网络安全技能训练网站
深圳怡化招软件开发
网络安全设备升级方案
excel服务器连接不上怎么办
海南绍赢网络技术有限公司
数据库备份和还原分别是指什么
互联网科技捡漏技巧
中国网络安全大赛缩写
vpn服务器 路由器
计算机虚拟网络技术开题ppt
nba2k云游戏连接服务器
服务器系统集成哪家服务好
浙商银行骆鉴软件开发
广州软件开发公司聚顶科技好
软件开发理论指导
计算机网络技术的稳定
高防Bgp服务器
vs数据库添加数据代码
邮政储蓄软件开发笔试真题
少年三国志2少年回归服务器
北京以拉谷网络技术有限公司
苏曼殊小说软件开发
联通服务器密码