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生成和解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言求任意类型切片的长度操作

    go语言求任意类型切片的长度操作

    这篇文章主要介绍了go语言求任意类型切片的长度操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 使用go语言解析xml的实现方法(必看篇)

    使用go语言解析xml的实现方法(必看篇)

    下面小编就为大家带来一篇使用go语言解析xml的实现方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Golang日志库logrus的介绍与使用示例代码

    Golang日志库logrus的介绍与使用示例代码

    Logrus是Go语言的一个功能丰富的日志库,支持结构化日志和多级别日志记录,它兼容标准log库,并可通过自定义Hooks和Formatter进行高度定制化,支持集成如syslog等系统,便于管理和分析,Logrus还支持自定义日志颜色和格式,以及根据日志级别进行不同处理,如panic和exit
    2024-10-10
  • 在Go中使用jwt的教程详解

    在Go中使用jwt的教程详解

    JWT (JSON Web Tokens) 是一种基于 JSON 格式的轻量级身份验证和授权方案,用于在各方之间以JSON方式安全地传输信息,本文给大家详细介绍了在Go中使用jwt的教程,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • golang在GRPC中设置client的超时时间

    golang在GRPC中设置client的超时时间

    这篇文章主要介绍了golang在GRPC中设置client的超时时间,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang实现无锁队列的三种方式

    golang实现无锁队列的三种方式

    本文主要介绍了golang实现无锁队列的三种方式,包括基于CAS操作的简单有界队列、Michael-Scott算法的无锁链表队列及Go简化指针操作方法,感兴趣的可以了解一下
    2026-04-04
  • Go gRPC服务进阶middleware使用教程

    Go gRPC服务进阶middleware使用教程

    这篇文章主要为大家介绍了Go gRPC服务进阶middleware的使用教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • golang实现并发数控制的方法

    golang实现并发数控制的方法

    下面小编就为大家分享一篇golang实现并发数控制的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • golang的时区和神奇的time.Parse的使用方法

    golang的时区和神奇的time.Parse的使用方法

    这篇文章主要介绍了golang的时区和神奇的time.Parse的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 详解Go语言中for range的

    详解Go语言中for range的"坑"

    这篇文章主要介绍了详解Go语言中for range的"坑",文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论