16 Go Eino AI应用开发实战 | 安全实现

39 阅读3分钟

Go-Eino Interview Agent 实现了一套全面的安全架构,以基于 JWT 的认证、CORS 保护和安全配置管理为核心。该实现遵循深度防御原则,保护用户数据并确保安全的 API 访问。

安全架构流程

image.png

认证与授权

JWT 令牌管理

系统采用 JSON Web Tokens (JWT) 进行无状态认证,使用自定义声明结构:

type JWTClaims struct {
    UserID   uint   `json:"user_id"`
    Username string `json:"username"`
    Role     string `json:"role"`
    jwt.RegisteredClaims
}

JWT 中间件提供从多个来源灵活提取令牌的功能:

  1. Authorization HeaderBearer {token} 格式
  2. X-Auth-Token Header:自定义标头支持
  3. Query Parameter?token={token} 用于 WebSocket 连接
  4. 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 响应,而不暴露内部细节。

安全架构流程

安全建议

生产环境加固

  1. 限制 CORS 来源:将 "*" 替换为特定的允许域名
  2. JWT 密钥轮换:实现密钥轮换机制
  3. 速率限制:添加请求速率限制以防止滥用
  4. 输入验证:实施全面的输入清理
  5. HTTPS 强制:确保所有生产流量使用 TLS

监控与审计

  1. 失败登录跟踪:监控认证失败
  2. 令牌使用分析:跟踪令牌模式和异常
  3. 安全标头:实施安全标头(HSTS、CSP 等)
  4. 日志分析:集中化安全日志聚合

考虑实现 JWT 刷新令牌,通过减少令牌有效期并利用自动刷新机制保持用户体验,从而提高安全性。

集成点

安全实现与以下组件集成:

  • Hertz Web 框架设置:中间件注册和请求处理
  • 数据库模式设计:用户认证数据存储
  • API 响应处理:标准化错误响应和状态码

安全架构为保护面试平台提供了坚实的基础,同时为未来的安全增强保持了灵活性。

点击下方专栏,查看系列内容: