JWT Test
parent
e12051f096
commit
dc53fea5fb
|
@ -1,20 +1,75 @@
|
||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/golang-jwt/jwt/v5"
|
"crypto/hmac"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Header struct {
|
||||||
type JWT struct {
|
Typ string `json:"typ"`
|
||||||
Username string `json:"username"`
|
Alg string `json:"alg"`
|
||||||
jwt.Claims
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Hello() {
|
type Payload struct {
|
||||||
println("hello")
|
Sub string `json:"sub"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Iat int64 `json:"iat"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenJWT 生成JWT
|
func base64Encode(src []byte) string {
|
||||||
func GenJWT(username string)(string, error)
|
return strings.TrimRight(base64.URLEncoding.EncodeToString(src), "=")
|
||||||
expTime := time.Now().Add(7 * 24 * time.Hour)
|
}
|
||||||
|
|
||||||
|
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