Golang token的生成和解析详解

 更新时间:2024年02月11日 10:18:58   作者:gogogo不想敲代码  
这篇文章主要给大家介绍了Golang token的生成和解析,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

Golang token的生成和解析

使用第三方库来实现

go get github.com/dgrijalva/jwt-go

golang代码

package main

import (
	"fmt"
	"time"

	"github.com/dgrijalva/jwt-go"
)

func main() {
	// 生成Token
	tokenString := generateToken("example-user", "secret-key")
	fmt.Println("Token:", tokenString)

	// 解密Token
	claims, err := parseToken(tokenString, "secret-key")
	if err != nil {
		fmt.Println("解密Token失败:", err)
		return
	}

	// 获取Token中的自定义声明
	if username, ok := claims["username"].(string); ok {
		fmt.Println("Username:", username)
	}
}

func generateToken(username string, secretKey string) string {
	// 创建一个Token对象
	token := jwt.New(jwt.SigningMethodHS256)

	// 设置Token的自定义声明
	claims := token.Claims.(jwt.MapClaims)
	claims["username"] = username
	claims["exp"] = time.Now().Add(time.Hour * 24).Unix() // 设置Token的过期时间

	// 使用密钥对Token进行签名,生成最终的Token字符串
	tokenString, _ := token.SignedString([]byte(secretKey))

	return tokenString
}

func parseToken(tokenString string, secretKey string) (jwt.MapClaims, error) {
	// 解析Token字符串
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		return []byte(secretKey), nil
	})

	if err != nil {
		return nil, err
	}

	// 验证Token的签名方法是否有效
	if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
		return nil, fmt.Errorf("无效的签名方法:%v", token.Header["alg"])
	}

	// 返回Token中的声明部分
	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		return claims, nil
	}

	return nil, fmt.Errorf("无效的Token")
}

消息中间件

func JWT() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Abort()
		c.Next()
	}
}

到此这篇关于Golang token的生成和解析详解的文章就介绍到这了,更多相关Golang token生成和解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang二进制反汇编问题

    Golang二进制反汇编问题

    这篇文章主要介绍了Golang二进制反汇编问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Golang 依赖注入经典解决方案uber/fx理论解析

    Golang 依赖注入经典解决方案uber/fx理论解析

    这篇文章主要为大家介绍了Golang依赖注入经典解决方案uber/fx理论解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go 中闭包的底层原理

    Go 中闭包的底层原理

    这篇文章主要介绍了Go 中闭包的底层原理,闭包的基本原理是一种现象,一个函数内引用了外部的局部变量的现象,带着些许的了解和小编一起进入文章正题学习
    2021-10-10
  • 深入探讨Go语言中的预防性接口为什么是不必要的

    深入探讨Go语言中的预防性接口为什么是不必要的

    在Go语言中,有一种从其他语言带来的常见模式:预防性接口,虽然这种模式在 Java 等语言中很有价值,但在Go中往往会成为反模式,本文我们就来深入探讨一下原因
    2025-01-01
  • OpenTelemetry-go的SDK使用方法详解

    OpenTelemetry-go的SDK使用方法详解

    这篇文章主要介绍了OpenTelemetry-go的SDK使用方法,OpenTelemetry帮我们实现了相应语言的SDK,所以我们只需要进行调用即可,本文根据官方文档实例讲解,需要的朋友可以参考下
    2022-09-09
  • 探索Go语言中的switch高级用法

    探索Go语言中的switch高级用法

    在Go语言中,switch语句除了常见的用法外,还有一种不常用但有趣的写法,这种写法中,switch后面不跟任何表达式,而每个case后面跟的是返回bool类型的函数调用表达式,这实际上是一个等价于switch true的用法,通过从上到下逐一比较case后的表达式是否为true来决定执行哪个分支
    2024-10-10
  • Golang通道的无阻塞读写的方法示例

    Golang通道的无阻塞读写的方法示例

    这篇文章主要介绍了Golang通道的无阻塞读写的方法示例,详细的介绍了哪些情况会存在阻塞,以及如何使用select解决阻塞,非常具有实用价值,需要的朋友可以参考下
    2018-11-11
  • GoLang中socket心跳检测的实现

    GoLang中socket心跳检测的实现

    本文主要介绍了GoLang中socket心跳检测的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Golang收支记账程序详细编写过程

    Golang收支记账程序详细编写过程

    这篇文章主要介绍了Golang实现收支记账程序流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • 一文理解Go 中的可寻址和不可寻址

    一文理解Go 中的可寻址和不可寻址

    如果字典的元素不存在,则返回零值,而零值是不可变对象,如果能寻址问题就大了。而如果字典的元素存在,考虑到 Go 中 map 实现中元素的地址是变化的,这意味着寻址的结果也是无意义的。下面我们就围绕这个话题写一篇文章吧,需要的朋友可以参考一下
    2021-10-10

最新评论