Go中使用JWT
原文链接:https://blog.csdn.net/m0_58121644/article/details/129643351
JWT (JSON Web Tokens) 是一种基于 JSON 格式的轻量级身份验证和授权方案。在 Go 项目中使用 JWT,一般需要完成以下步骤:
1. 安装 JWT 库
在 Go 项目中使用 JWT 需要先安装 JWT 库,可以使用以下命令安装:
go get -u github.com/golang-jwt/jwt/v5
将其导入代码中:
import "github.com/golang-jwt/jwt/v5"
2. 创建 JWT
在 Go 项目中,可以使用 JWT 库的 jwt.NewWithClaims()
方法创建 JWT。例如:
// CustomClaims 自定义声明类型 并内嵌jwt.RegisteredClaims // jwt包自带的jwt.RegisteredClaims只包含了官方字段 // 假设我们这里需要额外记录一个username字段,所以要自定义结构体 // 如果想要保存更多信息,都可以添加到这个结构体中 type CustomClaims struct { // 可根据需要自行添加字段 UserID int64 `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims // 内嵌标准的声明 } // GenToken 生成JWT func GenToken(userId int64, username string) (string, error) { // 创建一个我们自己声明的数据 claims := CustomClaims{ userId, username, // 自定义字段 jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)), // 定义过期时间 Issuer: "somebody", // 签发人 }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 生成签名字符串 return token.SignedString([]byte("secret-key")) }
在上面的例子中,使用 jwt.MapClaims
定义了需要存储在 JWT 中的数据,使用 jwt.NewWithClaims()
方法创建了 JWT,然后使用 SignedString()
方法生成了签名字符串。
3. 验证 JWT
在 Go 项目中,可以使用 JWT 库的 jwt.Parse()
方法验证 JWT。例如:
import ( "github.com/golang-jwt/jwt/v5" ) func ParseToken(tokenString string) (*CustomClaims, error) { // 解析token var mc = new(CustomClaims) token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) { return CustomSecret, nil }) if err != nil { return nil, err } // 对token对象中的Claim进行类型断言 if token.Valid { // 校验token return mc, nil } return nil, errors.New("invalid token") }
在上面的例子中,使用 jwt.Parse()
方法解析 JWT,并在回调函数中检查签名算法和返回签名字符串。然后检查 token 是否有效,并从中提取出需要的数据。
以上就是在 Go 项目中使用 JWT 的基本步骤。需要注意的是,在实际应用中,需要更加严格地设置 JWT 的有效期、密钥等参数,以确保安全性。
4. 在项目中的使用
一般地,我们使用token进行鉴权的时候,使用gin中的中间件来对许多需要鉴权的请求进行判断,中间件的具体内容:
func JWTAuthMiddleware() func(c *gin.Context) { return func(c *gin.Context) { //获取到请求头中的token authHeader := c.Request.Header.Get("Authorization") if authHeader == "" { c.JSON(http.StatusOK, &model.ResponseData{ Code: 200, Msg: "访问失败,请登录!", Data: nil, }) c.Abort() return } // 按空格分割 parts := strings.SplitN(authHeader, " ", 2) if !(len(parts) == 2 && parts[0] == "Bearer") { c.JSON(http.StatusOK, &model.ResponseData{ Code: 200, Msg: "访问失败,无效的token,请登录!", Data: nil, }) c.Abort() return } // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 mc, err := util.ParseToken(parts[1]) if err != nil { c.JSON(http.StatusOK, &model.ResponseData{ Code: 200, Msg: "访问失败,无效的token,请登录!", Data: nil, }) c.Abort() return } // 将当前请求的userID信息保存到请求的上下文c上 c.Set("userID", mc.UserID) c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息 } }
本文作者:喵喵队立大功
本文链接:https://www.cnblogs.com/oaoa/p/17337561.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-04-20 手写bind方法
2021-04-20 JS函数节流
2021-04-20 206、反转链表 | JS
2021-04-20 数组去重