51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
// Filename: internal/handlers/api_auth_handler.go
|
||
package handlers
|
||
|
||
import (
|
||
"gemini-balancer/internal/middleware"
|
||
"gemini-balancer/internal/service"
|
||
"net/http"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
type APIAuthHandler struct {
|
||
securityService *service.SecurityService
|
||
}
|
||
|
||
func NewAPIAuthHandler(securityService *service.SecurityService) *APIAuthHandler {
|
||
return &APIAuthHandler{securityService: securityService}
|
||
}
|
||
|
||
type LoginRequest struct {
|
||
Token string `json:"token" binding:"required"`
|
||
}
|
||
|
||
type LoginResponse struct {
|
||
Token string `json:"token"`
|
||
Message string `json:"message"`
|
||
}
|
||
|
||
func (h *APIAuthHandler) HandleLogin(c *gin.Context) {
|
||
var req LoginRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"error": "请求格式错误: " + err.Error()})
|
||
return
|
||
}
|
||
|
||
authToken, err := h.securityService.AuthenticateToken(req.Token)
|
||
// 同时检查token是否有效,以及是否是管理员
|
||
if err != nil || !authToken.IsAdmin {
|
||
h.securityService.RecordFailedLoginAttempt(c.Request.Context(), c.ClientIP())
|
||
c.JSON(http.StatusUnauthorized, gin.H{"error": "无效或非管理员Token"})
|
||
return
|
||
}
|
||
|
||
middleware.SetAdminSessionCookie(c, authToken.Token)
|
||
|
||
c.JSON(http.StatusOK, LoginResponse{
|
||
Token: authToken.Token,
|
||
Message: "登录成功,欢迎管理员!",
|
||
})
|
||
}
|