在go-zero中使用jwt

gozero使用jwt

两个步骤

  1. 获取token
  2. 验证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错误

相关推荐

  1. go-zero 如何任意地方获取yaml的值

    2024-05-14 05:28:04       33 阅读
  2. go-zero

    2024-05-14 05:28:04       39 阅读
  3. gin使用JWT

    2024-05-14 05:28:04       36 阅读
  4. 如何Go使用泛型

    2024-05-14 05:28:04       39 阅读
  5. 如何Go使用模板

    2024-05-14 05:28:04       32 阅读
  6. Go语言如何使用变量

    2024-05-14 05:28:04       5 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-14 05:28:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-14 05:28:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-14 05:28:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-14 05:28:04       18 阅读

热门阅读

  1. Docker安装oralce

    2024-05-14 05:28:04       12 阅读
  2. GitLab CI/CD的原理及应用详解(五)

    2024-05-14 05:28:04       13 阅读
  3. 构建树父类

    2024-05-14 05:28:04       15 阅读
  4. 【无标题】

    2024-05-14 05:28:04       14 阅读
  5. Rust语言中带标签的`break`用法

    2024-05-14 05:28:04       13 阅读
  6. 【C】每日一题 53 最大子数组和

    2024-05-14 05:28:04       9 阅读
  7. Excel中的`MMULT`函数

    2024-05-14 05:28:04       10 阅读
  8. Spring事务深度解析

    2024-05-14 05:28:04       12 阅读