الدرس 15 من 20

العمل مع واجهات البرمجة

مصادقة 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-...
Google 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 متزامنة. :::

اختبار

الوحدة 4: العمل مع واجهات البرمجة

خذ الاختبار