feat: add expireAt to Validate

This commit is contained in:
源文雨
2024-12-16 21:44:06 +09:00
parent 5de5e0ffa3
commit b6304c16b1
2 changed files with 14 additions and 13 deletions

View File

@@ -97,39 +97,40 @@ func (t *Tokenizer) Generate(id uint64, expireAt time.Time, addt, mask uint16) (
// - uint16 附加数据 // - uint16 附加数据
func (t *Tokenizer) Validate( func (t *Tokenizer) Validate(
token string, mask uint16, checks ...func(uint16) error, token string, mask uint16, checks ...func(uint16) error,
) (uint64, uint16, error) { ) (uint64, uint16, time.Time, error) {
if len(token) != TokenLength { if len(token) != TokenLength {
return 0, 0, ErrInvalidTokenLength return 0, 0, time.Time{}, ErrInvalidTokenLength
} }
data, err := base64.URLEncoding.DecodeString(token) data, err := base64.URLEncoding.DecodeString(token)
if err != nil { if err != nil {
return 0, 0, err return 0, 0, time.Time{}, err
} }
addt := binary.LittleEndian.Uint16(data[:2]) addt := binary.LittleEndian.Uint16(data[:2])
addtmsk := addt & mask addtmsk := addt & mask
for _, fn := range checks { for _, fn := range checks {
err = fn(addtmsk) err = fn(addtmsk)
if err != nil { if err != nil {
return 0, 0, err return 0, 0, time.Time{}, err
} }
} }
data, err = decode(t.aead, addt, data[2:]) data, err = decode(t.aead, addt, data[2:])
if err != nil { if err != nil {
return 0, 0, err return 0, 0, time.Time{}, err
} }
h := crc64.New(t.tabl) h := crc64.New(t.tabl)
_, err = h.Write(data[:16]) _, err = h.Write(data[:16])
if err != nil { if err != nil {
return 0, 0, err return 0, 0, time.Time{}, err
} }
crc := binary.BigEndian.Uint64(data[16:]) crc := binary.BigEndian.Uint64(data[16:])
if crc != h.Sum64() { if crc != h.Sum64() {
return 0, 0, ErrInvalidToken return 0, 0, time.Time{}, ErrInvalidToken
} }
if time.Now().After(time.UnixMilli(int64(binary.LittleEndian.Uint64(data[:8])))) { expireAt := time.UnixMilli(int64(binary.LittleEndian.Uint64(data[:8])))
return 0, 0, ErrExpiredToken if time.Now().After(expireAt) {
return 0, 0, time.Time{}, ErrExpiredToken
} }
return binary.LittleEndian.Uint64(data[8:16]), addtmsk, nil return binary.LittleEndian.Uint64(data[8:16]), addtmsk, expireAt, nil
} }
// Refresh 过期时刷新 token // Refresh 过期时刷新 token

View File

@@ -24,7 +24,7 @@ func TestTokenizer(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
t.Log(token) t.Log(token)
vid, addt, err := tk.Validate(token, 0x00ff) vid, addt, _, err := tk.Validate(token, 0x00ff)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@@ -36,7 +36,7 @@ func TestTokenizer(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
t.Log(token2) t.Log(token2)
_, _, err = tk.Validate(token2, 0) _, _, _, err = tk.Validate(token2, 0)
if err != ErrExpiredToken { if err != ErrExpiredToken {
t.Fatal("unexpected err", err) t.Fatal("unexpected err", err)
} }
@@ -44,7 +44,7 @@ func TestTokenizer(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
vid, addt, err = tk.Validate(token, 0x00ff) vid, addt, _, err = tk.Validate(token, 0x00ff)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }