store.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package utils
  2. import (
  3. "log"
  4. "sync"
  5. "time"
  6. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  7. )
  8. type TokenStore struct {
  9. name string
  10. lock *sync.RWMutex
  11. tokens map[string]*entitys.Token
  12. }
  13. var GlobalTokenStore *TokenStore
  14. func NewTokenStore() *TokenStore {
  15. t := &TokenStore{name: "sso", lock: new(sync.RWMutex), tokens: make(map[string]*entitys.Token)}
  16. go t.startTokenCheckProcess()
  17. return t
  18. }
  19. func (t *TokenStore) Get(key string) *entitys.Token {
  20. t.lock.RLock()
  21. defer t.lock.RUnlock()
  22. if val, ok := t.tokens[key]; ok {
  23. //log.Println(key, "获取Token:", val.AccessToken, val.RefreshToken, val.LoginID)
  24. return val
  25. }
  26. return nil
  27. }
  28. func (t *TokenStore) Set(key string, v *entitys.Token) {
  29. t.lock.Lock()
  30. defer t.lock.Unlock()
  31. if val, ok := t.tokens[key]; !ok {
  32. t.tokens[key] = v
  33. } else if val != v {
  34. t.tokens[key] = v
  35. }
  36. log.Println(key, "添加Token:", v.AccessToken, v.RefreshToken, v.LoginID)
  37. }
  38. func (t *TokenStore) Remove(key string) {
  39. t.lock.Lock()
  40. defer t.lock.Unlock()
  41. delete(t.tokens, key)
  42. log.Println(key, "删除Key")
  43. }
  44. func (t *TokenStore) Refresh(key string) {
  45. t.lock.Lock()
  46. defer t.lock.Unlock()
  47. val, ok := t.tokens[key]
  48. if ok {
  49. val.TimeStamp = uint64(time.Now().UnixNano())
  50. }
  51. }
  52. func (t *TokenStore) startTokenCheckProcess() {
  53. autoRefresh, _ := NewConfig().Bool("auto_refresh", false)
  54. if !autoRefresh {
  55. return
  56. }
  57. var duration time.Duration = time.Second * 3600
  58. t1 := time.NewTicker(duration)
  59. for {
  60. select {
  61. case <-t1.C:
  62. t.lock.Lock()
  63. keys := []string{}
  64. for k, v := range t.tokens {
  65. timestampt := time.Unix(int64(v.TimeStamp), 0)
  66. subval := time.Now().Sub(timestampt)
  67. if subval.Seconds() < 0 || subval.Seconds() > 3600 {
  68. keys = append(keys, k)
  69. }
  70. }
  71. for _, k := range keys {
  72. delete(t.tokens, k)
  73. }
  74. t.lock.Unlock()
  75. }
  76. }
  77. }