89 lines
2.0 KiB
Go
89 lines
2.0 KiB
Go
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,
|
|
//TODO: fetch from cache
|
|
TimeStamp: time.Now().UTC(),
|
|
ExpiresAt: time.Now().Add(5 * time.Minute),
|
|
}
|
|
|
|
userToken, err := h.authService.Authenticate(
|
|
c.Context(),
|
|
req.PubKey,
|
|
req.Signature,
|
|
challenge,
|
|
// add chainID to cfg
|
|
1,
|
|
c.IP(),
|
|
c.Get("User-Agent"),
|
|
)
|
|
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,
|
|
})
|
|
}
|