mirror of
https://github.com/fumiama/fumitok.git
synced 2026-06-28 08:00:23 +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 附加数据
|
// - 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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user