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 附加数据
func (t *Tokenizer) Validate(
token string, mask uint16, checks ...func(uint16) error,
) (uint64, uint16, error) {
) (uint64, uint16, time.Time, error) {
if len(token) != TokenLength {
return 0, 0, ErrInvalidTokenLength
return 0, 0, time.Time{}, ErrInvalidTokenLength
}
data, err := base64.URLEncoding.DecodeString(token)
if err != nil {
return 0, 0, err
return 0, 0, time.Time{}, err
}
addt := binary.LittleEndian.Uint16(data[:2])
addtmsk := addt & mask
for _, fn := range checks {
err = fn(addtmsk)
if err != nil {
return 0, 0, err
return 0, 0, time.Time{}, err
}
}
data, err = decode(t.aead, addt, data[2:])
if err != nil {
return 0, 0, err
return 0, 0, time.Time{}, err
}
h := crc64.New(t.tabl)
_, err = h.Write(data[:16])
if err != nil {
return 0, 0, err
return 0, 0, time.Time{}, err
}
crc := binary.BigEndian.Uint64(data[16:])
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])))) {
return 0, 0, ErrExpiredToken
expireAt := time.UnixMilli(int64(binary.LittleEndian.Uint64(data[:8])))
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

View File

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