如何在go-zero中使用jwt-token鉴权实践
本篇文章给大家分享的是有关如何在go-zero中使用jwt-token鉴权实践,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创建项目
生成go.mod文件
以如下指令创建项目
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鉴权实践,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。