codeword/internal/utils/middleware/authenticator.go

52 lines
1.0 KiB
Go
Raw Normal View History

2024-05-28 11:05:31 +00:00
package middleware
2024-03-03 10:13:13 +00:00
import (
"codeword/internal/models"
2024-03-21 14:49:35 +00:00
"fmt"
2024-05-28 11:05:31 +00:00
"strings"
2024-03-03 10:13:13 +00:00
"github.com/gofiber/fiber/v2"
)
const (
prefix = "Bearer "
)
func NewAuthenticator(jwtUtil *JWT) func(*fiber.Ctx) error {
return func(c *fiber.Ctx) error {
if jwtUtil == nil {
return fmt.Errorf("jwt util is nil")
}
if err := authenticate(c, jwtUtil); err != nil {
return fmt.Errorf("authentication error:%d", err)
}
2024-07-20 13:45:04 +00:00
return c.Next()
2024-03-03 10:13:13 +00:00
}
}
func authenticate(c *fiber.Ctx, jwtUtil *JWT) error {
authHeader := c.Get("Authorization")
if authHeader == "" || !strings.HasPrefix(authHeader, prefix) {
return fmt.Errorf("failed to parse jws from request header: %s", authHeader)
}
jws := strings.TrimPrefix(authHeader, prefix)
userID, validateErr := jwtUtil.Validate(jws)
if validateErr != nil {
return validateErr
}
c.Locals(models.AuthJWTDecodedUserIDKey, userID)
c.Locals(models.AuthJWTDecodedAccessTokenKey, jws)
return nil
}
2024-05-28 11:05:31 +00:00
func ExtractUserID(c *fiber.Ctx) string {
userID := c.Context().UserValue(models.AuthJWTDecodedUserIDKey).(string)
return userID
}