共计 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 行业资讯频道。