grpc拦截器+metadata进行接口统一校验

ops/2024/11/23 3:54:32/

grpc拦截器+metadata进行接口统一校验

    • hello.proto
    • proto生成go文件命令
    • client.go
      • 方法一:自定义拦截器,实现统一参数校验
      • 方法二:使用grpc内置拦截器,需要自定义结构体,实现credentials.PerRPCCredentials接口中的方法
    • server.go

hello.proto

go">syntax = "proto3";option go_package ="./;proto";service Server {rpc SayHello(HelloReq) returns (HelloRes);
}message HelloReq{string name = 1;
}message HelloRes{string msg = 1;
}

go_19">proto生成go文件命令

go">protoc --go_out=. --go-grpc_out=. hello.proto

go_23">client.go

方法一:自定义拦截器,实现统一参数校验

go">package mainimport ("Go_Bible/grpc_token_auth_test/proto""context""fmt""google.golang.org/grpc""google.golang.org/grpc/metadata"
)func main() {/*自定义拦截器,搭配metadata元数据,进行登录验证*/authInterceptor := func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {//fmt.Println("客户端封装metadata,封装auth")// 手动创建元数据md := metadata.New(map[string]string{"appid":      "10010","access_key": "1234",})// 创建出站请求的上下文ctx = metadata.NewOutgoingContext(ctx, md)err := invoker(ctx, method, req, reply, cc, opts...)if err != nil {fmt.Println("客户端接口调用错误-->" + err.Error())}return err}// 放入拦截器opt := grpc.WithUnaryInterceptor(authInterceptor)var opts []grpc.DialOptionopts = append(opts, opt)opts = append(opts, grpc.WithInsecure())conn, err := grpc.Dial("localhost:15001", opts...)if err != nil {panic("客户端拨号失败-->" + err.Error())}client := proto.NewServerClient(conn)res, err := client.SayHello(context.Background(), &proto.HelloReq{Name: "kevin",})if err != nil {panic("客户端调用SayHello接口失败-->" + err.Error() + "\n")}fmt.Println("客户端调用接口成功:" + res.Msg)
}

grpccredentialsPerRPCCredentials_73">方法二:使用grpc内置拦截器,需要自定义结构体,实现credentials.PerRPCCredentials接口中的方法

go">package mainimport ("Go_Bible/grpc_token_auth_test/proto""context""fmt""google.golang.org/grpc"
)type customCredential struct{}// 获取元数据接口,自定义验证相关的元数据
func (c customCredential) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error){return map[string]string{"appid" : "10010","access_key" : "1234",}, nil
}// 是否安全传输
func (c customCredential) RequireTransportSecurity() bool{return false
}func main() {///*自定义拦截器,搭配metadata元数据,进行登录验证*///authInterceptor := func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {//	//fmt.Println("客户端封装metadata,封装auth")//	// 手动创建元数据//	md := metadata.New(map[string]string{//		"appid":      "10010",//		"access_key": "1234",//	})//	// 创建出站请求的上下文//	ctx = metadata.NewOutgoingContext(ctx, md)//	err := invoker(ctx, method, req, reply, cc, opts...)//	if err != nil {//		fmt.Println("客户端接口调用错误-->" + err.Error())//	}//	return err//}// 放入拦截器//opt := grpc.WithUnaryInterceptor(authInterceptor)// 创建验证相关的拦截器opt := grpc.WithPerRPCCredentials(customCredential{})var opts []grpc.DialOptionopts = append(opts, opt)opts = append(opts, grpc.WithInsecure())conn, err := grpc.Dial("localhost:15001", opts...)if err != nil {panic("客户端拨号失败-->" + err.Error())}client := proto.NewServerClient(conn)res, err := client.SayHello(context.Background(), &proto.HelloReq{Name: "kevin",})if err != nil {panic("客户端调用SayHello接口失败-->" + err.Error() + "\n")}fmt.Println("客户端调用接口成功:" + res.Msg)
}

go_142">server.go

go">package mainimport ("Go_Bible/grpc_token_auth_test/proto""context""fmt""google.golang.org/grpc""google.golang.org/grpc/codes""google.golang.org/grpc/metadata""google.golang.org/grpc/status""net"
)type Server struct {proto.UnimplementedServerServer
}func (s *Server) SayHello(ctx context.Context, req *proto.HelloReq) (*proto.HelloRes, error) {return &proto.HelloRes{Msg: "Hello : " + req.Name,}, nil
}func main() {// 创建验证拦截器interceptor := func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {fmt.Println("服务端开始对接口拦截")/*开始解析元数据,进行接口验证*/md, ok := metadata.FromIncomingContext(ctx)if !ok {fmt.Println("服务端获取元数据失败")return resp, status.Error(codes.Unauthenticated, "服务端获取metadata失败")}var (appid      stringaccess_key string)if val, ok := md["appid"]; ok {appid = val[0]}if val, ok := md["access_key"]; ok {access_key = val[0]}// 对appid跟access_token进行验证if appid != "10010" || access_key != "1234" {return resp, status.Error(codes.Unauthenticated, "服务端接口校验失败")}fmt.Println("服务端接口统一校验通过")// 校验通过,继续调用接口resp, err = handler(ctx, req)fmt.Println("服务端接口拦截结束")return resp, err}// 注册拦截器opt := grpc.UnaryInterceptor(interceptor)var opts []grpc.ServerOptionopts = append(opts, opt)// 创建服务server := grpc.NewServer(opts...)// 注册服务proto.RegisterServerServer(server, &Server{})lis, err := net.Listen("tcp", "0.0.0.0:15001")if err != nil {panic("服务端监听失败-->" + err.Error())}err = server.Serve(lis)if err != nil {panic("服务端开启服务失败-->" + err.Error())}
}

http://www.ppmy.cn/ops/32475.html

相关文章

Redis简介

Redis 是一个开源的高性能键值对存储系统,它支持多种类型的数据结构,如字符串(strings)、列表(lists)、哈希(hashes)、集合(sets)、有序集合(sort…

arm 交叉编译 thumb 与 arm 指令的方法

arm 交叉编译 thumb 与 arm 指令的方法 本文实现了在 x86 的 ubuntu 的机器上,使用 arm-linux-gnueabihf-gcc 交叉编译链工具,编译出在 arm 开发板上可以运行的 thumb 指令集的可执行文件。后续会使用 vscode 使用网络进行远程调试。 1. 编译器 arm-li…

【已解决】VSCode 连接远程 Ubuntu :检测到 #include 错误。请更新 includePath。

文章目录 1. 环境声明2. 解决过程 1. 环境声明 即使是同一个报错,在不同的环境中,报错原因、解决方法都是不同的,本文只能解决跟我类似的问题,如果你发现你跟我遇到的问题不太一样,建议寻找其他解法。 必须要吐槽的是…

【vulhub靶场】Tomcat中间件漏洞复现

【vulhub靶场】Tomcat中间件漏洞复现 一、Tomcat AJP 任意文件读取/包含漏洞 (CVE-2020-1938)1. 漏洞描述2. 影响版本3. 漏洞原理4. 漏洞复现 二、任意文件写入漏洞 (CVE-2017-12615)1. 漏洞原理2. 影响版本3. 漏洞复现 三、Tomca…

哈希表实现-哈希桶法

哈希桶方法 由于直接定值法实现哈希表有着明显的弊端——如果多个节点的hash值相同会往后堆积,所以衍生出哈希桶方法 我们的哈希表设置成一个结点指针数组,每个哈希值对应的是一串链表,形状就像一个一个的桶我们就会把hash值相同的节点放到一…

PHP 反序列化

一、PHP 序列化 1、对象的序列化 <?php class people{public $nameGaming;private $NationLiyue;protected $Birthday12/22;public function say(){echo "老板你好呀&#xff0c;我是和记厅的镖师&#xff0c;叫我嘉明就行&#xff0c;要运货吗你&#xff1f;"…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

初识C语言——第九天

ASCII定义 在 C 语言中&#xff0c;每个字符都对应一个 ASCII 码。ASCII 码是一个字符集&#xff0c;它定义了许多常用的字符对应的数字编码。这些编码可以表示为整数&#xff0c;也可以表示为字符类型。在 C 语言中&#xff0c;字符类型被定义为一个整数类型&#xff0c;它占…