package token import ( "errors" "reflect" "sparrow/pkg/generator" "sparrow/pkg/redispool" ) const ( DeviceTokenKeyPrefix = "device:token:" DeviceTokenExpires = 7200 ApplicationTokenKeyPrefix = "app:token:" ApplicationTokenExpires = 7200 ) type Helper struct { redishost string } func NewHelper(host string) *Helper { helper := &Helper{ redishost: host, } return helper } func (helper *Helper) GenerateToken(recordId string) ([]byte, error) { token, err := generator.GenRandomToken() if err != nil { return nil, err } conn, err := redispool.GetClient(helper.redishost) if err != nil { return nil, err } defer conn.Close() key := DeviceTokenKeyPrefix + recordId _, err = conn.Do("SET", key, token) if err != nil { return nil, err } _, err = conn.Do("EXPIRE", key, DeviceTokenExpires) if err != nil { return nil, err } return token, nil } func (helper *Helper) ValidateToken(id string, token []byte) error { key := DeviceTokenKeyPrefix + id conn, err := redispool.GetClient(helper.redishost) if err != nil { return err } defer conn.Close() readToken, err := conn.Do("GET", key) if err != nil { return err } if !reflect.DeepEqual(readToken, token) { return errors.New("token not match.") } _, err = conn.Do("EXPIRE", key, DeviceTokenExpires) if err != nil { return err } return nil } func (helper *Helper) ClearToken(id string) error { key := DeviceTokenKeyPrefix + id conn, err := redispool.GetClient(helper.redishost) if err != nil { return err } defer conn.Close() _, err = conn.Do("DEL", key) if err != nil { return err } return nil } func (helper *Helper) GenerateAppToken(id string, key string) ([]byte, error) { token, err := generator.GenRandomToken() if err != nil { return nil, err } conn, err := redispool.GetClient(helper.redishost) if err != nil { return nil, err } defer conn.Close() //key := ApplicationTokenKeyPrefix + strconv.FormatUint(id, 10) _, err = conn.Do("SET", key, token) if err != nil { return nil, err } _, err = conn.Do("EXPIRE", key, DeviceTokenExpires) if err != nil { return nil, err } return token, nil } func (helper *Helper) ValidateAppToken(key string, token []byte) error { conn, err := redispool.GetClient(helper.redishost) if err != nil { return err } defer conn.Close() readToken, err := conn.Do("GET", key) if err != nil { return err } if !reflect.DeepEqual(readToken, token) { return errors.New("token not match.") } _, err = conn.Do("EXPIRE", key, DeviceTokenExpires) if err != nil { return err } return nil }