Files
hk4e/water-api/auth/water_auth.go
2022-11-20 15:38:00 +08:00

110 lines
2.9 KiB
Go

package auth
import (
"errors"
providerApiEntity "flswld.com/annie-user-api/entity"
"flswld.com/light"
"sync"
"time"
)
var tokenUserMap map[string]*providerApiEntity.User
var tokenUserMapLock sync.RWMutex
var tokenValidMap map[string]bool
var tokenValidMapLock sync.RWMutex
var tokenTimeoutMap map[string]int64
var tokenTimeoutMapLock sync.RWMutex
func init() {
tokenUserMap = make(map[string]*providerApiEntity.User)
tokenValidMap = make(map[string]bool)
tokenTimeoutMap = make(map[string]int64)
go CleanTimeoutToken()
}
func CleanTimeoutToken() {
ticker := time.NewTicker(time.Second * 300)
for {
now := time.Now().Unix()
deleteTokenList := make([]string, 0)
tokenTimeoutMapLock.RLock()
for accessToken, createTime := range tokenTimeoutMap {
if now-createTime > 3600*24 {
deleteTokenList = append(deleteTokenList, accessToken)
}
}
tokenTimeoutMapLock.RUnlock()
tokenUserMapLock.Lock()
tokenValidMapLock.Lock()
tokenTimeoutMapLock.Lock()
for _, accessToken := range deleteTokenList {
delete(tokenUserMap, accessToken)
delete(tokenValidMap, accessToken)
delete(tokenTimeoutMap, accessToken)
}
tokenUserMapLock.Unlock()
tokenValidMapLock.Unlock()
tokenTimeoutMapLock.Unlock()
<-ticker.C
}
}
func WaterQueryUserByAccessToken(consumer *light.Consumer, accessToken string) (*providerApiEntity.User, error) {
tokenUserMapLock.RLock()
value, ok := tokenUserMap[accessToken]
tokenUserMapLock.RUnlock()
if ok {
return value, nil
}
user := new(providerApiEntity.User)
err := consumer.CallFunction("RpcService", "RpcQueryUserByAccessToken", accessToken, user)
if err == false {
return nil, errors.New("rpc call fail")
}
tokenUserMapLock.Lock()
tokenUserMap[accessToken] = user
tokenUserMapLock.Unlock()
return user, nil
}
func WaterVerifyAccessToken(consumer *light.Consumer, accessToken string) (bool, error) {
tokenValidMapLock.RLock()
_, ok := tokenValidMap[accessToken]
tokenValidMapLock.RUnlock()
if ok {
tokenTimeoutMapLock.RLock()
tokenCreateTime := tokenTimeoutMap[accessToken]
tokenTimeoutMapLock.RUnlock()
if time.Now().Unix()-tokenCreateTime <= 3600*24 {
return true, nil
} else {
tokenUserMapLock.Lock()
delete(tokenUserMap, accessToken)
tokenUserMapLock.Unlock()
tokenValidMapLock.Lock()
delete(tokenValidMap, accessToken)
tokenValidMapLock.Unlock()
tokenTimeoutMapLock.Lock()
delete(tokenTimeoutMap, accessToken)
tokenTimeoutMapLock.Unlock()
return false, nil
}
}
var valid bool
err := consumer.CallFunction("RpcService", "RpcVerifyAccessToken", accessToken, &valid)
if err == false {
return false, errors.New("rpc call fail")
}
if valid {
tokenValidMapLock.Lock()
tokenValidMap[accessToken] = true
tokenValidMapLock.Unlock()
tokenTimeoutMapLock.Lock()
tokenTimeoutMap[accessToken] = time.Now().Unix()
tokenTimeoutMapLock.Unlock()
return true, nil
} else {
return false, nil
}
}