//生成私钥 openssl genrsa -out server.key 2048 //生成证书 openssl req -new -x509 -sha256 -key server.key -out server.crt -days 36500 //按照提示输入如下信息 国家名称 Country Name (2 letter code) [AU]: //省名称 State or Province Name (full name) [Some-State]: //城市名称 Locality Name (eg, city) []: //理解为公司名称 Organization Name (eg, company) [Internet Widgits Pty Ltd]: //理解为你所在部门的名称 Organizational Unit Name (eg, section) []: //你的服务器名称(网站名称) Common Name (e.g. server FQDN or YOUR name) []: //联系邮箱 Email Address []:
func StartServer() { lis, err := net.Listen("tcp", "127.0.0.1:8090") if err != nil { log.Fatalf("failed to listen: %v", err) } // TLS认证 // 两个入参分别是 (certFile, keyFile string) // 自签名证书文件和私钥文件 creds, err := credentials.NewServerTLSFromFile("cert", "key") //创建grpcServer传入证书 gRpcServer := grpc.NewServer(grpc.Creds(creds)) pb.RegisterHelloServiceServer(gRpcServer, &HelloServiceServer{}) gRpcServer.Serve(lis) }
func StartClient() { // TLS认证 creds, err := credentials.NewClientTLSFromFile("cert", "ServerName") //连接服务器 conn, err := grpc.Dial("127.0.0.1:8090",grpc.WithTransportCredentials(creds) ) if err != nil{ fmt.Println(err) return } c := pb.NewHelloServiceClient(conn) // ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() r, err := c.HelloWorldClientAndServerStream(ctx, grpc.EmptyCallOption{}) if err != nil { log.Fatalf("%v", err) return } r.Send(&pb.HelloRequest{Request: "my is golang gRpc client "}) r.CloseSend() }
type PerRPCCredentials interface { GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) RequireTransportSecurity() bool }
//自定义token认证 type CustomerTokenAuth struct { } //获取元数据 func (c CustomerTokenAuth) GetRequestMetadata(ctx context.Context, uri...string) (map[string]string, error) { return map[string]string{ "appId": "master", "appkey": "1aqfs5g456j", }, nil } //是否开启传输安全 TLS func (c CustomerTokenAuth) RequireTransportSecurity() bool { return false }
var opts []grpc.DialOption //grpc.WithInsecure()这个是一定要添加的,代表开启安全的选项 opts =append(opts,grpc.WithInsecure()) //添加自定义token验证 opts = append(opts,grpc.WithPerRPCCredentials(new(CustomerTokenAuth))) //连接服务端 conn, err := grpc.Dial("127.0.0.1:8090",opts...)
type HelloServiceServer struct { } //这是服务端实现的一个方法 func (*HelloServiceServer2) HelloWorld(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) { //获取元数据信息 md,ok := metadata.FromIncomingContext(ctx) if !ok { return nil,errors.New("未传输token") } var ( appId string appKey string ) if val, ok := md["appId"]; ok { appid = val[0] } if val, ok := md["appKey"]; ok { appkey = val[0] } //进行校验的信息是否正确 if appid != "123" || appkey != "456" { return nil, errors.New("token传输不正确") } return &pb.HelloResponse{Response: "hello my is gRpcServer"}, nil }
本文分享自微信公众号 - GoLang那点事(aweiaichitudou),作者:那小子阿伟
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2019-09-08
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句