token_store.go 1.9 KB

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