从grpc上下文中提取元数据用于认证 案例
interceptor.go
package server
import (
"context"
"errors"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"strings"
)
// UnaryInterceptor 是一个 unary RPC 的拦截器,用于在处理请求前进行身份认证。
// 参数:
//
// ctx - 上下文,用于传递请求相关的元数据。
// req - 请求的数据。
// info - 包含被拦截的 RPC 方法的信息。
// handler - 下游的处理器,用于执行实际的 RPC 方法。
//
// 返回值:
//
// 响应数据和可能的错误。
func UnaryInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
// 在执行实际的处理函数前进行身份认证。
err = auth(ctx)
if err != nil {
return nil, err
}
// 身份认证通过后,调用实际的处理函数。
return handler(ctx, req)
}
// StreamInterceptor 是一个 streaming RPC 的拦截器,用于在处理请求前进行身份认证。
// 参数:
//
// srv - 服务器的实现。
// ss - 服务器流,用于读取请求和写入响应。
// info - 包含被拦截的 streaming RPC 方法的信息。
// handler - 下游的处理器,用于执行实际的 streaming RPC 方法。
//
// 返回值:
//
// 可能的错误。
func StreamInterceptor(srv any, ss grpc.ServerStream