跳到主要内容

获取用户信息(jwt鉴权)

概要

本节将通过获取用户信息来演示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 {
Username string `json:"username"`
Mobile string `json:"mobile"`
Password string `json:"password"`
}

type LoginReq {
Username string `json:"username"`
Password string `json:"password"`
}

type UserReply {
Id int64 `json:"id"`
Username string `json:"username"`
Mobile string `json:"mobile"`
Nickname string `json:"nickname"`
Gender string `json:"gender"`
JwtToken
}

type JwtToken {
AccessToken string `json:"accessToken,omitempty"`
AccessExpire int64 `json:"accessExpire,omitempty"`
RefreshAfter int64 `json:"refreshAfter,omitempty"`
}

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
middleware: Usercheck
)
service user-api {
@handler userInfo
get /user/info () returns (UserReply)
}

重新生成代码

进入api(book/user/api)文件夹后执行

$ goctl api go -api user.api -dir .

NOTE: 多次重复生成代码会有些警告,直接回车即可 warning.png

最新代码结构如下

.
├── 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 route-user-info-jwt.png

验证jwt

我们先不加Authorization查看一下结果

$ curl -i -X GET \
http://127.0.0.1:8888/user/info \
-H 'cache-control: no-cache'

auth-disable.png

从途中可以看到,状态行中有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

auth.png