store.go 1.9 KB

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