/
token.go
94 lines (86 loc) · 2.12 KB
/
token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package src
import (
"math"
"time"
"github.com/golang-jwt/jwt/v4"
"github.com/rs/xid"
)
type IToken interface {
SetSignAlgorithm(alg SignAlgorithm)
SetExpiresAt(t int64)
SetRepeatExpiresAt(t int64)
SetSecret(secret string)
SetClaims(claims any)
SignToken() string
GetExpiresAt() *jwt.NumericDate
GetClaims() *NewClaims
GetSignAlgorithm() SignAlgorithm
}
type Token struct {
SignAlgorithm SignAlgorithm
ExpiresAt *jwt.NumericDate
Key IKey
Claims *NewClaims `json:"claims"` // Payload
Jwt string // Token in string
}
type NewClaims struct {
Claims any `json:"claims"`
jwt.RegisteredClaims
}
// Set
func (tk *Token) SetSignAlgorithm(alg SignAlgorithm) {}
func (tk *Token) SetExpiresAt(t int64) {
tk.ExpiresAt = jwt.NewNumericDate(time.Now().Add(time.Duration(t * int64(math.Pow10(9)))))
}
func (tk *Token) SetRepeatExpiresAt(t int64) {
tk.ExpiresAt = jwt.NewNumericDate(time.Unix(t, 0))
}
func (tk *Token) SetSecret(secret string) {
switch tk.SignAlgorithm {
case HMAC:
tk.Key.SetCommonKey(secret)
case RSA:
tk.Key.SetPrivateKey(secret)
default:
panic("invalid secret key format")
}
}
func (tk *Token) SetClaims(claims any) {
tk.Claims = &NewClaims{
// Custom claims
Claims: claims,
// Default jwt token config
RegisteredClaims: jwt.RegisteredClaims{
ID: xid.New().String(),
Issuer: "rainbowhatto",
Subject: "rainbowtoken",
Audience: []string{"human"},
ExpiresAt: tk.GetExpiresAt(),
NotBefore: jwt.NewNumericDate(time.Now()),
IssuedAt: jwt.NewNumericDate(time.Now()),
},
}
}
// Get
func (tk *Token) GetExpiresAt() *jwt.NumericDate {
return tk.ExpiresAt
}
func (tk *Token) GetClaims() *NewClaims {
return tk.Claims
}
func (tk *Token) GetSignAlgorithm() SignAlgorithm {
return tk.SignAlgorithm
}
// Usecases
func (tk *Token) SignToken() string {
token := jwt.NewWithClaims(tk.SignAlgorithm, tk.Claims)
switch tk.SignAlgorithm {
case HMAC:
ss, _ := token.SignedString([]byte(tk.Key.GetCommonKey()))
return ss
case RSA:
ss, _ := token.SignedString(tk.Key.GetPrivateKey())
return ss
}
panic("sign token error: token algorithm is invalid")
}