1 package token
 2 
 3 import (
 4     "crypto/md5"
 5     "fmt"
 6     "io"
 7     "math/rand"
 8     "sync"
 9     "time"
10 )
11 
12 type User struct {
13     ID    string
14     Timer *time.Timer
15 }
16 
17 var Token map[string]*User = make(map[string]*User)
18 var maxLiveTime time.Duration = time.Hour * 24 // Token更新时间暂定为24小时
19 var lock sync.RWMutex
20 
21 const randStringLen = 16
22 
23 func randString() string {
24     str := make([]byte, randStringLen)
25     for i := 0; i < randStringLen; i++ {
26         str[i] = byte(rand.Uint32() & ((1 << 7) - 1))
27     }
28     return string(str)
29 }
30 
31 func New(userID string, token *string, writeToken func()) {
32     lock.Lock()
33     delete(Token, *token)
34     hash := md5.New()
35     io.WriteString(hash, userID)
36     io.WriteString(hash, time.Now().String())
37     *token = fmt.Sprintf("%x", hash.Sum(nil))
38     timer := time.AfterFunc(maxLiveTime, func() { New(userID, token, writeToken) })
39     Token[*token] = &User{
40         ID:    userID,
41         Timer: timer,
42     }
43     lock.Unlock()
44     writeToken()
45 }
46 
47 func Del(token string) {
48     lock.Lock()
49     defer lock.Unlock()
50     user := Token[token]
51     user.Timer.Stop()
52     delete(Token, token)
53 }
54 
55 func GetUser(token string) (user *User, exisToken bool) {
56     lock.RLock()
57     defer lock.RUnlock()
58     user, exisToken = Token[token]
59     return user, exisToken
60 }
token

相关文章: