概要
本节将通过获取用户信息来演示jwt鉴权怎么使用
定义获取用户信息路由
编辑user.api文件,增加获取用户信息路由
@handler userInfo get /user/info () returns (UserReply)
开启jwt鉴权
由于之前的/user/ping
、/user/register
、user/login
是不需要鉴权就可以直接访问,因此将需要鉴权的协议/user/info
单独放在一个service组中,并且对该service增加jwt
标志,内容如下
@server( jwt: Auth ) service user-api{ @handler userInfo get /user/info () returns (UserReply) }
完整的user.api内容如下
info( title: "user api" desc: "用户系统" author: "anqiansong" email: "anqiansong@xiaoheiban.cn" ) type RegisterReq struct { Username string `json:"username"` Mobile string `json:"mobile"` Password string `json:"password"` } type LoginReq struct { Username string `json:"username"` Password string `json:"password"` } type UserReply struct { Id int64 `json:"id"` Username string `json:"username"` Mobile string `json:"mobile"` Nickname string `json:"nickname"` Gender string `json:"gender"` JwtToken } type JwtToken struct { AccessToken string `json:"accessToken"` AccessExpire int64 `json:"accessExpire"` RefreshAfter int64 `json:"refreshAfter"` } service user-api { @handler ping post /user/ping () @handler register post /user/register (RegisterReq) @handler login post /user/login (LoginReq) returns (UserReply) } @server( jwt: Auth ) service user-api { @handler userInfo get /user/info () returns (UserReply) }
重新生成代码
进入api(~/book/user/api
)文件夹后执行
$ goctl api go -api user.api -dir .
NOTE: 多次重复生成代码会有些警告,直接回车即可
最新代码结构如下
. ├── go.mod ├── go.sum ├── shared │ └── baseerror.go └── user ├── api │ ├── etc │ │ └── user-api.yaml │ ├── internal │ │ ├── config │ │ │ └── config.go │ │ ├── handler │ │ │ ├── loginhandler.go │ │ │ ├── pinghandler.go │ │ │ ├── registerhandler.go │ │ │ ├── routes.go │ │ │ └── userinfohandler.go │ │ ├── logic │ │ │ ├── error.go │ │ │ ├── loginlogic.go │ │ │ ├── pinglogic.go │ │ │ ├── registerlogic.go │ │ │ └── userinfologic.go │ │ ├── svc │ │ │ └── servicecontext.go │ │ └── types │ │ └── types.go │ ├── user.api │ └── user.go ├── model │ ├── usermodel.go │ └── vars.go
我们来查看一下routes中已经对/user/info
路由已经进行了单独的分组,且带上了jwt鉴权option
验证jwt
我们先不加Authorization
查看一下结果
$ curl -i -X GET \ http://127.0.0.1:8888/user/info \ -H 'cache-control: no-cache'
从途中可以看到,状态行中有HTTP/1.1 401 Unauthorized
内容,很明显,未通过鉴权
接下来我们添加Authorization
再请求一下
curl -i -X GET \ http://127.0.0.1:8888/user/info \ -H 'authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDM2MzU0OTMsImlhdCI6MTYwMzU0OTA5M30.fGNe-sAEL6NuWDPWpfVi840qsamPA3fC9h4iO3rF9v0'
NOTE: 这里的authorization
需要替换为你当前获取到且未过期的accessToken,根据前一节登录时返回的accessToken