master
dugulingping 2023-12-15 11:42:25 +08:00
parent e12051f096
commit dc53fea5fb
1 changed files with 65 additions and 10 deletions

View File

@ -1,20 +1,75 @@
package middleware
import (
"github.com/golang-jwt/jwt/v5"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"strings"
)
type JWT struct {
Username string `json:"username"`
jwt.Claims
type Header struct {
Typ string `json:"typ"`
Alg string `json:"alg"`
}
func Hello() {
println("hello")
type Payload struct {
Sub string `json:"sub"`
Name string `json:"name"`
Iat int64 `json:"iat"`
}
// GenJWT 生成JWT
func GenJWT(username string)(string, error)
expTime := time.Now().Add(7 * 24 * time.Hour)
func base64Encode(src []byte) string {
return strings.TrimRight(base64.URLEncoding.EncodeToString(src), "=")
}
func createToken(sub, name string, iat int64) (string, error) {
header := Header{
Typ: "JWT",
Alg: "HS256",
}
payload := Payload{
Sub: sub,
Name: name,
Iat: iat,
}
headerJson, err := json.Marshal(header)
if err != nil {
return "", err
}
payloadJson, err := json.Marshal(payload)
if err != nil {
return "", err
}
encodedHeader := base64Encode(headerJson)
encodedPayload := base64Encode(payloadJson)
return fmt.Sprintf("%s.%s", encodedHeader, encodedPayload), nil
}
func signToken(token, secret string) (string, error) {
signature := hmac.New(sha256.New, []byte(secret))
_, err := signature.Write([]byte(token))
if err != nil {
return "", err
}
return base64Encode(signature.Sum(nil)), nil
}
func verifyToken(jwt, secret string) bool {
parts := strings.Split(jwt, ".")
if len(parts) != 3 {
return false
}
signature, err := signToken(fmt.Sprintf("%s.%s", parts[0], parts[1]), secret)
if err != nil {
return false
}
return signature == parts[2]
}