分享
  1. 首页
  2. 文章

golang微服务框架go-zero系列-2:在go-zero中使用jwt-token鉴权实践

非正式解决方案 · · 1002 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

阅读本文前你需要阅读

金光灿灿的Gorm V2+适合创业的golang微服务框架go-zero实战

创建项目

生成go.mod文件

以如下指令创建项目

mkdir jwttoken
cd jwttoken
go 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

本文代码获取

关注公众号betaidea 输入jwt即可获得
关注公众号betaidea 输入gozero即可gozero入门代码

广而告之

送福利了uniapp用户福音来啦!
历经数十万用户考验,我们的客服系统终于对外提供服务了。
你还在为商城接入客服烦恼吗?只需一行代码,即可接入啦!!
只需一行代码!!!!

/*kefu.vue*/
<template>
 <view>
 <IdeaKefu :siteid="siteId" ></IdeaKefu>
 </view>
</template>
<script>
 import IdeaKefu from "@/components/idea-kefu/idea-kefu.vue"
 export default {
 components:{
 IdeaKefu
 },
 data() {
 return {
 siteId:2
 }
 }
 } 

效果杠杠的


客服效果

开发文档地址
http://kefu.techidea8.com/html/wiki/


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:非正式解决方案

查看原文:golang微服务框架go-zero系列-2:在go-zero中使用jwt-token鉴权实践

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1002 次点击
1 回复 | 直到 2025年05月08日 07:58:22
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏