diff --git a/src/client.rs b/src/client.rs index d52f572..d8010f8 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,12 +1,18 @@ mod grpc; use tokio_stream::{self as stream}; -use tonic::Request; +use tonic::{metadata::MetadataValue, transport::Channel, Request}; use grpc::dummy::{test_service_client::TestServiceClient, Empty, SomeRequest, StreamRequest}; #[tokio::main] async fn main() -> Result<(), Box> { - let mut client = TestServiceClient::connect("http://[::1]:50051").await?; + let channel = Channel::from_static("http://[::1]:50051").connect().await?; + let token: MetadataValue<_> = "Bearer some-secret-token".parse()?; + let mut client = TestServiceClient::with_interceptor(channel, move |mut req: Request<_>| { + println!("Request: {:?}", req); + req.metadata_mut().insert("authorization", token.clone()); + Ok(req) + }); let request = Request::new(SomeRequest { what_client_sends: String::from("Hello from client!") }); diff --git a/src/server.rs b/src/server.rs index 7a50bc3..7942714 100644 --- a/src/server.rs +++ b/src/server.rs @@ -3,11 +3,12 @@ use grpc::dummy; use std::pin::Pin; use tokio_stream::{wrappers::ReceiverStream, Stream, StreamExt}; use tonic::async_trait; +use tonic::metadata::MetadataValue; use tonic::{transport::Server, Request, Response, Status}; use dummy::{ - test_service_server::{TestService, TestServiceServer}, - Empty, SomeRequest, SomeResponse, StreamRequest, StreamResponse, + test_service_server::TestService, Empty, SomeRequest, SomeResponse, StreamRequest, + StreamResponse, }; #[derive(Debug, Default)] @@ -90,8 +91,20 @@ async fn main() -> Result<(), Box> { let service = MyTestService::default(); println!("Starting gRPC server on {}", addr); + let service = + dummy::test_service_server::TestServiceServer::with_interceptor(service, check_auth); - Server::builder().add_service(TestServiceServer::new(service)).serve(addr).await?; + Server::builder().add_service(service).serve(addr).await?; Ok(()) } + +fn check_auth(req: Request<()>) -> Result, Status> { + let token: MetadataValue<_> = "Bearer some-secret-token".parse().unwrap(); + println!("Request: {:?}", req); + + match req.metadata().get("authorization") { + Some(t) if token == t => Ok(req), + _ => Err(Status::unauthenticated("No valid auth token")), + } +}