HomeNav/middleware/JWT.go

99 lines
1.9 KiB
Go
Raw Normal View History

2023-12-13 17:47:35 +08:00
package middleware
2023-12-15 00:47:09 +08:00
import (
2023-12-15 11:42:25 +08:00
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"strings"
2023-12-15 00:47:09 +08:00
)
2023-12-15 11:42:25 +08:00
type Header struct {
Typ string `json:"typ"`
Alg string `json:"alg"`
}
type Payload struct {
Sub string `json:"sub"`
Name string `json:"name"`
Iat int64 `json:"iat"`
}
2023-12-15 00:47:09 +08:00
2023-12-15 11:42:25 +08:00
func base64Encode(src []byte) string {
return strings.TrimRight(base64.URLEncoding.EncodeToString(src), "=")
2023-12-15 00:47:09 +08:00
}
2023-12-15 11:42:25 +08:00
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
2023-12-15 00:47:09 +08:00
}
2023-12-15 11:42:25 +08:00
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]
2023-12-15 00:47:09 +08:00
}
2023-12-15 14:43:28 +08:00
//func main() {
// secret := "1234567890"
// // 当前时间戳
// now := time.Now().Add(5 * time.Minute).Unix()
// tokenWithoutSign, err := createToken("1234567890", "zhangsan", now)
// if err != nil {
// fmt.Println(err)
// return
// }
//
// sign, err := signToken(tokenWithoutSign, secret)
// if err != nil {
// fmt.Println(err)
// return
// }
//
// jwt := fmt.Sprintf("%s.%s", tokenWithoutSign, sign)
// fmt.Println("JWT:", jwt)
//
// isValid := verifyToken(jwt, secret)
// fmt.Println("isValid:", isValid)
//}