问题背景:网络鉴权在web开发中最常见不过了,最近在使用go kratos框架写项目的时候需要用到jwt,查阅资料后自己动手实现了简单的鉴权,在这里记录一下实现步骤,直接上代码。
- 定义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)
}
- 在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
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认证类似,此处不再赘述
通过以上简单步骤就可以在kratos框架中实现简单的jwt认证,web请求访问对应路由时,请求头应携带相应的token,否则会被拦截。
标签:kratos,jwt,认证,token,MySigningKey,func From: https://www.cnblogs.com/feel-myself/p/18148137