使用 tonic-web 时允许 CORS 标头

问题描述 投票:0回答:1

我创建了一个像这样的 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"] }
rust cors grpc tonic
1个回答
0
投票

我不是中小企业,但从滋补项目中的快速搜索来看,似乎要启用 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?;
© www.soinside.com 2019 - 2024. All rights reserved.