如何在go-zero中使用jwt-token鉴权实践

如何在go-zero中使用jwt-token鉴权实践

本篇文章给大家分享的是有关如何在go-zero中使用jwt-token鉴权实践,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创建项目

生成go.mod文件

以如下指令创建项目

如何在go-zero中使用jwt-token鉴权实践

mkdirjwttokencdjwttokengomodinitjwttoken

定义user.api

本文设计API如下 |描述|格式|方法|参数|返回|是否需要鉴权| |----|----|----|----|----|----| |用户登录|/open/authorization|post|mobile:手机号,passwd:密码,code:图片验证码|id:用户ID,token:用户token|否| |更新用户信息|/user/update|post|mobile:用户手机号|token:用户新的token|是|

根据以上描述,书写api的模板文件如下

type(UserOptReqstruct{mobilestring`form:"mobile"`passwdstring`form:"passwd"`codestring`form:"code,optional"`}UserOptRespstruct{iduint`json:"id"`tokenstring`json:"token"`}//修改UserUpdateReqstruct{iduint`form:"id"`mobilestring`form:"mobile,optional"`})serviceuser-api{@server(handler:authorizationHandlerfolder:open)post/open/authorization(UserOptReq)returns(UserOptResp)@server(handler:edituserHandlerfolder:user)post/user/update(UserUpdateReq)returns(UserOptResp)}

注意

  • 一个文件里面只能有一个service

  • 工具最后会以type里面模型为样板生成各种结构体,所以参数和结构体保持一致即可

  • 如果我们需要分文件夹管理业务, 可以用folder属性来定义

生成代码

采用如下指令生成代码

goctlapigo-apiuser.api-dir.

运行一下

gorunopen.go

测试一下

curlhttp://127.0.0.1:8888/open/authorization-XPOST-d"mobile=15367151352&passwd=123rte&code=asasa"\"passwd\":\"testpwd\",\"code\":\"asdf\"}{"id":0,"token":""}

中间件实现鉴权

handler下新建auth.go文件,关键代码如下

//鉴权白名单,在这里面的是不需要鉴权的varwhiteList[]string=[]string{"/open/",}//鉴权中间件funcAuth(nexthttp.HandlerFunc)http.HandlerFunc{returnfunc(whttp.ResponseWriter,r*http.Request){w.Header().Add("X-Middleware","auth")uri:=r.RequestURI//默认不在isInWhiteList:=false//判断请求是否包含白名单中的元素for_,v:=rangewhiteList{ifstrings.Contains(uri,v){isInWhiteList=true}}//如果爱白名单里面直接通过ifisInWhiteList{next(w,r)return}//否则获取前端header里面的X-Token字段,这个就是tokentoken:=r.Header.Get("X-Token")//工具类见util\jwttoken.go_,err:=utils.DecodeJwtToken(token)//如果有错直接返回erroriferr!=nil{httpx.Error(w,err)return}//没报错就继续next(w,r)}}

routers.go中添加一行代码

funcRegisterHandlers(engine*rest.Server,serverCtx*svc.ServiceContext){//添加这行代码engine.Use(Auth)///。。}

生成jwttoken

logic\open\authorizationlogic.go中实现jwttoken的获取

func(l*AuthorizationLogic)Authorization(reqtypes.UserOptReq)(*types.UserOptResp,error){//这个是生成jwttoken的工具类token,err:=utils.EncodeJwtToken(map[string]interface{}{"role":"kefu","id":"10086",})return&types.UserOptResp{Token:token,},err}

测试

不携带token时访问

>curlhttp://127.0.0.1:8888/user/update-XPOST-d"mobile=15367151352&id=123"鉴权失败,缺少鉴权参数

获取token

>curlhttp://127.0.0.1:8081/open/authorization-XPOST-d"mobile=15367151352&passwd=123rte&code=asasa"{"id":1599063149,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c"}

携带token时访问

>curlhttp://127.0.0.1:8888/user/update-XPOST-H"X-Token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c"-d"mobile=15367151352&id=123"#请求成功{"id":123,"token":""}

携带错误的token时访问

>curlhttp://127.0.0.1:8888/user/update-XPOST-H"X-Token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c0000"-d"mobile=15367151352&id=123"#返回签名无效signatureisinvalid

以上就是如何在go-zero中使用jwt-token鉴权实践,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。

发布于 2021-12-23 21:18:47
收藏
分享
海报
0 条评论
63
上一篇:TKE基于弹性网卡直连Pod的网络负载均衡是怎样的 下一篇:如何解析SpringCloud服务注册发现和服务消费
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码