use authz_rpc::ability_server::{Ability, AbilityServer}; use authz_rpc::{AllowReply, AllowRequest}; use envoy_types::ext_authz::v3::pb::{ Authorization, AuthorizationServer, CheckRequest, CheckResponse, }; use envoy_types::ext_authz::v3::{CheckRequestExt, CheckResponseExt}; use hello_world::greeter_server::{Greeter, GreeterServer}; use hello_world::{HelloReply, HelloRequest}; use tonic::{Request, Response, Status, transport::Server}; #[derive(Default)] struct MyServer; #[tonic::async_trait] impl Authorization for MyServer { async fn check( &self, request: Request, ) -> Result, Status> { let request = request.into_inner(); let client_headers = request .get_client_headers() .ok_or_else(|| Status::invalid_argument("client headers not populated by envoy"))?; let mut request_status = Status::unauthenticated("not authorized"); if let Some(authorization) = client_headers.get("authorization") { if authorization == "Bearer valid-token" { request_status = Status::ok("request is valid"); } } Ok(Response::new(CheckResponse::with_status(request_status))) } } pub mod authz_rpc { tonic::include_proto!("authz.rpc"); } #[derive(Debug, Default)] pub struct MyAbility {} #[tonic::async_trait] impl Ability for MyAbility { async fn allowed( &self, request: Request, ) -> Result, Status> { println!("Got a request: {:?}", request); let reply = AllowReply { result: true }; Ok(Response::new(reply)) } } pub mod hello_world { tonic::include_proto!("helloworld"); } #[derive(Debug, Default)] pub struct MyGreeter {} #[tonic::async_trait] impl Greeter for MyGreeter { async fn say_hello( &self, request: Request, ) -> Result, Status> { println!("Got a request: {:?}", request); let reply = HelloReply { message: format!("Hello {}!", request.into_inner().name), }; Ok(Response::new(reply)) } } #[tokio::main] async fn main() -> Result<(), Box> { let addr = "[::1]:50051".parse()?; Server::builder() .add_service(GreeterServer::new(MyGreeter::default())) .add_service(AbilityServer::new(MyAbility::default())) .add_service(AuthorizationServer::new(MyServer::default())) .serve(addr) .await?; Ok(()) }