go语言使用Token

Token

创建Token

token创建时需要:
1. 签发时间:IssuedAt
2. 结束时间:ExpiresAt
3. 签发人:Issuer
4. token所携带的登录人信息(也就是可以表明是谁登录的)
其中,IssuedAt、ExpiresAt、Issuer可以写在jwt.StandardClaims中:

registeredClaims := jwt.RegisteredClaims{
		ExpiresAt: expireTime.Unix(),
		IssuedAt:  time.Now().Unix(),
		Issuer:    "app",
	}

之后加入登录人信息获得自定义Claims:

claims := UserClaims{
		RegisteredClaims: registeredClaims,
		UserName:         name,
	}

利用jwt.NewWithClaims(method SigningMethod, claims Claims) 函数获取Token类型的Token
其中SigningMethod为签名算法,jwt内置了许多算法,这里用的是jwt.SigningMethodHS256
claims参数为携带用户信息的自定义Claims

Token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

我们应向前端返回一个string类型的token,所以需要用SignedString方法签发

token, err := Token.SignedString(JwtKey)

其中JwtKey为我们自定义的一个btye切片,返回的token为string类型,我们将其发送到前端

	c.JSON(http.StatusOK, gin.H{
		"state":   code,
		"message": errmsg.GetErrMsg(code),
		"token":   token,
	})

解析Token

后端接收来自前端的token字符串:tokenString,在判空后使用ParseWithClaims将其解析为Token类型的token

token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
		return JwtKey, nil
	})

其中:
1. tokenString为string类型的token
2. &UserClaims{}为包含用户信息的自定义Claims
3. Keyfunc是一个返回值为
JwtKey
error的函数
获取到Token类型的token后,断言token的claims为自定义的userclaims,并获取claims所携带的用户信息

if claims, ok := token.Claims.(*UserClaims); ok && token.Valid {
		username = claims.UserName
		err = nil
	} else {
		username = ""
		err = errors.New("claims not UserClaims")
	}

JWT中间件

jwt中间件主要功能为接收前端发送来的验证信息(Token)并将其中的用户信息解析出来,但在此项目中集成了用户的权限验证
token从前端以string的形式在请求头中传入后端,它对应的Key为Authorization(批准),在Authorization对应的值中Token是以 Bearer字符 + 空格 + Token 的格式储存的
首先让我们接收请求头的信息

// 获取验证信息(Token)
		Authorization := c.Request.Header.Get("Authorization")
		// 请求头是否有token
		if Authorization == "" {
			code = errmsg.INEXISTENCE_TOKEN
			c.JSON(http.StatusOK, gin.H{
				"state":   code,
				"message": errmsg.GetErrMsg(code),
			})
			c.Abort()
			return
		}

接收到请求头信息后我们验证是否为Token的格式(Bearer字符 + 空格 + Token )
由于其格式特殊,我们用字符串的 第一个空格将信息分为两段,前一段应为"Bearer",而后一段则为我们需要的Token字符串。
注:若信息不能以空格分为两端或者前一段不为"Bearer"则格式错误

// 检查token格式
		Authorizations := strings.SplitN(Authorization, " ", 2)
		if Authorizations[0] != "Bearer" || len(Authorizations) < 2 {
			code = errmsg.TOKEN_TYPE_ERROR
			c.JSON(http.StatusOK, gin.H{
				"state":   code,
				"message": errmsg.GetErrMsg(code),
			})
			c.Abort()
			return
		}

获得string类型的Token后我们将其解析并获得用户信息,再用用户信息查询用户权限,最后检查用户权限是否充足

// 解析token
		userName, err := JwtParseUser(Authorizations[1])
		if err != nil {
			code = errmsg.TOKEN_PARSE_ERROR
			c.JSON(http.StatusOK, gin.H{
				"state":   code,
				"message": errmsg.GetErrMsg(code),
			})
			c.Abort()
			return
		}
		// 验证权限
		ok := dao.ExamineRole(userName, role)
		if !ok {
			code = errmsg.INSUFFICIENT_ROLE
			c.JSON(http.StatusOK, gin.H{
				"state":   code,
				"message": errmsg.GetErrMsg(code),
			})
			c.Abort()
			return
		}
		// 设置用户信息
		c.Set("userName", userName)
		c.Next()

essage": errmsg.GetErrMsg(code),
})
c.Abort()
return
}
// 设置用户信息
c.Set(“userName”, userName)
c.Next()

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Go语言中处理token有以下几种方法: 1. 使用strings包的Split()函数来将字符串按照指定的分隔符分割成多个子串,得到一个字符串切片,每个元素代表一个token。 例如,以下代码将字符串按照空格分割成多个单词: ``` package main import ( "fmt" "strings" ) func main() { str := "Hello world Go" tokens := strings.Split(str, " ") for _, token := range tokens { fmt.Println(token) } } ``` 输出: ``` Hello world Go ``` 2. 使用bufio包的Scanner类型,可以逐个读取输入流中的token。Scanner会将输入流按照默认的分隔符(空格、换行、制表符等)分割成多个token。 例如,以下代码从标准输入读取多个单词,直到遇到EOF: ``` package main import ( "bufio" "fmt" "os" ) func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { token := scanner.Text() fmt.Println(token) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading input:", err) } } ``` 3. 使用正则表达式库regexp包来匹配字符串中的token。可以定义一个正则表达式来匹配token的格式,然后用FindAllString()函数找出所有匹配的字符串。 例如,以下代码使用正则表达式匹配所有的数字: ``` package main import ( "fmt" "regexp" ) func main() { str := "123 abc 456 def 789" re := regexp.MustCompile(`\d+`) tokens := re.FindAllString(str, -1) for _, token := range tokens { fmt.Println(token) } } ``` 输出: ``` 123 456 789 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值