服务端 authentication拦截,主要基于 拦截器!
    客户端的拦截,主要基于grpc对 authentication的封装,WithPerRPCCredentials()

    实现方式:

    1. func main() {
    2. flag.Parse()
    3. fmt.Printf("server starting on port %d...\n", *port)
    4. cert, err := tls.LoadX509KeyPair(testdata.Path("server1.pem"), testdata.Path("server1.key"))
    5. if err != nil {
    6. log.Fatalf("failed to load key pair: %s", err)
    7. }
    8. opts := []grpc.ServerOption{
    9. // The following grpc.ServerOption adds an interceptor for all unary
    10. // RPCs. To configure an interceptor for streaming RPCs, see:
    11. // https://godoc.org/google.golang.org/grpc#StreamInterceptor
    12. grpc.UnaryInterceptor(ensureValidToken),
    13. // Enable TLS for all incoming connections.
    14. grpc.Creds(credentials.NewServerTLSFromCert(&cert)),
    15. }
    16. s := grpc.NewServer(opts...)
    17. pb.RegisterEchoServer(s, &ecServer{})
    18. lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
    19. if err != nil {
    20. log.Fatalf("failed to listen: %v", err)
    21. }
    22. if err := s.Serve(lis); err != nil {
    23. log.Fatalf("failed to serve: %v", err)
    24. }
    25. }
    func main() {
        flag.Parse()
    
        // Set up the credentials for the connection.
        perRPC := oauth.NewOauthAccess(fetchToken())
        creds, err := credentials.NewClientTLSFromFile(testdata.Path("ca.pem"), "x.test.youtube.com")
        if err != nil {
            log.Fatalf("failed to load credentials: %v", err)
        }
        opts := []grpc.DialOption{
            // In addition to the following grpc.DialOption, callers may also use
            // the grpc.CallOption grpc.PerRPCCredentials with the RPC invocation
            // itself.
            // See: https://godoc.org/google.golang.org/grpc#PerRPCCredentials
            grpc.WithPerRPCCredentials(perRPC),
            // oauth.NewOauthAccess requires the configuration of transport
            // credentials.
            grpc.WithTransportCredentials(creds),
        }
    
        opts = append(opts, grpc.WithBlock())
        conn, err := grpc.Dial(*addr, opts...)
        if err != nil {
            log.Fatalf("did not connect: %v", err)
        }
        defer conn.Close()
        rgc := ecpb.NewEchoClient(conn)
    
        callUnaryEcho(rgc, "hello world")
    }