tlsserver.go 2.58 KB
package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
	"google.golang.org/grpc/status"
	"google.golang.org/protobuf/types/known/emptypb"
	"log"
	"net"
	"pro2d/components/jwt"
	"pro2d/protos/pb"
)

type Server struct {
	pb.UnimplementedHelloServer
}

func (s *Server) CreateToken(ctx context.Context, in *pb.Login) (*pb.TokenInfo, error)  {
	if in.Login == "login" && in.Password == "123456" {
		return &pb.TokenInfo{Token: jwt.CreateToken(in.Login)}, nil
	}
	return nil, fmt.Errorf("login error")
}

//func (s *Server) SayHello(ctx context.Context, empty *emptypb.Empty) (*pb.HelloWorld, error)  {
//	md, ok := metadata.FromIncomingContext(ctx)
//	if !ok {
//		return nil, status.Errorf(codes.Unauthenticated,"ErrNoMetadataInContext")
//	}
//	// md 的类型是 type MD map[string][]string
//	token, ok := md["authorization"]
//	if !ok || len(token) == 0 {
//		return nil, status.Errorf(codes.Unauthenticated,"ErrNoAuthorizationInMetadata")
//	}
//	login := jwt.ParseToken(token[0])
//	return &pb.HelloWorld{Msg: "Hello world: " + login}, nil
//}

func (s *Server) SayHello(ctx context.Context, empty *emptypb.Empty) (*pb.HelloWorld, error)  {
	md, ok := metadata.FromIncomingContext(ctx)
	if !ok {
		return nil, status.Errorf(codes.Unauthenticated, "无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 != "100" || appKey != "token" {
		return nil, status.Errorf(codes.Unauthenticated, "Token认证信息无效: appid=%s, appkey=%s", appId, appKey)
	}

	return &pb.HelloWorld{Msg: "Hello world"}, nil
}
func main() {
	// 监听本地端口
	listener, err := net.Listen("tcp", ":8948")
	if err != nil {
		log.Fatalf("net.Listen err: %v", err)
	}
	var opts []grpc.ServerOption
	// 从输入证书文件和密钥文件为服务端构造TLS凭证
	creds, err := credentials.NewServerTLSFromFile("keys/server.pem", "keys/server.key")
	if err != nil {
		log.Fatalf("Failed to generate credentials %v", err)
	}
	opts = append(opts, grpc.Creds(creds))
	// 新建gRPC服务器实例,并开启TLS认证
	grpcServer := grpc.NewServer(opts...)

	// 在gRPC服务器注册我们的服务
	pb.RegisterHelloServer(grpcServer, &Server{})
	log.Println(" net.Listing whth TLS")
	//用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待,直到进程被杀死或者 Stop() 被调用
	err = grpcServer.Serve(listener)
	if err != nil {
		log.Fatalf("grpcServer.Serve err: %v", err)
	}
}