feat: auth handlers
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"backend/internal/api/dto"
|
||||
"backend/internal/domain"
|
||||
"backend/internal/usecase"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type AuthHandler struct {
|
||||
authService usecase.AuthService
|
||||
}
|
||||
|
||||
func NewAuthHandler(authService *usecase.AuthService) *AuthHandler {
|
||||
return &AuthHandler{
|
||||
authService: *authService,
|
||||
}
|
||||
}
|
||||
|
||||
func (h *AuthHandler) GenerateChallenge(c *fiber.Ctx) error {
|
||||
var req dto.ChallengeRequest
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"error": "invalid request body",
|
||||
})
|
||||
}
|
||||
challenge, err := h.authService.GenerateChallenge(c.Context(), req.PubKey)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"error": "failed to generate challenge",
|
||||
})
|
||||
}
|
||||
return c.Status(fiber.StatusOK).JSON(
|
||||
dto.ChallengeResponse{
|
||||
Message: challenge.Message.String(),
|
||||
TimeStamp: challenge.TimeStamp.String(),
|
||||
ExpiresAt: challenge.ExpiresAt.String(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func (h *AuthHandler) Authenticate(c *fiber.Ctx) error {
|
||||
var req dto.AuthenticateRequest
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"error": "invalid request body",
|
||||
})
|
||||
}
|
||||
|
||||
messageUUID, err := uuid.Parse(req.Message)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||
"error": "invalid message format",
|
||||
})
|
||||
}
|
||||
|
||||
challenge := &domain.Challenge{
|
||||
Message: messageUUID,
|
||||
TimeStamp: time.Now().UTC(),
|
||||
ExpiresAt: time.Now().Add(5 * time.Minute),
|
||||
}
|
||||
|
||||
clientIP := c.IP()
|
||||
userAgent := c.Get("User-Agent")
|
||||
|
||||
userToken, err := h.authService.Authenticate(
|
||||
c.Context(),
|
||||
req.PubKey,
|
||||
req.Signature,
|
||||
challenge,
|
||||
// add chainID to cfg
|
||||
1,
|
||||
clientIP,
|
||||
userAgent,
|
||||
)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": err.Error(),
|
||||
})
|
||||
}
|
||||
|
||||
return c.Status(fiber.StatusOK).JSON(dto.AuthenticateResponse{
|
||||
AuthorizationToken: userToken.AuthorizationToken,
|
||||
RefreshToken: userToken.RefreshToken,
|
||||
ExpiresAt: userToken.ExpiresAt,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user