Securing your APIs is crucial, especially when dealing with cross-origin resource sharing (CORS). Without proper CORS configuration, your API could be vulnerable to malicious attacks. This guide will walk you through the process of installing and configuring FastAPI middleware CORS to ensure your API remains secure, much like how proper schema markup enhances search engine ranking.
Understanding CORS in FastAPI
Cross-Origin Resource Sharing (CORS) is a mechanism that allows restricted resources on a web page to be requested from another domain outside the domain from which the resource originated. In web security, CORS plays a vital role by preventing unauthorized access to resources across different domains, much like an seo keyword analyzer helps with search rankings.
In FastAPI, CORS is managed through the CORSMiddleware. This middleware allows you to specify which origins, methods, and headers are allowed to make requests to your API. By configuring CORS correctly, you can ensure that only trusted sources can interact with your API, enhancing security and preventing potential vulnerabilities.
Quick Start: Installing FastAPI Middleware CORS
To get started with CORS in FastAPI, you need to install the necessary dependencies and configure the middleware. Here’s a step-by-step guide:
-
Install FastAPI and Uvicorn: If you haven't already installed FastAPI and Uvicorn, you can do so using pip:
bash pip install fastapi uvicorn -
Set up a basic FastAPI application: Create a file named
main.pyand set up a minimal FastAPI application: ```python from fastapi import FastAPI
app = FastAPI()
@app.get("/") def read_root(): return {"message": "Hello, World!"} ```
- Install the CORS middleware:
Import the
CORSMiddlewarefromfastapi.middleware.corsand add it to your FastAPI application: ```python from fastapi.middleware.cors import CORSMiddleware
app.add_middleware( CORSMiddleware, allow_origins=[""], # Allow all origins allow_credentials=True, allow_methods=[""], # Allow all methods allow_headers=["*"], # Allow all headers ) ```
- Run your FastAPI application:
Start your FastAPI application using Uvicorn:
bash uvicorn main:app --reload
With these steps, you have successfully installed the CORS middleware in your FastAPI application.
Production Hardening: Configuring CORS Middleware in FastAPI
The CORSMiddleware provides several configuration options to tailor the CORS behavior to your needs. Here are the most commonly used options:
allow_origins: A list of origins that should be permitted to make cross-origin requests. You can also use"*"to allow all origins.allow_methods: A list of HTTP methods that should be allowed for cross-origin requests. Common values include["GET", "POST", "PUT", "DELETE"].allow_headers: A list of HTTP headers that should be allowed for cross-origin requests.allow_credentials: A boolean indicating whether the request can include user credentials like cookies, authorization headers, or TLS client certificates.allow_origin_regex: A regular expression pattern that matches the origins to be allowed. This is useful for dynamic origin matching.
Here’s an example of a more detailed configuration:
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["https://example.com", "https://sub.example.com"],
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Content-Type", "Authorization"],
allow_origin_regex="https://.*\.example\.com",
)
Using Regex for Dynamic Origin Matching
If you need to allow multiple subdomains or a range of origins, you can use the allow_origin_regex option. For example, to allow all subdomains of example.com, you can use the following regex:
app.add_middleware(
CORSMiddleware,
allow_origin_regex="https://.*\.example\.com",
)
This configuration ensures that any subdomain of example.com can make cross-origin requests to your API.
Advanced Configuration for Enhanced Security
For enhanced security, consider the following advanced configurations:
-
Limiting Allowed Methods: Instead of allowing all methods, specify only the methods that are necessary for your API. For example, if your API only requires GET and POST requests, configure it as follows:
python app.add_middleware( CORSMiddleware, allow_methods=["GET", "POST"], ) -
Specifying Allowed Headers: Similarly, limit the allowed headers to only those required by your API. This reduces the risk of exposing sensitive information:
python app.add_middleware( CORSMiddleware, allow_headers=["Content-Type", "Authorization"], ) -
Disabling Credentials for Public Endpoints: If your API has public endpoints that do not require authentication, disable credentials to further enhance security:
python app.add_middleware( CORSMiddleware, allow_credentials=False, )
The CORSMiddleware also supports more fine-grained control over the CORS configuration, such as specifying different settings for different paths or methods. This can be achieved by using the CORSMiddleware with a router or by using multiple instances of the CORSMiddleware with different configurations.
Additionally, it's essential to consider the impact of CORS on your API's security when designing your API. For example, if your API uses cookies or other credentials, you should ensure that the allow_credentials option is set correctly to prevent unauthorized access.
To further illustrate the flexibility of the CORSMiddleware, let's consider an example where we want to allow CORS requests from a specific domain, but only for a specific path:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["https://example.com"],
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Content-Type", "Authorization"],
)
@app.get("/public")
def read_public():
return {"message": "Hello, World!"}
@app.get("/private")
def read_private():
return {"message": "Private endpoint"}
# Allow CORS requests from https://example.com for the /private endpoint
app.add_middleware(
CORSMiddleware,
allow_origins=["https://example.com"],
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Content-Type", "Authorization"],
route="/private",
)
In this example, we've added a second instance of the CORSMiddleware with a specific configuration for the /private endpoint. This allows CORS requests from https://example.com for the /private endpoint, while still allowing CORS requests from all origins for the /public endpoint.
Real-world Scenarios

Scenario 1: Multi-tenant Application
Imagine you are building a multi-tenant application where each tenant has their own subdomain (e.g., tenant1.example.com, tenant2.example.com). To allow these subdomains to access your API, you can use the allow_origin_regex option:
app.add_middleware(
CORSMiddleware,
allow_origin_regex="https://.*\.example\.com",
)
This configuration ensures that any subdomain of example.com can make cross-origin requests to your API, making it easy to manage multiple tenants without hardcoding each subdomain.
Scenario 2: Single Page Application (SPA)
Consider a single-page application (SPA) hosted on https://frontend.example.com that needs to communicate with a FastAPI backend hosted on https://backend.example.com. To enable this communication, you can configure the CORS middleware as follows:
app.add_middleware(
CORSMiddleware,
allow_origins=["https://frontend.example.com"],
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["Content-Type", "Authorization"],
)
This configuration allows the SPA to make authenticated requests to the backend, ensuring that only the specified frontend can access the API.
Scenario 3: Third-party Integrations
Suppose your FastAPI application needs to integrate with third-party services that have their own domains (e.g., https://thirdparty1.com, https://thirdparty2.com). To allow these third-party services to access your API, you can specify multiple origins:
app.add_middleware(
CORSMiddleware,
allow_origins=["https://thirdparty1.com", "https://thirdparty2.com"],
allow_methods=["GET", "POST"],
allow_headers=["Content-Type", "Authorization"],
)
This configuration ensures that both third-party services can make cross-origin requests to your API, facilitating seamless integration.
Common Issues and Best Practices
Common Issues
- CORS Not Working: Ensure that the
allow_originsorallow_origin_regexsettings match the origin making the request. Double-check the spelling and format. - Credentials Not Allowed: If you need to send cookies or authorization headers, make sure
allow_credentialsis set toTrue.
Best Practices
- Minimize Exposed Origins: Only allow the necessary origins to reduce the attack surface.
- Use HTTPS: Always use HTTPS for secure communication.
- Regularly Review Configuration: Periodically review your CORS configuration to ensure it aligns with your security policies.
Conclusion
Securing your API with CORS is essential for maintaining the integrity and security of your application. By following the steps outlined in this guide, you can install and configure FastAPI middleware CORS effectively. To get started, open your main.py, add the CORS middleware configuration, and restart Uvicorn — you'll see the new CORS headers in under two minutes.