Go-Eino Interview Agent 实现了一套全面的安全架构,以基于 JWT 的认证、CORS 保护和安全配置管理为核心。该实现遵循深度防御原则,保护用户数据并确保安全的 API 访问。
安全架构流程
认证与授权
JWT 令牌管理
系统采用 JSON Web Tokens (JWT) 进行无状态认证,使用自定义声明结构:
type JWTClaims struct {
UserID uint `json:"user_id"`
Username string `json:"username"`
Role string `json:"role"`
jwt.RegisteredClaims
}
JWT 中间件提供从多个来源灵活提取令牌的功能:
- Authorization Header:
Bearer {token}格式 - X-Auth-Token Header:自定义标头支持
- Query Parameter:
?token={token}用于 WebSocket 连接 - Cookie:基于浏览器的令牌存储
令牌生成与验证
令牌生成包含可配置的过期时间和标准 JWT 声明:
func GenerateToken(userID uint, username, role string) (string, error) {
expiration, err := time.ParseDuration(cfg.JWTExpiration)
if err != nil {
expiration = 24 * time.Hour // 默认24小时
}
claims := JWTClaims{
UserID: userID,
Username: username,
Role: role,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(expiration)),
IssuedAt: jwt.NewNumericDate(time.Now()),
NotBefore: jwt.NewNumericDate(time.Now()),
Issuer: "interview-agent",
},
}
}
中间件使用 HMAC-SHA256 签名验证令牌,并为下游处理程序设置用户上下文。
路由保护策略
公共路由豁免
系统定义了绕过认证的特定公共路由:
var jwtPublicRoutes = map[string]struct{}{
"/api/user/login": {},
"/api/user/register": {},
"/api/user/logout": {},
"/api/user/wechat/login": {},
"/api/user/wechat/callback": {},
"/api/demo/create/model": {},
}
跳过函数自动允许 CORS 预检的 OPTIONS 请求,并豁免定义的公共路由。
CORS 配置
跨源资源共享
CORS 设置通过安全配置进行配置,提供灵活的来源和方法控制:
security:
cors:
allow_origins: ["*"]
allow_methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
allow_headers: ["Origin", "Content-Type", "Authorization"]
expose_headers: []
allow_credentials: true
配置结构支持对跨源请求的细粒度控制。
当前的 CORS 配置允许所有来源("*")。对于生产部署,请将其限制为特定域名以防止未经授权的跨源访问。
安全配置管理
环境变量保护
系统实现了安全配置管理,通过环境变量扩展处理敏感数据:
func expandEnvVar(s string) string {
re := regexp.MustCompile(`\$\{([^}]+)\}|\$([A-Za-z_][A-Za-z0-9_]*)`)
// ... 扩展逻辑
}
API 密钥和数据库凭据等敏感配置被外部化:
- Embedding API:
${EMBEDDING_API_KEY} - Milvus 凭据:
${MILVUS_USERNAME},${MILVUS_PASSWORD} - JWT 密钥:在安全设置中可配置
配置结构
安全配置集中管理所有安全相关设置:
type SecurityConfig struct {
JWTSecret string `yaml:"jwt_secret"`
JWTExpiration string `yaml:"jwt_expiration"`
CORS CORSConfig `yaml:"cors"`
}
错误处理与恢复
Panic恢复中间件
系统实现了全面的错误恢复机制,防止应用程序崩溃和信息泄露:
func Recovery() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
defer func() {
if r := recover(); r != nil {
stack := debug.Stack()
log.Printf("[PANIC] Recovered: %v\n%s", r, stack)
appErr := errors.NewInternalError(
"Internal server error",
fmt.Errorf("panic: %v\nStack:\n%s", r, string(stack)),
)
response.Error(ctx, c, appErr.HTTPStatus, appErr.Message)
}
}()
c.Next(ctx)
}
}
此中间件确保捕获恐慌,记录完整堆栈跟踪,并将其转换为适当的 HTTP 响应,而不暴露内部细节。
安全架构流程
安全建议
生产环境加固
- 限制 CORS 来源:将
"*"替换为特定的允许域名 - JWT 密钥轮换:实现密钥轮换机制
- 速率限制:添加请求速率限制以防止滥用
- 输入验证:实施全面的输入清理
- HTTPS 强制:确保所有生产流量使用 TLS
监控与审计
- 失败登录跟踪:监控认证失败
- 令牌使用分析:跟踪令牌模式和异常
- 安全标头:实施安全标头(HSTS、CSP 等)
- 日志分析:集中化安全日志聚合
考虑实现 JWT 刷新令牌,通过减少令牌有效期并利用自动刷新机制保持用户体验,从而提高安全性。
集成点
安全实现与以下组件集成:
- Hertz Web 框架设置:中间件注册和请求处理
- 数据库模式设计:用户认证数据存储
- API 响应处理:标准化错误响应和状态码
安全架构为保护面试平台提供了坚实的基础,同时为未来的安全增强保持了灵活性。
点击下方专栏,查看系列内容: