使用用 Rust 编写的 Actix_Web 服务器,Cors headers 未设置为 Actix_Cors

Cors headers not set with Actix_Cors using Actix_Web server written in Rust

我使用 Actix_Web 在 Rust 中编写了一个 Web 服务器。我正在为生产做准备,所以我想将 Cors 添加到服务器以提高安全性。我已经使用 Actix_Cors 包来做到这一点,并使用基本服务器进行了测试。但是,在调用端点时,未设置 Cors headers 并且服务器接受来自任何客户端的连接,即使我已将其限制在不应工作的域中。我不确定为什么这不起作用,并且已尽我所能对其进行调试。我已完全按照 Actix-Cors 文档中的说明设置我的服务器。谁能帮我弄清楚为什么它不起作用?

主要功能:

use actix_cors::Cors;
use actix_web::{get, http, web, App, HttpRequest, HttpResponse, HttpServer};

#[get("/index.html")]
async fn index(req: HttpRequest) -> &'static str {
    "<p>Hello World!</p>"
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        let cors = Cors::default()
            .allowed_origin("https://www.rust-lang.org/")
            .allowed_origin_fn(|origin, _req_head| origin.as_bytes().ends_with(b".rust-lang.org"))
            .allowed_methods(vec!["GET", "POST"])
            .allowed_headers(vec![http::header::AUTHORIZATION, http::header::ACCEPT])
            .allowed_header(http::header::CONTENT_TYPE)
            .max_age(3600);

        App::new().wrap(cors).service(index)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await;

    Ok(())
}

我的 cargo.toml 是:

[dependencies]
actix-cors = "0.5.4"
actix-web = "3.3.2"

当我调用索引文件时我成功了,但我不应该因为它应该被拒绝或阻止。

GET /index.html HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:8080
User-Agent: HTTPie/2.4.0



HTTP/1.1 200 OK
content-length: 19
content-type: text/plain; charset=utf-8
date: Tue, 04 May 2021 07:47:02 GMT

<p>Hello World!</p>

感谢您的帮助。

我认为您将授权与 CORS 混合在一起。 CORS并不是说你不能直接访问页面,而是说如果你正在访问站点A,在站点A中,一些javascript正在尝试访问站点B上的一些资源,浏览器将决定是否您可以根据 CORS 设置访问站点 B。

在您的情况下,您允许“https://www.rust-lang.org”访问您的站点 (http://127.0.0.1/index.html)。这意味着如果“https://www.rust-lang.org”不知何故想要一个 javascript 代码来访问您的本地站点,浏览器将允许它这样做。但实际上,rust-lang.org 几乎不会尝试访问您的本地主机,因此这只是一个纯粹的 actix cors 代码示例。

我认为您正在寻找的是授权中间件,CORS 不符合您的目的。