hz
生成代码JWT
扩展完成登陆认证和授权访问Gorm
访问 MySQL
数据库git clone https://github.com/cloudwego/hertz-examples.git cd bizdemo/hertz_jwt
hertz_jwt ├── Makefile # 使用 hz 命令行工具生成 hertz 脚手架代码 ├── biz │ ├── dal │ │ ├── init.go │ │ └── mysql │ │ ├── init.go # 初始化数据库连接 │ │ └── user.go # 数据库操作 │ ├── handler │ │ ├── ping.go │ │ └── register.go # 用户注册 handler │ ├── model │ │ ├── sql │ │ │ └── user.sql │ │ └── user.go # 定义数据库模型 │ ├── mw │ │ └── jwt.go # 初始化 hertz-jwt 中间件 │ ├── router │ │ └── register.go │ └── utils │ └── md5.go # md5 加密 ├── docker-compose.yml # mysql 容器环境支持 ├── go.mod ├── go.sum ├── main.go # hertz 服务入口 ├── readme.md ├── router.go # 路由注册 └── router_gen.go
下方是这个 demo 的接口列表。
// customizeRegister registers customize routers. func customizedRegister(r *server.Hertz) { r.POST("/register", handler.Register) r.POST("/login", mw.JwtMiddleware.LoginHandler) auth := r.Group("/auth", mw.JwtMiddleware.MiddlewareFunc()) auth.GET("/ping", handler.Ping) }
对应 /register
接口,当前 demo 的用户数据通过 gorm 操作 mysql 完成持久化,因此在登陆之前,需要对用户进行注册,注册流程为:
服务器需要在用户第一次登陆的时候,验证用户账号和密码,并签发 jwt token。
JwtMiddleware, err = jwt.New(&jwt.HertzJWTMiddleware{ Key: []byte("secret key"), Timeout: time.Hour, MaxRefresh: time.Hour, Authenticator: func(ctx context.Context, c *app.RequestContext) (interface{}, error) { var loginStruct struct { Account string `form:"account" json:"account" query:"account" vd:"(len($) > 0 && len($) < 30); msg:'Illegal format'"` Password string `form:"password" json:"password" query:"password" vd:"(len($) > 0 && len($) < 30); msg:'Illegal format'"` } if err := c.BindAndValidate(&loginStruct); err != nil { return nil, err } users, err := mysql.CheckUser(loginStruct.Account, utils2.MD5(loginStruct.Password)) if err != nil { return nil, err } if len(users) == 0 { return nil, errors.New("user already exists or wrong password") } return users[0], nil }, PayloadFunc: func(data interface{}) jwt.MapClaims { if v, ok := data.(*model.User); ok { return jwt.MapClaims{ jwt.IdentityKey: v, } } return jwt.MapClaims{} }, })
loginStruct
结构接收用户登陆信息,并进行认证有效性。这个函数的返回值 users[0]
将为后续生成 jwt token 提供 payload 数据源。Authenticator
的返回值,此时负责解析 users[0]
,并将用户名注入 token 的 payload 部分。"secret key"
。TokenTime
+ MaxRefresh
内刷新 token 的有效时间,追加一个 Timeout
的时长。JwtMiddleware, err = jwt.New(&jwt.HertzJWTMiddleware{ LoginResponse: func(ctx context.Context, c *app.RequestContext, code int, token string, expire time.Time) { c.JSON(http.StatusOK, utils.H{ "code": code, "token": token, "expire": expire.Format(time.RFC3339), "message": "success", }) }, })
LoginHandler
是强绑定的。访问配置了 jwt 中间件的路由时,会经过 jwt token 的校验流程。
标签:数据库,站点,文件,架构,数据,服务器,创建,结束,设置 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。