在go-zero中使用jwt

gozero使用jwt

两个步骤

  1. 获取token
  2. 验证token

前端获取token

先编写 jwt.api 文件,放在api目录下
在这里插入图片描述

syntax = "v1"info (title:   "type title here"desc:    "type desc here"author:  "type author here"email:   "type email here"version: "type version here"
)type JwtTokenRequest {}type JwtTokenResponse {AccessToken  string `json:"access_token"`AccessExpire int64  `json:"access_expire"`RefreshAfter int64  `json:"refresh_after"` // 建议客户端刷新token的绝对时间
}type GetUserRequest {UserId string `json:"userId"`
}type GetUserResponse {Name string `json:"name"`
}service jwt-api {@handler JwtHandlerpost /user/token (JwtTokenRequest) returns (JwtTokenResponse)
}@server (jwt: JwtAuth
)
service jwt-api {@handler JwtHandlerspost /user/info (GetUserRequest) returns (GetUserResponse)
}

在api目录下执行

goctl api go -api jwt.api -dir ../

生成如下文件
在这里插入图片描述
jwt-api.yaml 文件添加参数 JwtAuth

Name: jwt-api
Host: 0.0.0.0
Port: 8001
JwtAuth:AccessSecret: af5fsdf5a1sd5ga5sd1gAccessExpire: 86400

在zero-jwt目录下执行mod命令

go mod tidy

获取token代码🌰

package logicimport ("context""github.com/golang-jwt/jwt""time""zero-jwt/internal/svc""zero-jwt/internal/types""github.com/zeromicro/go-zero/core/logx"
)type JwtLogic struct {logx.Loggerctx    context.ContextsvcCtx *svc.ServiceContext
}func NewJwtLogic(ctx context.Context, svcCtx *svc.ServiceContext) *JwtLogic {return &JwtLogic{Logger: logx.WithContext(ctx),ctx:    ctx,svcCtx: svcCtx,}
}func (l *JwtLogic) Jwt(req *types.JwtTokenRequest) (resp *types.JwtTokenResponse, err error) {// todo: add your logic here and delete this linevar accessExpire = l.svcCtx.Config.JwtAuth.AccessExpirenow := time.Now().Unix()accessToken, err := l.GenToken(now, l.svcCtx.Config.JwtAuth.AccessSecret, map[string]interface{}{"uid": 1, "username": "hahah"}, accessExpire)if err != nil {return nil, err}return &types.JwtTokenResponse{AccessToken:  accessToken,AccessExpire: now + accessExpire,RefreshAfter: now + accessExpire/2,}, nil
}
func (l *JwtLogic) GenToken(iat int64, secretKey string, payloads map[string]interface{}, seconds int64) (string, error) {claims := make(jwt.MapClaims)claims["exp"] = iat + secondsclaims["iat"] = iatfor k, v := range payloads {claims[k] = v}token := jwt.New(jwt.SigningMethodHS256)token.Claims = claimsreturn token.SignedString([]byte(secretKey))
}

验证获取token里的数据🌰

package logicimport ("context""encoding/json""log""zero-jwt/internal/svc""zero-jwt/internal/types""github.com/zeromicro/go-zero/core/logx"
)type JwtHandlersLogic struct {logx.Loggerctx    context.ContextsvcCtx *svc.ServiceContext
}func NewJwtHandlersLogic(ctx context.Context, svcCtx *svc.ServiceContext) *JwtHandlersLogic {return &JwtHandlersLogic{Logger: logx.WithContext(ctx),ctx:    ctx,svcCtx: svcCtx,}
}func (l *JwtHandlersLogic) JwtHandlers(req *types.GetUserRequest) (resp *types.GetUserResponse, err error) {//获取token里的数据log.Println(l.ctx.Value("username").(string)) //这里使用(json.Number)强转会报错,username是{}interface 类型log.Println(l.ctx.Value("uid").(json.Number).Int64())return &types.GetUserResponse{Name: "kkkkk" + req.UserId + " " + l.ctx.Value("uid").(json.Number).String() + " " + l.ctx.Value("username").(string)}, nil
}

验证token

发送请求获取token
在这里插入图片描述
发送请求验证token
Headers 头部添加 Authorization参数
在这里插入图片描述
验证不通过就会报401错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/688640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本: 机器人实体一般价格昂贵,为降低机器人学习、调试的成本;高效: 搭建的环境更为多样且灵活,可以提高测试效率以及测试覆盖率&#xff1b…

C++笔试强训day16

目录 1.字符串替换 2.神奇数 3.DNA序列 1.字符串替换 链接 简单的遍历替换即可&#xff1a; class Solution { public:string formatString(string str, vector<char>& arg) {string ret;int k 0;for (int i 0; i < str.size(); i){if (str[i] %){ret arg…

如何使用联合体判断一个机器是大端还是小端

如何使用联合体判断一个机器是大端还是小端 #include<iostream> using namespace std; union Checker//联合体中的数据共享内存 {int val;char ch[2]; }; int main() {Checker checker;checker.val 0x1234;if (checker.ch[0] 0x34)//数组中的数据是由低地址往高地址存放…

云贝教育 |【好课上新】ITSS服务工程师与服务经理认证培训

课程前言 ITSS是中国电子技术标准化研究院推出的&#xff0c;包含“IT 服务工程师”和“IT 服务经理”的系列培训。有效满足GB/T 28827.1 的符合性评估要求和ITSS服务资质升级要求。 IT 服务工程师”结合 IT服务从业人员能力规范和要求&#xff0c;从服务技术、服务技巧和服务…

【HDFS】关于HDFS-17497:在commit block时更新quota

链接:https://github.com/apache/hadoop/pull/6765 Ticket标题:The number of bytes of the last committed block should be calculated into the file length。 HDFS里,一个在写入的文件可能包含多个commited状态的块。 但是计算文件大小的时候,最后一个commited block并…

Java基础教程(20)-Java连接mysql数据库CURD

MYSQL是啥 这个应该不写的,根据文章题目来看,大概率是有所了解的;但是以防万一,简单说一下; MySQL数据库是一款广泛使用的关系型数据库管理系统(RDBMS),支持标准SQL语法,用户可以使用SQL语句对数据进行操作; IDEA中如何加载jar包到项目的类路径中 由于java连接mysql…

探索白啤:清爽与纯净的完善呈现

啤酒的世界色彩斑斓&#xff0c;各种风格迥异的啤酒满足着人们不同的口味需求。而在众多啤酒中&#xff0c;白啤以其与众不同的清爽与纯净口感&#xff0c;成为了许多人的心头好。Fendi club白啤作为精酿啤酒的代表&#xff0c;更是将这种口感发挥到了超卓。 Fendi club白啤的酿…

物联网平台之单体架构

介绍本文主要介绍平台的单体架构&#xff0c;包括各个组件之间的数据流描述以及所做的一些架构选择。在单体架构模式下&#xff0c;所有 ThingsKit 组件都在单个 Java 虚拟机 (JVM) 中启动&#xff0c;并共享相同的操作系统资源。由于 ThingsKit 是用 Java 编写的&#xff0c;因…

linux安装配置Docker保姆级教程

Docker到底是什么? Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相互之间…

远程智控BACnet/IP I/O模块助力Metasys系统无缝对接

江森自控的Metasys系统以其强大的综合管理能力成为众多楼宇自控项目的首选平台。然而&#xff0c;面对日益增长的个性化需求与复杂多变的设备接入挑战&#xff0c;如何高效、灵活地扩展其I/O控制能力成为关键。在此背景下&#xff0c;BACnet/IP分布式远程I/O模块的出现&#xf…

使用Remix部署智能合约到币安链(Remix的操作介绍 币安链合约的部署) 点赞收藏哦

大家好&#xff0c;我是程序员大猩猩呀。 据我所知&#xff0c;很多人进入币圈之后&#xff0c;想要通过炒币一夜暴富&#xff01;另一部分人呢他们希望自己能创建一个项目&#xff0c;然后发行自己的数字货币然后暴富。 不管是什么方式吧&#xff0c;只要不违法&#xff0c;…

weditor安装的时候产生的问题

先放出来github的地址https://github.com/alibaba/web-editor&#xff0c;这个上面给了两种安装方式一种是&#xff1a; pip3 install -U weditor 这种方式会报错误&#xff0c; 具体原因我也不知道。那就采用第二种方式 git clone https://github.com/openatx/weditor pip3…