57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package auth
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2/middleware/limiter"
|
|
goredis "github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
type redisStorage struct {
|
|
client *goredis.Client
|
|
}
|
|
|
|
func NewRedisStorage(client *goredis.Client) *redisStorage {
|
|
return &redisStorage{client: client}
|
|
}
|
|
|
|
func (s *redisStorage) Get(key string) ([]byte, error) {
|
|
val, err := s.client.Get(context.Background(), key).Bytes()
|
|
if err == goredis.Nil {
|
|
return nil, nil
|
|
}
|
|
return val, err
|
|
}
|
|
|
|
func (s *redisStorage) Set(key string, val []byte, exp time.Duration) error {
|
|
return s.client.Set(context.Background(), key, val, exp).Err()
|
|
}
|
|
|
|
func (s *redisStorage) Delete(key string) error {
|
|
return s.client.Del(context.Background(), key).Err()
|
|
}
|
|
|
|
func (s *redisStorage) Reset() error {
|
|
return s.client.FlushDB(context.Background()).Err()
|
|
}
|
|
|
|
func (s *redisStorage) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func RateLimiter(storage *redisStorage) fiber.Handler {
|
|
return limiter.New(limiter.Config{
|
|
Max: 10,
|
|
Expiration: 1 * time.Minute,
|
|
KeyGenerator: func(c *fiber.Ctx) string {
|
|
return "ratelimit:auth:" + c.IP()
|
|
},
|
|
Storage: storage,
|
|
LimitReached: func(c *fiber.Ctx) error {
|
|
return fiber.NewError(429, "muitas tentativas, tente novamente em 1 minuto")
|
|
},
|
|
})
|
|
}
|