mirror of
https://github.com/fumiama/fumitok.git
synced 2026-06-05 00:32:50 +08:00
feat: add expireAt to Validate
This commit is contained in:
21
token.go
21
token.go
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user