diff --git a/client/main.go b/client/main.go index 5fa33da..3e0caf2 100644 --- a/client/main.go +++ b/client/main.go @@ -4,19 +4,37 @@ import ( "context" "encoding/json" "log" + "time" "google.golang.org/grpc" + "google.golang.org/grpc/metadata" "myschools.me/suguo/protobuf-demo/gen" "myschools.me/suguo/protobuf-demo/model" ) +//interceptor 客户端拦截器 +func interceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + start := time.Now() + err := invoker(ctx, method, req, reply, cc, opts...) + log.Printf("method == %s ; req == %v ; rep == %v ; duration == %s ; error == %v\n", method, req, reply, time.Since(start), err) + return err +} + func main() { - rpc, err := grpc.Dial("127.0.0.1:53637", grpc.WithBlock(), grpc.WithInsecure()) + rpc, err := grpc.Dial("127.0.0.1:55887", grpc.WithBlock(), grpc.WithInsecure(), grpc.WithUnaryInterceptor(interceptor)) if err != nil { log.Fatalln(err) } srv := gen.NewDemoClient(rpc) - resp, err := srv.Call(context.Background(), &gen.DemoCallResquest{ + rtx, cancel := context.WithTimeout(context.Background(), time.Second) + rtx = context.WithValue(rtx, "token", "hello") + defer cancel() + defer rpc.Close() + + md := metadata.MD{} + md.Set("token", "hello") + rtx = metadata.NewOutgoingContext(rtx, md) + resp, err := srv.Call(rtx, &gen.DemoCallResquest{ C1: "hello", }) if err != nil { diff --git a/middleware/auth-middleware.go b/middleware/auth-middleware.go new file mode 100644 index 0000000..f1d49da --- /dev/null +++ b/middleware/auth-middleware.go @@ -0,0 +1,35 @@ +package middleware + +import ( + "context" + "log" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// Interceptor 拦截器 +func Interceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + // 进行认证 + log.Println("interceptor...") + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + return nil, grpc.Errorf(codes.Unauthenticated, "no token ") + } + + // md 是一个 map[string][]string 类型的 + val, ok := md["token"] + if !ok { + if val == nil { + return nil, grpc.Errorf(codes.Unauthenticated, "token is null") + } + } + + if val[0] != "hello" { + return nil, grpc.Errorf(codes.Unauthenticated, "token invalide: token=%s", val[0]) + } + + // 继续处理请求 + return handler(ctx, req) +} diff --git a/server/main.go b/server/main.go index ed4f74a..3e56c64 100644 --- a/server/main.go +++ b/server/main.go @@ -7,10 +7,11 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/reflection" "myschools.me/suguo/protobuf-demo/gen" + "myschools.me/suguo/protobuf-demo/middleware" ) func main() { - rpc := grpc.NewServer(grpc.MaxRecvMsgSize(1024*1024), grpc.MaxSendMsgSize(1024*1024)) + rpc := grpc.NewServer(grpc.MaxRecvMsgSize(1024*1024), grpc.MaxSendMsgSize(1024*1024), grpc.UnaryInterceptor(middleware.Interceptor)) //register gen.RegisterDemoServer(rpc, &Demo{})