Skip to content

v1.2.8

Choose a tag to compare

@Fromsko Fromsko released this 25 Jan 16:35
· 6 commits to main since this release
604c53f
package auth

import (
	"crypto/sha256"
	"encoding/hex"
	"errors"
	"fmt"
	"time"

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

type SubscriberAuth struct {
	Token      string        // Token
	Expiration time.Duration // 过期时间
	SecretKey  string        // 密钥
}

// GenToken 生成JWT token
func (sa *SubscriberAuth) GenToken(role, username string) (token string, err error) {
	// 创建一个新的令牌对象
	tk := jwt.New(jwt.SigningMethodHS256)

	// 设置令牌的claims
	claims := tk.Claims.(jwt.MapClaims)
	claims["username"] = username
	claims["role"] = role
	claims["exp"] = time.Now().Add(sa.Expiration).Unix()

	// 生成令牌
	token, err = tk.SignedString([]byte(sa.SecretKey))
	if err != nil {
		return "", err
	} else {
		sa.Token = token
	}
	return token, nil
}

// ValidateToken 验证和检查是否过期
func (sa *SubscriberAuth) ValidateToken(tokenString string) (bool, error) {
	// 解析令牌
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(sa.SecretKey), nil
	})

	if err != nil {
		return false, fmt.Errorf("token validation error: %v", err)
	}

	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		expirationTime := time.Unix(int64(claims["exp"].(float64)), 0)
		if time.Now().UTC().After(expirationTime) {
			return false, errors.New("token has expired")
		}
		fmt.Println("过期时间: ", expirationTime)
		return true, nil
	}

	return false, errors.New("invalid access token")
}

// GenUUID 生成UUID
func GenUUID(username string) string {
	ns := uuid.NameSpaceDNS
	userUUID := uuid.NewSHA1(ns, []byte(username))
	return userUUID.String()
}

// HashString 对内容进行 sha256
func HashString(input string) string {
	hasher := sha256.New()
	hasher.Write([]byte(input))
	hashedBytes := hasher.Sum(nil)
	hashedString := hex.EncodeToString(hashedBytes)
	return hashedString
}