golang轻量级中间件库插件rye支持JWT和CORS功能

Golang轻量级中间件库插件rye支持JWT和CORS功能

⚠️ 注意:该项目已不再积极维护。

简介

rye是一个简单的支持HTTP服务的库。它提供了一个中间件处理器,可以用来链式调用HTTP处理器,同时为DataDog等日志聚合器提供statsd指标统计。此外,rye还内置了各种预建的中间件处理器,支持CORS和速率/CIDR限制等功能。

主要特性

  • 非常轻量 - 核心库仅约143行代码(包括注释)
  • 每个中间件自动获得statsd指标跟踪,包括错误计数器
  • 灵活的中间件组合方式
  • 统一的JSON响应标准化方法
  • 内置CORS等常用中间件支持

安装

import (
    "github.com/cactus/go-statsd-client/statsd"
    "github.com/InVisionApp/rye"
)

JWT和CORS中间件示例

package main

import (
    "fmt"
    "log"
    "net/http"
    
    "github.com/cactus/go-statsd-client/statsd"
    "github.com/InVisionApp/rye"
    "github.com/gorilla/mux"
)

const DEFAULT_STATSD_RATE = 1.0

func main() {
    // 创建statsd客户端
    statsdClient, err := statsd.NewClient("127.0.0.1:8125", "myapp")
    if err != nil {
        log.Fatal(err)
    }
    defer statsdClient.Close()

    // 配置rye
    config := &rye.Config{
        Statter:  statsdClient,
        StatRate: DEFAULT_STATSD_RATE,
    }
    
    // 创建中间件处理器
    middlewareHandler := rye.NewMWHandler(config)
    
    // 使用全局中间件
    middlewareHandler.Use(rye.MiddlewareRouteLogger())
    
    // 创建路由器
    r := mux.NewRouter()
    
    // 添加路由 - 使用CORS和JWT中间件
    r.Handle("/api", middlewareHandler.Handle([]rye.Handler{
        rye.NewMiddlewareCORS("*", "GET, POST", "Authorization"), // CORS中间件
        rye.MiddlewareJWT("your-secret-key"),                     // JWT中间件
        apiHandler,                                               // 实际API处理器
    })).Methods("GET", "POST")
    
    // 启动服务器
    log.Println("Server starting on :8080...")
    log.Fatal(http.ListenAndServe(":8080", r))
}

// API处理器示例
func apiHandler(rw http.ResponseWriter, r *http.Request) *rye.Response {
    // 从上下文中获取JWT
    jwtToken := r.Context().Value(rye.CONTEXT_JWT)
    if jwtToken == nil {
        return &rye.Response{
            StatusCode: http.StatusUnauthorized,
            Err:        fmt.Errorf("missing JWT"),
        }
    }
    
    // 处理请求
    fmt.Fprintf(rw, "Protected API endpoint")
    return nil
}

JWT中间件说明

JWT中间件会将JWT令牌放入请求的Context中,后续中间件可以通过CONTEXT_JWT键访问:

func getJWTfromContext(rw http.ResponseWriter, r *http.Request) *rye.Response {
    // 从Context获取JWT
    jwtToken := r.Context().Value(rye.CONTEXT_JWT)
    
    // 使用JWT...
    log.Printf("JWT Token: %v", jwtToken)
    
    return nil
}

CORS中间件说明

CORS中间件可以这样使用:

// 使用默认配置
rye.MiddlewareCORS()

// 或自定义配置
rye.NewMiddlewareCORS(
    "*",                     // 允许的源
    "GET, POST, PUT",        // 允许的方法
    "Authorization, X-My-Header" // 允许的头部
)

中间件列表

名称 描述
Access Token 提供访问令牌验证
CIDR 提供请求IP白名单
CORS 为路由提供CORS功能
JWT 提供JWT验证
Route Logger 为路由提供基本日志记录

注意事项

  • 项目已不再积极维护
  • 核心库非常轻量
  • 内置了对statsd的支持
  • 支持Golang 1.7+的Context功能

希望这个示例能帮助你了解如何使用rye的JWT和CORS功能!


更多关于golang轻量级中间件库插件rye支持JWT和CORS功能的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级中间件库插件rye支持JWT和CORS功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Rye: Golang轻量级中间件库插件

Rye是一个轻量级的Go中间件库,它提供了简单易用的中间件功能,包括JWT认证和CORS支持。下面我将详细介绍rye的这两个核心功能以及如何使用它们。

Rye简介

Rye是一个微型的Go中间件库,它的设计目标是简单、轻量且易于使用。它不依赖任何外部库,非常适合小型项目或需要精简中间件的场景。

JWT认证

Rye提供了JWT(JSON Web Token)认证中间件,可以方便地保护你的API端点。

基本用法

package main

import (
	"net/http"
	
	"github.com/InVisionApp/rye"
)

func main() {
	// 创建JWT配置
	jwtConfig := rye.Config{
		JWTSecret:         "your-secret-key", // 替换为你的密钥
		JWTIssuer:         "your-app",        // 可选: 签发者
		JWTIdent:          "user-id",         // 可选: 用户标识字段名
		JWTPrefix:         "Bearer",          // 可选: token前缀
		JWTRedisHost:      "",                // 可选: Redis主机(如果需要Redis验证)
		JWTRedisDB:        0,                 // 可选: Redis数据库
		JWTRedisNamespace: "",                // 可选: Redis命名空间
	}

	// 创建JWT中间件
	jwtMiddleware := rye.NewJWTMiddleware(jwtConfig)

	// 受保护的路由
	protectedHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 从上下文中获取用户ID
		userID := r.Context().Value("user-id").(string)
		w.Write([]byte("Hello, " + userID))
	})

	// 应用中间件
	http.Handle("/protected", jwtMiddleware.Handler(protectedHandler))

	// 启动服务器
	http.ListenAndServe(":8080", nil)
}

自定义验证

你可以自定义JWT验证逻辑:

jwtMiddleware := rye.NewJWTMiddleware(jwtConfig).WithValidation(func(token *jwt.Token) (bool, error) {
    // 自定义验证逻辑
    if claims, ok := token.Claims.(jwt.MapClaims); ok {
        if claims["role"] != "admin" {
            return false, nil
        }
    }
    return true, nil
})

CORS支持

Rye提供了简单的CORS(跨域资源共享)中间件,可以轻松处理跨域请求。

基本用法

package main

import (
	"net/http"
	
	"github.com/InVisionApp/rye"
)

func main() {
	// 创建CORS中间件
	corsMiddleware := rye.NewCorsMiddleware(rye.CorsConfig{
		AllowedOrigins: []string{"*"},                      // 允许的源
		AllowedMethods: []string{"GET", "POST", "OPTIONS"}, // 允许的方法
		AllowedHeaders: []string{"Content-Type"},           // 允许的头部
		AllowCredentials: true,                             // 是否允许凭据
		MaxAge:           86400,                            // 预检请求缓存时间(秒)
	})

	// 示例处理程序
	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello, CORS!"))
	})

	// 应用中间件
	http.Handle("/", corsMiddleware.Handler(handler))

	// 启动服务器
	http.ListenAndServe(":8080", nil)
}

动态CORS配置

你可以根据请求动态配置CORS:

corsMiddleware := rye.NewCorsMiddleware(rye.CorsConfig{
    // 基本配置
}).WithOriginValidator(func(origin string) bool {
    // 自定义源验证逻辑
    return strings.HasSuffix(origin, ".example.com")
})

组合使用JWT和CORS

在实际应用中,你通常会同时使用多个中间件:

package main

import (
	"net/http"
	
	"github.com/InVisionApp/rye"
)

func main() {
	// JWT配置
	jwtConfig := rye.Config{
		JWTSecret: "your-secret-key",
	}
	jwtMiddleware := rye.NewJWTMiddleware(jwtConfig)

	// CORS配置
	corsMiddleware := rye.NewCorsMiddleware(rye.CorsConfig{
		AllowedOrigins: []string{"*"},
		AllowedMethods: []string{"GET", "POST", "OPTIONS"},
	})

	// 受保护的处理程序
	protectedHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		userID := r.Context().Value("user-id").(string)
		w.Write([]byte("Hello, " + userID))
	})

	// 创建中间件链
	// 注意顺序: CORS应该在最外层
	handlerChain := corsMiddleware.Handler(
		jwtMiddleware.Handler(protectedHandler),
	)

	http.Handle("/api", handlerChain)
	http.ListenAndServe(":8080", nil)
}

优势与限制

优势

  1. 轻量级,无外部依赖
  2. 简单易用的API
  3. 支持基本的JWT和CORS功能
  4. 可扩展的验证逻辑

限制

  1. 功能相对基础,缺少一些高级特性
  2. 文档和社区支持较少
  3. 不如一些更成熟的库(如gorilla/mux)功能丰富

总结

Rye是一个适合小型项目的轻量级中间件库,特别是当你只需要基本的JWT和CORS功能时。它的简单性和无依赖性使其成为精简项目的良好选择。对于更复杂的需求,你可能需要考虑更全面的解决方案如Gin或Echo框架的内置中间件。

回到顶部