47 lines
928 B
Go
47 lines
928 B
Go
package utils
|
|
|
|
import (
|
|
"codeword/internal/models"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"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)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|