當我們使用 Astro 開發 Web 應用程式時,我們經常需要與外部 API 和服務進行互動。安全地管理憑證和 API 金鑰對於保護我們的應用程式至關重要。在本指南中,我們將探索在 Astro 專案中管理 API 金鑰和環境變數的最佳實務。
在 Astro 中,環境變數的處理方式與其他現代框架類似。首先,我們在專案的根目錄中建立一個 .env 檔案:
# .env PUBLIC_API_URL=https://api.ejemplo.com PRIVATE_API_KEY=tu_clave_secreta DATABASE_URL=postgresql://usuario:password@localhost:5432/db
對於 TypeScript,建議建立一個 env.d.ts 檔案來輸入我們的變數:
/// <reference types="astro/client" /> interface ImportMetaEnv { readonly DATABASE_URL: string; readonly PRIVATE_API_KEY: string; readonly PUBLIC_API_URL: string; } interface ImportMeta { readonly env: ImportMetaEnv; }
在 Astro 中,我們可以根據上下文以不同的方式存取環境變數:
--- // En archivos .astro const apiKey = import.meta.env.PRIVATE_API_KEY; const publicUrl = import.meta.env.PUBLIC_API_URL; ---
// En archivos .ts o .js const apiKey = import.meta.env.PRIVATE_API_KEY;
Astro 遵循環境變數的重要約定:
# .env PUBLIC_API_URL=https://api.publica.com # ✅ Visible en el cliente PRIVATE_API_KEY=secreto123 # ⛔ Solo servidor
要處理需要驗證的 API,我們必須建立無伺服器端點:
// src/pages/api/data.ts export async function GET() { try { const response = await fetch('https://api.externa.com/data', { headers: { 'Authorization': `Bearer ${import.meta.env.PRIVATE_API_KEY}` } }); const data = await response.json(); return new Response(JSON.stringify(data), { status: 200, headers: { 'Content-Type': 'application/json' } }); } catch (error) { return new Response(JSON.stringify({ error: 'Error al obtener datos' }), { status: 500 }); } }
在應用程式開始時實現驗證功能:
// src/utils/validateEnv.ts export function validateEnv() { const requiredEnvVars = [ 'DATABASE_URL', 'PRIVATE_API_KEY', 'PUBLIC_API_URL' ]; for (const envVar of requiredEnvVars) { if (!import.meta.env[envVar]) { throw new Error(`La variable de entorno ${envVar} es requerida`); } } } // src/pages/index.astro --- import { validateEnv } from '../utils/validateEnv'; if (import.meta.env.MODE === 'development') { validateEnv(); } ---
為每個環境建立不同的檔案:
.env # Variables por defecto .env.development # Variables de desarrollo .env.production # Variables de producción .env.local # Variables locales (ignoradas en git)
提供.env.example檔案:
# .env.example PUBLIC_API_URL=https://api.ejemplo.com PRIVATE_API_KEY=tu_clave_aqui DATABASE_URL=postgresql://usuario:password@localhost:5432/db
確保在 .gitignore 中包含敏感檔案:
# .env PUBLIC_API_URL=https://api.ejemplo.com PRIVATE_API_KEY=tu_clave_secreta DATABASE_URL=postgresql://usuario:password@localhost:5432/db
/// <reference types="astro/client" /> interface ImportMetaEnv { readonly DATABASE_URL: string; readonly PRIVATE_API_KEY: string; readonly PUBLIC_API_URL: string; } interface ImportMeta { readonly env: ImportMetaEnv; }
--- // En archivos .astro const apiKey = import.meta.env.PRIVATE_API_KEY; const publicUrl = import.meta.env.PUBLIC_API_URL; ---
// En archivos .ts o .js const apiKey = import.meta.env.PRIVATE_API_KEY;
# .env PUBLIC_API_URL=https://api.publica.com # ✅ Visible en el cliente PRIVATE_API_KEY=secreto123 # ⛔ Solo servidor
// src/pages/api/data.ts export async function GET() { try { const response = await fetch('https://api.externa.com/data', { headers: { 'Authorization': `Bearer ${import.meta.env.PRIVATE_API_KEY}` } }); const data = await response.json(); return new Response(JSON.stringify(data), { status: 200, headers: { 'Content-Type': 'application/json' } }); } catch (error) { return new Response(JSON.stringify({ error: 'Error al obtener datos' }), { status: 500 }); } }
// src/utils/validateEnv.ts export function validateEnv() { const requiredEnvVars = [ 'DATABASE_URL', 'PRIVATE_API_KEY', 'PUBLIC_API_URL' ]; for (const envVar of requiredEnvVars) { if (!import.meta.env[envVar]) { throw new Error(`La variable de entorno ${envVar} es requerida`); } } } // src/pages/index.astro --- import { validateEnv } from '../utils/validateEnv'; if (import.meta.env.MODE === 'development') { validateEnv(); } ---
API 金鑰和環境變數的安全處理對於任何現代 Web 應用程式都至關重要。透過遵循 Astro 的這些最佳實踐,我們可以:
以上是Astro 中的 API 金鑰和環境變數:完整安全指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!