diff --git a/backend/Cargo.toml b/backend/Cargo.toml index b2ebfdb5d9..dcb320f97c 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -76,7 +76,7 @@ headers = "^0" hyper = { version = "^0", features = ["full"] } tokio = { version = "^1", features = ["full", "tracing"] } tower = "^0" -tower-http = { version = "^0", features = ["trace"] } +tower-http = { version = "^0", features = ["trace", "cors"] } tower-cookies = "^0" serde = "^1" serde_json = { version = "^1", features = ["preserve_order"] } diff --git a/backend/windmill-api/src/lib.rs b/backend/windmill-api/src/lib.rs index b31c999bc7..a8fc433113 100644 --- a/backend/windmill-api/src/lib.rs +++ b/backend/windmill-api/src/lib.rs @@ -11,11 +11,15 @@ use argon2::Argon2; use axum::{middleware::from_extractor, routing::get, Extension, Router}; use db::DB; use git_version::git_version; +use hyper::Method; use reqwest::Client; use std::{net::SocketAddr, sync::Arc}; use tower::ServiceBuilder; use tower_cookies::CookieManagerLayer; -use tower_http::trace::TraceLayer; +use tower_http::{ + cors::{Any, CorsLayer}, + trace::TraceLayer, +}; use windmill_common::utils::rd_string; use crate::{ @@ -100,6 +104,11 @@ pub async fn run_server( .layer(Extension(auth_cache.clone())) .layer(CookieManagerLayer::new()) .layer(Extension(WebhookShared::new(rx.resubscribe(), db.clone()))); + + let cors = CorsLayer::new() + .allow_methods([Method::GET, Method::POST]) + .allow_origin(Any); + // build our application with a route let app = Router::new() .nest( @@ -109,7 +118,7 @@ pub async fn run_server( "/w/:workspace_id", Router::new() .nest("/scripts", scripts::workspaced_service()) - .nest("/jobs", jobs::workspaced_service()) + .nest("/jobs", jobs::workspaced_service().layer(cors.clone())) .nest( "/users", users::workspaced_service().layer(Extension(argon2.clone())), @@ -136,16 +145,24 @@ pub async fn run_server( .nest("/workers", worker_ping::global_service()) .nest("/scripts", scripts::global_service()) .nest("/flows", flows::global_service()) - .nest("/apps", apps::global_service()) + .nest("/apps", apps::global_service().layer(cors.clone())) .nest("/schedules", schedule::global_service()) .route_layer(from_extractor::()) .route_layer(from_extractor::()) .nest( "/w/:workspace_id/apps_u", - apps::unauthed_service().layer(from_extractor::()), + apps::unauthed_service() + .layer(from_extractor::()) + .layer(cors.clone()), + ) + .nest( + "/w/:workspace_id/jobs_u", + jobs::global_service().layer(cors.clone()), + ) + .nest( + "/w/:workspace_id/capture_u", + capture::global_service().layer(cors), ) - .nest("/w/:workspace_id/jobs_u", jobs::global_service()) - .nest("/w/:workspace_id/capture_u", capture::global_service()) .nest( "/auth", users::make_unauthed_service().layer(Extension(argon2)),