获取用户信息(JWT鉴权).md 5.0 KB

获取用户信息(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