概要

本节将通过获取用户信息来演示jwt鉴权怎么使用

定义获取用户信息路由

编辑user.api文件,增加获取用户信息路由

@handler userInfo
get /user/info () returns (UserReply)

开启jwt鉴权

由于之前的/user/ping/user/registeruser/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