问题背景:网络鉴权在web开发中最常见不过了,最近在使用go kratos框架写项目的时候需要用到jwt,查阅资料后自己动手实现了简单的鉴权,在这里记录一下实现步骤,直接上代码。
- 定义jwt签发函数
这部分我是参考了李文周老师的博客
博客地址:https://www.liwenzhou.com/posts/Go/json-web-token/
| |
| var MySigningKey = []byte("mysecret") |
| |
| const TokenExpireDuration = time.Hour * 24 |
| |
| type CustomClaims struct { |
| |
| Username string `json:"username"` |
| jwt.RegisteredClaims |
| } |
| |
| |
| func GenRegisteredClaims(username string) (string, error) { |
| |
| claims := CustomClaims{ |
| username, |
| jwt.RegisteredClaims{ |
| ExpiresAt: jwt.NewNumericDate(time.Now().Add(TokenExpireDuration)), |
| Issuer: "my-project", |
| }, |
| } |
| |
| token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) |
| |
| return token.SignedString(MySigningKey) |
| } |
- 在kratos框架中完成token认证中间件
这部分是参考了kratos官方文档
参考地址:https://go-kratos.dev/docs/component/middleware/overview
| |
| options := []jwt.Option{ |
| jwt.WithClaims(func() jwtv4.Claims { |
| return &utils.CustomClaims{} |
| }), |
| } |
| |
| testKey := utils.MySigningKey |
| var opts = []http.ServerOption{ |
| http.Middleware( |
| recovery.Recovery(), |
| |
| |
| selector.Server( |
| |
| jwt.Server( |
| func(token *jwtv4.Token) (interface{}, error) { |
| return []byte(testKey), nil |
| }, options..., |
| )).Path("/helloworld.v1.Greeter/Pay").Build(), |
| ), |
| } |
| |
- 以上步骤成功实现了签发token和验证token,最后一部是把从token中解析的部分放到之后的请求上下文中
| |
| 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,否则会被拦截。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2023-04-20 highcharts 相关笔记
2023-04-20 vue3 引入外部js方式