المصادقة: مفاتيح API وOAuth
رموز Bearer، وترويسات مفاتيح API، وتدفقات OAuth2 للوصول إلى API الوكلاء
المصادقة: مفاتيح API وOAuth درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
لماذا تهم المصادقة الوكلاء
عندما يستدعي وكيلكم واجهة API خارجية، يحتاج الخادم إلى معرفة من يرسل الطلب. تثبت المصادقة الهوية، بينما يحدد التفويض ما يمكنكم فعله. ومن دون مصادقة مناسبة، يعيد كل طلب 401 Unauthorized ولا يستطيع وكيلكم فعل أي شيء.
يسود نمطان في تطوير الوكلاء: مفاتيح API وOAuth 2.0.
import requests
# Without auth — will get 401
response = requests.get('https://api.openai.com/v1/models')
print(response.status_code) # 401 Unauthorized
# With API key in header — works
headers = {'Authorization': 'Bearer sk-proj-abc123'}
response = requests.get(
'https://api.openai.com/v1/models',
headers=headers
)
print(response.status_code) # 200مفتاح API في ترويسة Authorization
النمط الأكثر شيوعًا هو إرسال مفتاح API في ترويسة Authorization باعتباره رمز Bearer. وتشير كلمة «Bearer» إلى أن أي شخص يملك هذا الرمز مخوّل؛ فالخادم يثق بحامل المفتاح.
ويُستخدم هذا النمط لدى OpenAI وAnthropic وGitHub ومعظم واجهات API الحديثة.
import requests
import os
api_key = os.environ['OPENAI_API_KEY']
response = requests.post(
'https://api.openai.com/v1/chat/completions',
headers={
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
},
json={
'model': 'gpt-4o-mini',
'messages': [{'role': 'user', 'content': 'Hello!'}]
}
)
print(response.json()['choices'][0]['message']['content'])مفتاح API في ترويسة مخصصة (X-API-Key)
تستخدم بعض واجهات API، ولا سيما القديمة أو الداخلية منها، ترويسة مخصصة مثل X-API-Key بدلًا من Authorization: Bearer. والنمط واحد، لكن اسم الترويسة مختلف. تحققوا دائمًا من وثائق API لمعرفة اسم الترويسة المطلوب بدقة.
import requests
import os
api_key = os.environ['SERVICE_API_KEY']
response = requests.get(
'https://api.someservice.com/v1/data',
headers={
'X-API-Key': api_key,
'Accept': 'application/json'
}
)
if response.status_code == 200:
data = response.json()
print('Got data:', data)
elif response.status_code == 401:
print('Invalid API key — check X-API-Key header')تخزين بيانات الاعتماد في متغيرات البيئة
لا تضعوا مفاتيح API في شيفرة المصدر بشكل ثابت أبدًا. فإذا أودعتم مفتاحًا في مستودع عام، فستعثر عليه الروبوتات وتسيء استخدامه خلال ثوانٍ. ويتمثل الأسلوب الصحيح في تخزين بيانات الاعتماد في متغيرات البيئة وقراءتها وقت التشغيل باستخدام os.environ.
استخدموا os.environ.get() مع رسالة خطأ واضحة إذا كان المفتاح مفقودًا.
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789' # simulate a set env var
api_key = os.environ.get('OPENAI_API_KEY')
if not api_key:
raise EnvironmentError(
'OPENAI_API_KEY environment variable not set. '
'Run: export OPENAI_API_KEY=your-key-here'
)
print('API key loaded from environment (never hard-code it in source)')استخدام python-dotenv للتطوير المحلي
أثناء التطوير، احتفظوا بالمفاتيح في ملف .env داخل جذر مشروعكم. واستخدموا مكتبة python-dotenv لتحميلها تلقائيًا. أضيفوا .env إلى .gitignore حتى لا يجري إيداعه أبدًا.
# .env file (never commit this!)
# OPENAI_API_KEY=sk-proj-abc123
# ANTHROPIC_API_KEY=sk-ant-xyz456
# GITHUB_TOKEN=ghp_abc789
# In your Python code:
from dotenv import load_dotenv
import os
load_dotenv() # loads .env into os.environ
openai_key = os.environ['OPENAI_API_KEY']
anthropic_key = os.environ['ANTHROPIC_API_KEY']
github_token = os.environ['GITHUB_TOKEN']
print('Keys loaded successfully')ما هو OAuth 2.0؟
إن OAuth 2.0 معيار للتفويض بالنيابة. فبدلًا من إعطاء وكيلكم كلمة مرور المستخدم، يتيح OAuth للمستخدم تفويض وكيلكم للتصرف نيابةً عنه، ضمن نطاق ومدة زمنية محدودين. ويُستخدم هذا المعيار لدى Google وGitHub وSlack وSalesforce.
المفهوم الأساسي هو أن وكيلكم يحصل على رمز وصول بعد تدفق التفويض، ثم يستخدم ذلك الرمز لاستدعاء واجهة API.
# OAuth flow overview:
#
# 1. Agent redirects user to:
# https://auth.provider.com/oauth/authorize
# ?client_id=YOUR_CLIENT_ID
# &redirect_uri=http://localhost:8080/callback
# &scope=read:repo%20write:issues
# &response_type=code
#
# 2. User logs in and grants permission
# 3. Provider redirects to your callback with ?code=AUTH_CODE
# 4. Agent exchanges code for access_token
# 5. Agent uses access_token for API calls
print('OAuth flow: authorize -> code -> token -> API calls')تدفق OAuth2 لبيانات اعتماد العميل
يُعد تدفق بيانات اعتماد العميل أبسط تدفقات OAuth للوكلاء، إذ لا يتطلب أي تفاعل من المستخدم. يصادق وكيلك باستخدام معرّف العميل والسر الخاص به للحصول على رمز. ويُستخدم ذلك للاتصال من آلة إلى آلة (M2M).
ترسل بيانات اعتمادك باستخدام POST إلى نقطة نهاية الرموز، وتتلقى رمز وصول قصير العمر.
import requests
import os
client_id = os.environ['OAUTH_CLIENT_ID']
client_secret = os.environ['OAUTH_CLIENT_SECRET']
token_url = 'https://auth.example.com/oauth/token'
# Request an access token
response = requests.post(token_url, data={
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'scope': 'read:data write:tasks'
})
token_data = response.json()
access_token = token_data['access_token']
expires_in = token_data['expires_in'] # seconds
print(f'Token valid for {expires_in}s')استخدام رموز OAuth في استدعاءات API
بعد حصولك على رمز وصول OAuth، استخدمه تمامًا كما تستخدم مفتاح API، أي في رأس Authorization: Bearer. والفرق هو أن رموز OAuth تنتهي صلاحيتها، لذلك يجب أن يتعامل وكيلك مع تجديد الرمز قبل إجراء الاستدعاءات.
import requests
import os
import time
class OAuthClient:
def __init__(self, client_id, client_secret, token_url):
self.client_id = client_id
self.client_secret = client_secret
self.token_url = token_url
self.access_token = None
self.token_expiry = 0
def get_token(self):
if time.time() < self.token_expiry - 60: # 60s buffer
return self.access_token
r = requests.post(self.token_url, data={
'grant_type': 'client_credentials',
'client_id': self.client_id,
'client_secret': self.client_secret
})
data = r.json()
self.access_token = data['access_token']
self.token_expiry = time.time() + data['expires_in']
return self.access_token
def get(self, url):
token = self.get_token()
return requests.get(url, headers={'Authorization': f'Bearer {token}'})OAuth 2.0 باستخدام مكتبة google-auth
بالنسبة إلى Google APIs، تتولى مكتبة google-auth كل تعقيدات OAuth نيابةً عنك. فهي تدير تجديد الرمز تلقائيًا، وتقرأ بيانات الاعتماد من ملف JSON، وتُرفق الرموز بالطلبات عبر AuthorizedSession.
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
# Load service account credentials from JSON file
credentials = service_account.Credentials.from_service_account_file(
'service-account.json',
scopes=[
'https://www.googleapis.com/auth/gmail.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
)
# AuthorizedSession auto-refreshes tokens
session = AuthorizedSession(credentials)
response = session.get(
'https://www.googleapis.com/gmail/v1/users/me/messages'
)
print(response.json())أفضل ممارسات أمان مفاتيح API
تُعد حماية مفاتيح API أمرًا بالغ الأهمية لأمان الوكلاء. اتبع القواعد التالية:
- خزّن المفاتيح في متغيرات البيئة أو في مدير أسرار (AWS Secrets Manager أو HashiCorp Vault)
- لا تسجّل المفاتيح مطلقًا، واحجبها في المخرجات
- بدّل المفاتيح بانتظام وألغِ المفاتيح التي تعرضت للاختراق فورًا
- استخدم مبدأ أقل قدر من الصلاحيات، واطلب النطاقات التي يحتاج إليها وكيلك فقط
- عيّن قوائم سماح لعناوين IP لمفاتيح API عندما يتيح المزوّد ذلك
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789'
def get_key(env_var):
key = os.environ.get(env_var)
if not key:
raise EnvironmentError(f'Missing required env var: {env_var}')
return key
def mask_key(key):
if len(key) < 8:
return '***'
return key[:4] + '...' + key[-4:]
api_key = get_key('OPENAI_API_KEY')
print(f'Using key: {mask_key(api_key)}')التعامل مع 401 Unauthorized في وكيلك
عندما يتلقى وكيل استجابة 401 Unauthorized، يجب ألا يعيد المحاولة عشوائيًا مطلقًا، لأن ذلك يهدر الحصة المسموح بها من معدل الطلبات. بدلًا من ذلك، تحقّق مما إذا كان الرمز قد انتهت صلاحيته (وجرّب تجديده) أو مما إذا كان المفتاح نفسه غير صالح (وأرسل تنبيهًا فورًا لكي يتمكن أحد الأشخاص من إصلاح المشكلة).
import requests
import os
def call_api_with_auth_check(url, api_key):
response = requests.get(
url,
headers={'Authorization': f'Bearer {api_key}'}
)
if response.status_code == 401:
error = response.json().get('error', {})
code = error.get('code', 'unknown')
if code == 'token_expired':
print('Token expired — refresh needed')
# trigger token refresh flow
else:
raise PermissionError(
f'API key rejected: {error.get("message", "401 Unauthorized")}'
)
response.raise_for_status()
return response.json()اختبار سريع: تخزين مفتاح API
اختبر مدى فهمك لإدارة بيانات الاعتماد.
مراجعة المصادقة
لقد تعلمت نمطي المصادقة الرئيسيين للوكلاء:
- مفاتيح API — تُمرر في رأس
Authorization: Bearer TOKENأوX-API-Key؛ وهي بسيطة ولا تعتمد على الحالة - OAuth 2.0 — تدفق بيانات اعتماد العميل للاتصال من آلة إلى آلة (M2M)؛ وتنتهي صلاحية الرموز ويجب تجديدها
- خزّن المفاتيح دائمًا في متغيرات البيئة، ولا تضعها مطلقًا في الشيفرة المصدرية
- استخدم python-dotenv محليًا، ومتغيرات البيئة أو مديري الأسرار في بيئة الإنتاج
- تعامل مع استجابات 401 بالتحقق مما إذا كانت صلاحية الرمز قد انتهت أو كان المفتاح غير صالح
تُعد المعالجة المتينة للمصادقة أساس كل وكيل موثوق.
الأسئلة الشائعة
هل درس «المصادقة: مفاتيح API وOAuth» مجاني؟
نعم — نص درس «المصادقة: مفاتيح API وOAuth» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «المصادقة: مفاتيح API وOAuth»؟
رموز Bearer، وترويسات مفاتيح API، وتدفقات OAuth2 للوصول إلى API الوكلاء تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «المصادقة: مفاتيح API وOAuth»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات REST API لمطوري الوكلاء
- المصادقة: مفاتيح API وOAuth
- التعامل مع استجابات API وأخطائها
- تحديد معدل الطلبات ومنطق إعادة المحاولة