多平台账号批量注册系统,支持 OpenAI / Grok / Kiro / Gemini 平台的全自动注册。 Features: - 用户名/密码注册登录(首个用户自动管理员) - JWT 认证 + bcrypt 密码加密 - 积分系统与多用户管理 - HuggingFace Space 弹性 Worker 节点管理 - Cloudflare Worker 负载均衡 - 实时日志推送(SSE/WebSocket) - 管理后台(用户管理、系统设置、代理池、卡池) Tech Stack: Go 1.25 / Gin / GORM / PostgreSQL / Vue 3 / Vite / TailwindCSS
80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package middleware
|
||
|
||
import (
|
||
"net/http"
|
||
"strings"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/xiaolajiaoyyds/regplatformm/internal/model"
|
||
"github.com/xiaolajiaoyyds/regplatformm/internal/service"
|
||
)
|
||
|
||
// Auth JWT 认证中间件
|
||
// token 提取优先级:Cookie("token") > X-Auth-Token > Authorization Bearer
|
||
func Auth(authSvc *service.AuthService) gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
// 1. Cookie
|
||
token, _ := c.Cookie("token")
|
||
|
||
// 2. X-Auth-Token header
|
||
if token == "" {
|
||
token = c.GetHeader("X-Auth-Token")
|
||
}
|
||
|
||
// 3. Authorization: Bearer xxx
|
||
if token == "" {
|
||
auth := c.GetHeader("Authorization")
|
||
if strings.HasPrefix(auth, "Bearer ") {
|
||
token = auth[7:]
|
||
}
|
||
}
|
||
|
||
// 4. Query parameter(SSE 用)
|
||
if token == "" {
|
||
token = c.Query("token")
|
||
}
|
||
|
||
if token == "" {
|
||
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"detail": "未登录"})
|
||
return
|
||
}
|
||
|
||
userID, err := authSvc.VerifyJWT(token)
|
||
if err != nil {
|
||
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"detail": "登录已过期"})
|
||
return
|
||
}
|
||
|
||
user, err := authSvc.GetActiveUser(userID)
|
||
if err != nil {
|
||
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"detail": "账号不可用"})
|
||
return
|
||
}
|
||
|
||
c.Set("user", user)
|
||
c.Set("userID", user.ID)
|
||
c.Next()
|
||
}
|
||
}
|
||
|
||
// GetUser 从 gin.Context 中提取当前用户
|
||
func GetUser(c *gin.Context) *model.User {
|
||
u, exists := c.Get("user")
|
||
if !exists {
|
||
return nil
|
||
}
|
||
return u.(*model.User)
|
||
}
|
||
|
||
// Admin 管理员权限中间件(需在 Auth 之后使用)
|
||
func Admin() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
user := GetUser(c)
|
||
if user == nil || !user.IsAdmin {
|
||
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"detail": "需要管理员权限"})
|
||
return
|
||
}
|
||
c.Next()
|
||
}
|
||
}
|