Настройка CORS в Actix-Web: несколько методов с примерами кода

Настройка CORS в Actix-Web

Обмен ресурсами между источниками (CORS) – это механизм, который позволяет запрашивать ограниченные ресурсы на веб-странице из другого домена, находящегося за пределами домена, из которого произошел ресурс. В Actix-Web вы можете легко настроить CORS для включения запросов между источниками и управления разрешенными источниками, методами, заголовками и другими параметрами. В этой статье мы рассмотрим несколько методов настройки CORS в Actix-Web, а также примеры кода.

Метод 1: использование контейнера actix-cors
Крейт actix-corsпредоставляет промежуточное программное обеспечение для включения CORS в Actix-Web. Чтобы использовать его, добавьте в файл Cargo.tomlследующую зависимость:

[dependencies]
actix-cors = "0.5"

Затем в вашем приложении Actix-Web добавьте промежуточное программное обеспечение Corsв конвейер вашего приложения, связав его с функцией wrap:

use actix_web::{web, App, HttpResponse, HttpServer};
use actix_cors::Cors;
async fn index() -> HttpResponse {
    HttpResponse::Ok().body("Hello, CORS!")
}
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .wrap(
                Cors::default()
                    .allowed_origin("http://example.com")
                    .allowed_methods(vec!["GET", "POST"])
                    .allowed_headers(vec![http::header::AUTHORIZATION, http::header::ACCEPT])
                    .max_age(3600)
            )
            .service(web::resource("/").to(index))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

В этом примере мы разрешаем запросы из источника http://example.com, разрешаем только методы GETи POST, разрешаем Authorizationи Acceptи установите максимальный срок предполетного запроса на 3600 секунд.

Метод 2: реализация промежуточного программного обеспечения CORS вручную
Если вы предпочитаете не использовать отдельный контейнер, вы можете вручную реализовать промежуточное программное обеспечение CORS в Actix-Web. Вот пример:

use actix_web::{web, App, HttpResponse, HttpServer, middleware::Logger};
use actix_web::http::header;
async fn index() -> HttpResponse {
    HttpResponse::Ok().body("Hello, CORS!")
}
fn cors_middleware() -> impl actix_web::middleware::Transform<
    actix_web::dev::ServiceRequest,
    Service = actix_web::dev::ServiceResponse,
    Error = actix_web::Error,
    InitError = (),
> {
    middleware::new(move |req, srv| {
        let fut = srv.call(req);
        async {
            let mut res = fut.await?;
            res.headers_mut().insert(
                header::ACCESS_CONTROL_ALLOW_ORIGIN,
                header::HeaderValue::from_static("*"),
            );
            res.headers_mut().insert(
                header::ACCESS_CONTROL_ALLOW_METHODS,
                header::HeaderValue::from_static("GET, POST, PUT, DELETE"),
            );
            Ok(res)
        }
    })
}
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .wrap(Logger::default())
            .wrap(cors_middleware())
            .service(web::resource("/").to(index))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

В этом примере мы вручную реализуем функцию промежуточного программного обеспечения под названием cors_middleware, которая добавляет в ответ необходимые заголовки CORS.