auth_service.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package server
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "golang.org/x/net/context"
  6. "google.golang.org/grpc/metadata"
  7. "gopkg.in/redis.v2"
  8. "xiaoniaokuaiyan.com/xiaoniao/util"
  9. )
  10. type AuthService interface {
  11. GetAccessToken(strToken string) (interface{}, error)
  12. }
  13. func AuthGrpc(ctx context.Context) error {
  14. md, _ := metadata.FromIncomingContext(ctx)
  15. var clientid []string
  16. var hasOk bool
  17. if clientid, hasOk = md["clientid"]; !hasOk {
  18. return errors.New("clientid required")
  19. }
  20. if tokenKey, ok := md["token"]; !ok {
  21. return errors.New("token is empty")
  22. } else {
  23. return ValidateToken(tokenKey[0], clientid[0])
  24. }
  25. }
  26. func ValidateToken(tokenStr string, clientid string) error {
  27. token, err := GetTokenFromRedis(clientid)
  28. if err != nil {
  29. return err
  30. }
  31. if token.expired() {
  32. go func() {
  33. var client *redis.Client = util.GetRedis()
  34. client.Select(REDIS_API_AUTH_DB)
  35. client.HDel(REDIS_API_AUTH_KEY, clientid)
  36. }()
  37. return TokenExipiredError
  38. }
  39. if token.AccessToken != tokenStr {
  40. return errors.New("wrong token")
  41. }
  42. if !token.IsValid() {
  43. return errors.New("invalid token")
  44. }
  45. return nil
  46. }
  47. var TokenKeyNotFoundError error = errors.New("token key not found")
  48. var TokenExipiredError error = errors.New("token expired")
  49. func GetTokenFromRedis(tokenKey string) (*AuthToken, error) {
  50. if tokenKey == "" {
  51. return nil, errors.New("token key is empty")
  52. }
  53. var client *redis.Client = util.GetRedis()
  54. statusCmd := client.Select(REDIS_API_AUTH_DB)
  55. if err := statusCmd.Err(); err != nil {
  56. return nil, err
  57. }
  58. strCmd := client.HGet(REDIS_API_AUTH_KEY, tokenKey)
  59. if tokenStr, err := strCmd.Result(); err != nil {
  60. return nil, TokenKeyNotFoundError
  61. } else {
  62. token := &AuthToken{}
  63. err = json.Unmarshal([]byte(tokenStr), token)
  64. return token, nil
  65. }
  66. }