العمل مع واجهات البرمجة
مصادقة API
3 دقيقة للقراءة
واجهات API تحتاج لمعرفة من يُجري الطلبات. المصادقة تتحقق من هويتك وتتحكم في الوصول إلى الموارد.
طرق المصادقة الشائعة
1. مفتاح API في الترويسة (الأكثر شيوعاً للذكاء الاصطناعي)
import requests
import os
headers = {
"Authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers, json=data)
مزودون مختلفون يستخدمون تنسيقات ترويسة مختلفة:
| المزود | تنسيق الترويسة |
|---|---|
| OpenAI | Authorization: Bearer sk-... |
| Anthropic | x-api-key: sk-ant-... |
Authorization: Bearer ... (OAuth) |
|
| مخصص | غالباً X-API-Key: ... |
2. مفتاح API في معامل الاستعلام
# أقل أماناً - مرئي في السجلات!
response = requests.get(
"https://api.example.com/data",
params={"api_key": "your-key"}
)
3. المصادقة الأساسية
from requests.auth import HTTPBasicAuth
response = requests.get(
url,
auth=HTTPBasicAuth("username", "password")
)
# أو الاختصار:
response = requests.get(url, auth=("username", "password"))
إدارة المفاتيح الآمنة
import os
from dotenv import load_dotenv
# تحميل من ملف .env
load_dotenv()
# الحصول على المفاتيح بأمان
OPENAI_KEY = os.getenv("OPENAI_API_KEY")
ANTHROPIC_KEY = os.getenv("ANTHROPIC_API_KEY")
# التحقق عند بدء التشغيل
if not OPENAI_KEY:
raise ValueError("OPENAI_API_KEY غير معيّن!")
def get_headers(provider="openai"):
"""الحصول على ترويسات المصادقة لمزودين مختلفين."""
if provider == "openai":
return {
"Authorization": f"Bearer {OPENAI_KEY}",
"Content-Type": "application/json"
}
elif provider == "anthropic":
return {
"x-api-key": ANTHROPIC_KEY,
"Content-Type": "application/json",
"anthropic-version": "2024-01-01"
}
إنشاء عميل قابل لإعادة الاستخدام
import requests
import os
class AIClient:
"""عميل API بسيط مع مصادقة مدمجة."""
def __init__(self, api_key=None):
self.api_key = api_key or os.getenv("OPENAI_API_KEY")
self.base_url = "https://api.openai.com/v1"
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
})
def chat(self, messages, model="gpt-4"):
response = self.session.post(
f"{self.base_url}/chat/completions",
json={"model": model, "messages": messages},
timeout=60
)
response.raise_for_status()
return response.json()
# الاستخدام
client = AIClient()
result = client.chat([{"role": "user", "content": "مرحباً!"}])
أفضل ممارسات الأمان
| افعل | لا تفعل |
|---|---|
| خزّن المفاتيح في متغيرات البيئة | ضع المفاتيح في الكود المصدري |
استخدم ملفات .env محلياً |
أرسل .env إلى git |
| غيّر المفاتيح دورياً | شارك المفاتيح بين المشاريع |
| استخدم مفاتيح مختلفة لكل بيئة | استخدم مفاتيح الإنتاج في التطوير |
بعد ذلك، سنتعلم البرمجة غير المتزامنة لاستدعاءات API متزامنة. :::