golang简单高效的JWT生成与解析插件库sjwt的使用

Golang简单高效的JWT生成与解析插件库sjwt的使用

sjwt logo

Simple JSON Web Token - 使用HMAC SHA-256算法

sjwt是一个用于Go应用程序中处理JSON Web Tokens的极简高效工具。它提供了简单直接的方法来集成JWT进行认证和安全验证,设计上易于使用。

特性

  • Go的简易JWT实现:以最小努力在Go中实现JWT
  • 安全且简单:可靠的安全特性,易于集成
  • 开源:MIT许可证,欢迎社区贡献

安装

go get -u github.com/brianvoe/sjwt

示例

基本使用

// 设置声明
claims := sjwt.New()
claims.Set("username", "billymister")
claims.Set("account_id", 8675309)

// 生成jwt
secretKey := []byte("secret_key_here")
jwt := claims.Generate(secretKey)

解析JWT

// 解析jwt
jwt := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
claims, _ := sjwt.Parse(jwt)

// 获取声明
name, err := claims.GetStr("name") // John Doe

验证和校验

jwt := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
secretKey := []byte("secret_key_here")

// 验证密钥签名是否有效
hasVerified := sjwt.Verify(jwt, secretKey)

// 解析jwt
claims, _ := sjwt.Parse(jwt)

// 校验将检查(如果设置了)过期时间和生效时间
err := claims.Validate()

注册声明的使用

// 设置声明
claims := sjwt.New()
claims.SetTokenID()                                  // 生成UUID
claims.SetSubject("Subject Title")                   // token的主题
claims.SetIssuer("Google")                           // token的签发者
claims.SetAudience([]string{"Google", "Facebook"})   // token的目标受众
claims.SetIssuedAt(time.Now())                       // 签发时间,值设置为unix时间戳
claims.SetNotBeforeAt(time.Now().Add(time.Hour * 1)) // token在1小时后生效
claims.SetExpiresAt(time.Now().Add(time.Hour * 24))  // token在24小时后过期

// 生成jwt
secretKey := []byte("secret_key_here")
jwt := claims.Generate(secretKey)

结构体转为声明

type Info struct {
    Name string `json:"name"`
}

// 将结构体marshal为声明
info := Info{Name: "Billy Mister"}
claims, _ := sjwt.ToClaims(info)

// 生成jwt
secretKey := []byte("secret_key_here")
jwt := claims.Generate(secretKey)

为什么选择sjwt?

在我需要使用jwt的所有时候,通常只需要简单的HMAC SHA-256算法,这也是大多数jwt token的使用场景。


更多关于golang简单高效的JWT生成与解析插件库sjwt的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单高效的JWT生成与解析插件库sjwt的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang JWT生成与解析库sjwt使用指南

sjwt是一个简单高效的Golang JWT(JSON Web Token)库,它提供了简洁的API来生成和解析JWT令牌。下面我将详细介绍如何使用这个库。

安装

首先安装sjwt库:

go get github.com/ssleert/sjwt

基本用法

1. 生成JWT令牌

package main

import (
	"fmt"
	"time"
	
	"github.com/ssleert/sjwt"
)

func main() {
	// 设置密钥
	secret := "your-secret-key"

	// 创建claims
	claims := sjwt.New()
	claims.Set("username", "john_doe")
	claims.Set("role", "admin")
	claims.SetExpiresAt(time.Now().Add(24 * time.Hour)) // 24小时后过期

	// 生成JWT
	token, err := claims.Generate(secret)
	if err != nil {
		fmt.Println("生成JWT失败:", err)
		return
	}

	fmt.Println("生成的JWT:", token)
}

2. 解析和验证JWT

package main

import (
	"fmt"
	
	"github.com/ssleert/sjwt"
)

func main() {
	secret := "your-secret-key"
	token := "your.jwt.token.here"

	// 解析并验证JWT
	claims, err := sjwt.Parse(token, secret)
	if err != nil {
		fmt.Println("JWT验证失败:", err)
		return
	}

	// 获取claims中的值
	username, _ := claims.GetStr("username")
	role, _ := claims.GetStr("role")
	
	fmt.Printf("用户名: %s, 角色: %s\n", username, role)
	
	// 检查token是否过期
	if claims.IsExpired() {
		fmt.Println("Token已过期")
	} else {
		fmt.Println("Token有效")
	}
}

高级功能

1. 自定义Claims

type UserClaims struct {
	Username string `json:"username"`
	Role     string `json:"role"`
	Email    string `json:"email"`
}

func main() {
	secret := "your-secret-key"
	
	user := UserClaims{
		Username: "john_doe",
		Role:     "admin",
		Email:    "john@example.com",
	}

	claims := sjwt.New()
	claims.Set("user", user)
	claims.SetExpiresAt(time.Now().Add(12 * time.Hour))

	token, err := claims.Generate(secret)
	if err != nil {
		fmt.Println("生成JWT失败:", err)
		return
	}

	fmt.Println("生成的JWT:", token)
}

2. 从JWT解析回结构体

func main() {
	secret := "your-secret-key"
	token := "your.jwt.token.here"

	claims, err := sjwt.Parse(token, secret)
	if err != nil {
		fmt.Println("JWT验证失败:", err)
		return
	}

	var user UserClaims
	if err := claims.GetTo("user", &user); err != nil {
		fmt.Println("解析用户信息失败:", err)
		return
	}

	fmt.Printf("用户信息: %+v\n", user)
}

3. 设置签发时间和其他标准Claims

func main() {
	secret := "your-secret-key"

	claims := sjwt.New()
	claims.SetIssuer("my-app")                    // 签发者
	claims.SetSubject("user-auth")                // 主题
	claims.SetAudience([]string{"web", "mobile"}) // 受众
	claims.SetIssuedAt(time.Now())                // 签发时间
	claims.SetNotBefore(time.Now())               // 生效时间
	claims.SetExpiresAt(time.Now().Add(24 * time.Hour)) // 过期时间
	claims.Set("username", "john_doe")

	token, err := claims.Generate(secret)
	if err != nil {
		fmt.Println("生成JWT失败:", err)
		return
	}

	fmt.Println("生成的JWT:", token)
}

性能考虑

sjwt在设计上注重性能:

  1. 使用高效的JSON编解码
  2. 最小化内存分配
  3. 优化的签名算法实现

安全建议

  1. 使用足够强的密钥(至少32字节)
  2. 设置合理的过期时间
  3. 不要在客户端存储敏感信息
  4. 使用HTTPS传输JWT
// 生成强密钥示例
import "crypto/rand"

func generateStrongSecret() string {
	b := make([]byte, 32)
	if _, err := rand.Read(b); err != nil {
		panic(err)
	}
	return string(b)
}

总结

sjwt提供了简单直观的API来处理JWT的生成和验证,适合大多数Golang项目。它的轻量级设计和良好的性能使其成为处理身份验证和授权需求的优秀选择。

回到顶部