token.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package auth
  2. import (
  3. "crypto/sha1"
  4. "errors"
  5. "fmt"
  6. "math/rand"
  7. "strings"
  8. "git.shuncheng.lu/bigthing/gocommon/pkg/conf"
  9. "git.shuncheng.lu/bigthing/gocommon/pkg/logger"
  10. )
  11. const (
  12. serviceKey = "30346876b3f45bab965823b9aa64a1a4"
  13. key = "key"
  14. name = "name"
  15. )
  16. var (
  17. serviceTokenVerifyFail = errors.New("service token verify fail")
  18. serviceTokenInvalid = errors.New("service_token invalid")
  19. )
  20. //服务Service-token的生成
  21. func GenerateToken(node string) string {
  22. // 需要配置 node 的 key 和 name
  23. keySec := conf.GetString(node, key, "")
  24. serviceName := conf.GetString(node, name, "")
  25. randInt := rand.Intn(10000)
  26. payload := fmt.Sprintf("%s.%d", serviceName, randInt)
  27. //sha1加密
  28. str := fmt.Sprintf("%s%s", payload, keySec)
  29. h := sha1.New()
  30. h.Write([]byte(str))
  31. bs := h.Sum(nil)
  32. return fmt.Sprintf("%s.%x", payload, bs)
  33. }
  34. //Service-token的验证
  35. func VerifyToken(token string) (bool, error) {
  36. tokenArr := strings.Split(token, ".")
  37. if len(tokenArr) != 3 {
  38. return false, serviceTokenInvalid
  39. }
  40. h := sha1.New()
  41. str := fmt.Sprintf("%s.%s%s", tokenArr[0], tokenArr[1], serviceKey)
  42. _, err := h.Write([]byte(str))
  43. if err != nil {
  44. return false, err
  45. }
  46. bs := h.Sum(nil)
  47. sign := fmt.Sprintf("%x", bs)
  48. if !strings.EqualFold(sign, tokenArr[2]) {
  49. logger.Errorf("[service-token] service token verify fail, sign: %s, client_token: %s, token: %s, str: %s", sign, tokenArr[2], token, str)
  50. return false, serviceTokenVerifyFail
  51. }
  52. return true, nil
  53. }