JWT Test
parent
e12051f096
commit
dc53fea5fb
|
@ -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]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue