You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

clear_expired_access_token.go 2.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package ticktock
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. "gitlink.org.cn/cloudream/common/utils/reflect2"
  8. stgglb "gitlink.org.cn/cloudream/jcs-pub/common/globals"
  9. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/accesstoken"
  10. hubrpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/hub"
  11. "gitlink.org.cn/cloudream/jcs-pub/coordinator/internal/db"
  12. cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types"
  13. )
  14. type ClearExpiredAccessToken struct {
  15. }
  16. func (j *ClearExpiredAccessToken) Name() string {
  17. return reflect2.TypeNameOf[ClearExpiredAccessToken]()
  18. }
  19. func (j *ClearExpiredAccessToken) Execute(t *TickTock) {
  20. log := logger.WithType[ClearExpiredAccessToken]("TickTock")
  21. log.Infof("job start")
  22. startTime := time.Now()
  23. defer func() {
  24. log.Infof("job end, time: %v", time.Since(startTime))
  25. }()
  26. expired, err := db.DoTx02(t.db, func(tx db.SQLContext) ([]cortypes.LoadedAccessToken, error) {
  27. nowTime := time.Now()
  28. expired, err := t.db.LoadedAccessToken().GetExpired(tx, nowTime)
  29. if err != nil {
  30. return nil, fmt.Errorf("get expired access token load record: %w", err)
  31. }
  32. err = t.db.LoadedAccessToken().DeleteExpired(tx, nowTime)
  33. if err != nil {
  34. return nil, fmt.Errorf("delete expired access token load record: %w", err)
  35. }
  36. err = t.db.UserAccessToken().DeleteExpired(tx, nowTime)
  37. if err != nil {
  38. return nil, fmt.Errorf("delete expired user access token: %w", err)
  39. }
  40. return expired, nil
  41. })
  42. if err != nil {
  43. log.Warn(err.Error())
  44. return
  45. }
  46. uniToken := make(map[accesstoken.CacheKey]bool)
  47. for _, t := range expired {
  48. uniToken[accesstoken.CacheKey{
  49. UserID: t.UserID,
  50. TokenID: t.TokenID,
  51. }] = true
  52. }
  53. log.Infof("%v expired access token cleared", len(uniToken))
  54. // 通知本服务的AccessToken缓存失效
  55. for k := range uniToken {
  56. t.accessToken.NotifyTokenInvalid(k)
  57. }
  58. // 通知所有加载了失效Token的Hub
  59. var loadedHubIDs []cortypes.HubID
  60. for _, e := range expired {
  61. loadedHubIDs = append(loadedHubIDs, e.HubID)
  62. }
  63. loadedHubs, err := t.db.Hub().BatchGetByID(t.db.DefCtx(), loadedHubIDs)
  64. if err != nil {
  65. log.Warnf("getting hubs: %v", err)
  66. return
  67. }
  68. hubMap := make(map[cortypes.HubID]cortypes.Hub)
  69. for _, h := range loadedHubs {
  70. hubMap[h.HubID] = h
  71. }
  72. for _, e := range expired {
  73. h, ok := hubMap[e.HubID]
  74. if !ok {
  75. continue
  76. }
  77. addr, ok := h.Address.(*cortypes.GRPCAddressInfo)
  78. if !ok {
  79. continue
  80. }
  81. cli := stgglb.HubRPCPool.Get(addr.ExternalIP, addr.ExternalGRPCPort)
  82. // 不关心返回值
  83. _, err := cli.NotifyUserAccessTokenInvalid(context.Background(), &hubrpc.NotifyUserAccessTokenInvalid{
  84. UserID: e.UserID,
  85. TokenID: e.TokenID,
  86. })
  87. if err != nil {
  88. log.Warnf("notify hub %v: %v", h.HubID, err)
  89. }
  90. cli.Release()
  91. }
  92. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。