token.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package token
  2. import (
  3. "errors"
  4. "sparrow/pkg/generator"
  5. "sparrow/pkg/redispool"
  6. "reflect"
  7. "strconv"
  8. )
  9. const (
  10. DeviceTokenKeyPrefix = "device:token:"
  11. DeviceTokenExpires = 7200
  12. )
  13. type Helper struct {
  14. redishost string
  15. }
  16. func NewHelper(host string) *Helper {
  17. helper := &Helper{
  18. redishost: host,
  19. }
  20. return helper
  21. }
  22. func (helper *Helper) GenerateToken(id uint64) ([]byte, error) {
  23. token, err := generator.GenRandomToken()
  24. if err != nil {
  25. return nil, err
  26. }
  27. conn, err := redispool.GetClient(helper.redishost)
  28. if err != nil {
  29. return nil, err
  30. }
  31. key := DeviceTokenKeyPrefix + strconv.FormatUint(id, 10)
  32. _, err = conn.Do("SET", key, token)
  33. if err != nil {
  34. return nil, err
  35. }
  36. _, err = conn.Do("EXPIRE", key, DeviceTokenExpires)
  37. if err != nil {
  38. return nil, err
  39. }
  40. return token, nil
  41. }
  42. func (helper *Helper) ValidateToken(id uint64, token []byte) error {
  43. key := DeviceTokenKeyPrefix + strconv.FormatUint(id, 10)
  44. conn, err := redispool.GetClient(helper.redishost)
  45. if err != nil {
  46. return err
  47. }
  48. readToken, err := conn.Do("GET", key)
  49. if err != nil {
  50. return err
  51. }
  52. if !reflect.DeepEqual(readToken, token) {
  53. return errors.New("token not match.")
  54. }
  55. _, err = conn.Do("EXPIRE", key, DeviceTokenExpires)
  56. if err != nil {
  57. return err
  58. }
  59. return nil
  60. }
  61. func (helper *Helper) ClearToken(id uint64) error {
  62. key := DeviceTokenKeyPrefix + strconv.FormatUint(id, 10)
  63. conn, err := redispool.GetClient(helper.redishost)
  64. if err != nil {
  65. return err
  66. }
  67. _, err = conn.Do("DEL", key)
  68. if err != nil {
  69. return err
  70. }
  71. return nil
  72. }