我创建了一个像这样的 gRPC Web 服务器:
use tonic_web::GrpcWebLayer;
use tonic::{
transport::Server,
};
let grpc_web_handle = tokio::spawn(
Server::builder()
.accept_http1(true)
.layer(GrpcWebLayer::new())
.add_service(
tonic_web::enable(
AuthServer::new(
AuthImpl::default()
)
)
)
.serve("127.0.0.1:9001".parse()?)
)
//...
但是,我的 Firefox 抱怨 CORS:
OPTIONS http://127.0.0.1:9001/auth.Auth/Login
:
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing)
回应:
HTTP/1.1 400 Bad Request
content-length: 0
date: Wed, 13 Dec 2023 22:25:53 GMT
我还尝试将
AuthServer
包裹成cors(AuthServer::new(...))
fn cors<S>(service: S) -> CorsGrpcWeb<S> where
S: Service<http::Request<hyper::Body>, Response=http::Response<BoxBody>>,
S: Clone + Send + 'static,
S::Future: Send + 'static,
S::Error: Into<BoxError> + Send
{
CorsLayer::permissive().layer(tonic_web::enable(service)).into_inner()
}
仍然无法工作。
tonic = {version = "0.10.2", features = []}
tonic-web = {version = "0.10.2",features = []}
tokio = { version = "1.34.0", features = ["full"] }
我不是中小企业,但从滋补项目中的快速搜索来看,似乎要启用 CORS,您可以使用下面的定义
tower-http = { version = "0.3", features = ["cors"] }
正如他们在此公关中所说的那样
您可以自定义 CORS 配置,与您选择的 cors 层组成 [
]。GrpcWebLayer
还在他们的issues
中找到了这个例子 Server::builder()
.accept_http1(true)
.layer(
CorsLayer::new()
.allow_origin(AllowOrigin::mirror_request())
.allow_credentials(true)
.max_age(DEFAULT_MAX_AGE)
.expose_headers(
DEFAULT_EXPOSED_HEADERS
.iter()
.cloned()
.map(HeaderName::from_static)
.collect::<Vec<HeaderName>>(),
)
.allow_headers(
DEFAULT_ALLOW_HEADERS
.iter()
.cloned()
.map(HeaderName::from_static)
.collect::<Vec<HeaderName>>(),
),
)
.layer(GrpcWebLayer::new())
.add_service(greeter)
.serve(addr)
.await?;