auth.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package middleware
  2. import (
  3. "context"
  4. "strconv"
  5. "strings"
  6. "git.ikuban.com/server/kratos-utils/common"
  7. "github.com/go-kratos/kratos/v2/errors"
  8. "github.com/go-kratos/kratos/v2/middleware"
  9. "github.com/go-kratos/kratos/v2/transport/http"
  10. )
  11. const (
  12. Bearer = "Bearer "
  13. )
  14. var (
  15. nowAuthURI = make(map[string]bool)
  16. )
  17. func Auth(handler middleware.Handler) middleware.Handler {
  18. return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
  19. if info, ok := http.FromServerContext(ctx); ok {
  20. uri := info.Request.RequestURI
  21. if _, ok1 := nowAuthURI[uri]; ok1 {
  22. return handler(ctx, req)
  23. }
  24. token := info.Request.Header.Get("Authorization")
  25. if token == "" {
  26. return nil, unauthorized()
  27. }
  28. if strings.Contains(token, Bearer) {
  29. token = strings.Replace(token, Bearer, "", 1)
  30. } else {
  31. return nil, unauthorized()
  32. }
  33. uid, _, claimMap, err := common.DefaultJWT.Parse(token)
  34. if err != nil {
  35. return nil, unauthorized()
  36. }
  37. var userID int64
  38. if uid != "" {
  39. userID, _ = strconv.ParseInt(uid, 10, 64)
  40. }
  41. if userID <= 0 {
  42. return nil, unauthorized()
  43. }
  44. ctx = context.WithValue(ctx, "user_id", userID)
  45. ctx = context.WithValue(ctx, "jwt_claims", claimMap)
  46. ctx = context.WithValue(ctx, "auth_token", token)
  47. }
  48. return handler(ctx, req)
  49. }
  50. }
  51. func unauthorized() error {
  52. return &errors.StatusError{
  53. Code: 401,
  54. Message: "Unauthorized",
  55. }
  56. }
  57. func AddNotAuthURI(r string) {
  58. nowAuthURI[r] = true
  59. }