如何在go

73次阅读
没有评论

共计 3194 个字符,预计需要花费 8 分钟才能阅读完成。

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

创建项目生成 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

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3194字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)