Pengenalan
Seiring dengan semakin kompleksnya aplikasi web, seringkali diperlukan berbagi resource antar asal atau domain yang berbeda. Namun, untuk melindungi data pengguna dan menjaga keamanan, browser menerapkan kebijakan yang disebut Same-Origin Policy, yang secara default mencegah berbagi resource antar asal. Inilah saatnya CORS (Cross-Origin Resource Sharing) berperan, sebagai mekanisme yang memungkinkan pengembang mengesampingkan kebijakan default ini saat diperlukan, sehingga memungkinkan berbagi resource yang terkontrol antar asal yang berbeda.
Dalam konteks FastAPI, mengkonfigurasi CORS dengan tepat sangat penting untuk memungkinkan aplikasi web Anda berinteraksi dengan layanan-layanan yang berbeda secara aman. Artikel ini akan membimbing Anda dalam cara mengkonfigurasi middleware CORS di FastAPI, mulai dari konfigurasi sederhana yang cocok untuk pengujian dan pengembangan, hingga pengaturan yang lebih canggih untuk lingkungan produksi.
Mengkonfigurasi Middleware CORS
FastAPI menggunakan Starlette untuk bagian-bagian web, yang mencakup sistem middleware. CORS diatur melalui kelas middleware khusus yang terdapat di Starlette, dan juga tersedia di FastAPI.
Untuk menggunakannya, Anda mengimpor CORSMiddleware
dan kemudian menambahkannya ke aplikasi Anda:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allows all origins
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
Pada konfigurasi dasar ini, kita mengizinkan semua asal, metode, dan header, serta mengizinkan kredensial.
Konfigurasi ini bersifat toleran dan berguna untuk pengujian, tetapi untuk aplikasi produksi, Anda harus lebih membatasi. Dalam skenario dunia nyata, Anda akan mengganti "*"
pada allow_origins
dengan daftar URL yang diizinkan berkomunikasi dengan aplikasi FastAPI Anda, dan Anda akan membatasi allow_methods
dan allow_headers
hanya pada metode dan header yang diperlukan aplikasi Anda untuk berfungsi.
Menangani CORS di FastAPI
Konfigurasi CORS Sederhana
Konfigurasi CORS sederhana di FastAPI dapat diimplementasikan dengan mengizinkan semua asal, metode, dan header. Ini biasanya digunakan selama pengembangan tetapi tidak disarankan di lingkungan produksi karena masalah keamanan.
Berikut adalah contoh konfigurasi CORS sederhana:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allows all origins
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
Konfigurasi CORS Lanjutan
Di lingkungan produksi, Anda akan membutuhkan konfigurasi CORS yang lebih canggih. Biasanya melibatkan menentukan daftar asal, metode, dan header yang diizinkan.
Berikut adalah contoh konfigurasi CORS lanjutan di FastAPI:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"http://localhost:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Authorization", "Content-Type"],
)
Pada contoh ini, kita hanya mengizinkan asal-asal tertentu yang terdaftar dalam daftar asal origins. Kita juga hanya mengizinkan metode GET
dan POST
, serta hanya header Authorization
dan Content-Type
.
Menangani Asal yang Spesifik
Terkadang Anda mungkin perlu menentukan asal-asal tertentu yang akan ditangani. Hal ini dapat dilakukan dengan menambahkannya ke dalam daftar origins
pada contoh di atas. Namun, bagaimana jika Anda perlu mengizinkan semua subdomain dari suatu domain tertentu?
Di sinilah parameter allow_origin_regex
berperan. Ini memungkinkan Anda untuk menentukan ekspresi reguler sebagai asal yang diizinkan. Berikut adalah contoh penggunaannya:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origin_regex='https?://.*\.example\.com',
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Authorization", "Content-Type"],
)
Pada contoh ini, aplikasi akan mengizinkan asal mana pun yang cocok dengan ekspresi reguler https?://.*\.example\.com
, termasuk subdomain apa pun dari example.com
, dengan menggunakan protokol http
atau https
.