gozero使用jwt
两个步骤
- 获取token
- 验证token
前端获取token
先编写 jwt.api 文件,放在api目录下
 
syntax = "v1"
info (
	title:   "type title here"
	desc:    "type desc here"
	author:  "type author here"
	email:   "type email here"
	version: "type version here"
)
type JwtTokenRequest {}
type JwtTokenResponse {
	AccessToken  string `json:"access_token"`
	AccessExpire int64  `json:"access_expire"`
	RefreshAfter int64  `json:"refresh_after"` // 建议客户端刷新token的绝对时间
}
type GetUserRequest {
	UserId string `json:"userId"`
}
type GetUserResponse {
	Name string `json:"name"`
}
service jwt-api {
	@handler JwtHandler
	post /user/token (JwtTokenRequest) returns (JwtTokenResponse)
}
@server (
	jwt: JwtAuth
)
service jwt-api {
	@handler JwtHandlers
	post /user/info (GetUserRequest) returns (GetUserResponse)
}
在api目录下执行
goctl api go -api jwt.api -dir ../
生成如下文件
 
 jwt-api.yaml 文件添加参数 JwtAuth
Name: jwt-api
Host: 0.0.0.0
Port: 8001
JwtAuth:
  AccessSecret: af5fsdf5a1sd5ga5sd1g
  AccessExpire: 86400
在zero-jwt目录下执行mod命令
go mod tidy
获取token代码🌰
package logic
import (
	"context"
	"github.com/golang-jwt/jwt"
	"time"
	"zero-jwt/internal/svc"
	"zero-jwt/internal/types"
	"github.com/zeromicro/go-zero/core/logx"
)
type JwtLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}
func NewJwtLogic(ctx context.Context, svcCtx *svc.ServiceContext) *JwtLogic {
	return &JwtLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}
func (l *JwtLogic) Jwt(req *types.JwtTokenRequest) (resp *types.JwtTokenResponse, err error) {
	// todo: add your logic here and delete this line
	var accessExpire = l.svcCtx.Config.JwtAuth.AccessExpire
	now := time.Now().Unix()
	accessToken, err := l.GenToken(now, l.svcCtx.Config.JwtAuth.AccessSecret, map[string]interface{}{"uid": 1, "username": "hahah"}, accessExpire)
	if err != nil {
		return nil, err
	}
	return &types.JwtTokenResponse{
		AccessToken:  accessToken,
		AccessExpire: now + accessExpire,
		RefreshAfter: now + accessExpire/2,
	}, nil
}
func (l *JwtLogic) GenToken(iat int64, secretKey string, payloads map[string]interface{}, seconds int64) (string, error) {
	claims := make(jwt.MapClaims)
	claims["exp"] = iat + seconds
	claims["iat"] = iat
	for k, v := range payloads {
		claims[k] = v
	}
	token := jwt.New(jwt.SigningMethodHS256)
	token.Claims = claims
	return token.SignedString([]byte(secretKey))
}
验证获取token里的数据🌰
package logic
import (
	"context"
	"encoding/json"
	"log"
	"zero-jwt/internal/svc"
	"zero-jwt/internal/types"
	"github.com/zeromicro/go-zero/core/logx"
)
type JwtHandlersLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}
func NewJwtHandlersLogic(ctx context.Context, svcCtx *svc.ServiceContext) *JwtHandlersLogic {
	return &JwtHandlersLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}
func (l *JwtHandlersLogic) JwtHandlers(req *types.GetUserRequest) (resp *types.GetUserResponse, err error) {
	//获取token里的数据
	log.Println(l.ctx.Value("username").(string)) //这里使用(json.Number)强转会报错,username是{}interface 类型
	log.Println(l.ctx.Value("uid").(json.Number).Int64())
	return &types.GetUserResponse{Name: "kkkkk" + req.UserId + " " + l.ctx.Value("uid").(json.Number).String() + " " + l.ctx.Value("username").(string)}, nil
}
验证token
发送请求获取token
 
 发送请求验证token
 Headers 头部添加 Authorization参数
 
 验证不通过就会报401错误



















