使用kratos框架集成jwt认证

问题背景:网络鉴权在web开发中最常见不过了,最近在使用go kratos框架写项目的时候需要用到jwt,查阅资料后自己动手实现了简单的鉴权,在这里记录一下实现步骤,直接上代码。

  1. 定义jwt签发函数
    这部分我是参考了李文周老师的博客
    博客地址:https://www.liwenzhou.com/posts/Go/json-web-token/
// MySigningKey 用于签名的字符串
var MySigningKey = []byte("mysecret")
const TokenExpireDuration = time.Hour * 24
type CustomClaims struct {
// 可根据需要自行添加字段
Username string `json:"username"`
jwt.RegisteredClaims // 内嵌标准的声明
}
// GenRegisteredClaims 使用默认声明创建jwt
func GenRegisteredClaims(username string) (string, error) {
// 创建 Claims
claims := CustomClaims{
username,
jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(TokenExpireDuration)),
Issuer: "my-project",
},
}
// 生成token对象
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
// 生成签名字符串
return token.SignedString(MySigningKey)
}
  1. 在kratos框架中完成token认证中间件
    这部分是参考了kratos官方文档
    参考地址:https://go-kratos.dev/docs/component/middleware/overview
// server/http.go
options := []jwt.Option{
jwt.WithClaims(func() jwtv4.Claims {
return &utils.CustomClaims{}
}),
}
testKey := utils.MySigningKey
var opts = []http.ServerOption{
http.Middleware(
recovery.Recovery(),
// 选择器中间件,只对支付接口生效
selector.Server(
// 认证中间件,传入func和options
jwt.Server(
func(token *jwtv4.Token) (interface{}, error) {
return []byte(testKey), nil
}, options...,
)).Path("/helloworld.v1.Greeter/Pay").Build(),
),
}
// grpc部分与http认证类似,此处不再赘述
  1. 以上步骤成功实现了签发token和验证token,最后一部是把从token中解析的部分放到之后的请求上下文中
// 其实这一部分通过看源码就可以知道,框架已经帮我们处理好了,我们要做的就只是从context中把claim拿出来,通过断言判断类型就可以了。以下只是简单实现
claimsInterface, ok := jwt.FromContext(ctx)
if !ok {
return &v1.PayReply{Message: "no ", OrderId: in.OrderId}, nil
}
claims, ok := claimsInterface.(*utils.CustomClaims)
fmt.Println(claims)
if !ok {
return &v1.PayReply{Message: "no ", OrderId: in.OrderId}, nil
}
if claims.Username == "admin" {
return &v1.PayReply{Message: claims.Username, OrderId: in.OrderId}, nil
}
return &v1.PayReply{Message: "no ", OrderId: in.OrderId}, nil

通过以上简单步骤就可以在kratos框架中实现简单的jwt认证,web请求访问对应路由时,请求头应携带相应的token,否则会被拦截。

posted on   朝朝暮Mu  阅读(313)  评论(1编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2023-04-20 highcharts 相关笔记
2023-04-20 vue3 引入外部js方式
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示