ویژگی تصویر

کتابخانه oauthlib در پایتون — مرجع جامع برای پیاده‌سازی OAuth

  /  پایتون   /  کتابخانه oauthlib در پایتون
بنر تبلیغاتی الف

کتابخانه oauthlib یکی از کتابخانه‌های اصلی در اکوسیستم پایتون برای پیاده‌سازی پروتکل‌های OAuth 1 و OAuth 2 است. این کتابخانه لایه‌ای کمّی و امن برای مدیریت جریان‌های احراز هویت و مجوزدهی فراهم می‌کند و اغلب همراه با requests-oauthlib یا چارچوب‌هایی مانند Flask/Django استفاده می‌شود. در این مقاله به مبانی، نمونه‌های عملی، نکات امنیتی و مقایسه گرنت‌ها می‌پردازیم.

چرا oauthlib؟

  • پیاده‌سازی مطابق با استانداردها: رعایت مشخصات RFC برای OAuth 1 و OAuth 2.
  • قابلیت استفاده هم به‌عنوان کلاینت و هم ارائه‌دهنده (provider) OAuth.
  • قابلیت ترکیب با requests برای تعامل با APIهای محافظت‌شده.
  • قابل آزمون‌پذیری و تفکیک لایه‌ها: مناسب برای ساخت سامانه‌های بزرگ و قابل نگهداری.

اصطلاحات کلیدی

  • Client: برنامه‌ای که درخواست دسترسی به منابع کاربر می‌کند.
  • Resource Owner: معمولاً کاربر نهایی که مجوز می‌دهد.
  • Authorization Server: سرویسی که توکن صادر می‌کند.
  • Resource Server: سرویسی که از توکن برای محافظت از API استفاده می‌کند.
  • Grant Types: انواع جریان‌های دریافت دسترسی مانند authorization_code، client_credentials و refresh_token.

نمونه: استفاده به‌عنوان کلاینت OAuth2 (authorization code)

from oauthlib.oauth2 import WebApplicationClient
import requests
import urllib.parse

# تنظیمات
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
authorize_url = "https://provider.example.com/oauth/authorize"
token_url = "https://provider.example.com/oauth/token"
redirect_uri = "https://yourapp.example.com/callback"

# ساخت کلاینت
client = WebApplicationClient(client_id)

# تولید آدرس احراز هویت
auth_url = client.prepare_request_uri(authorize_url, redirect_uri=redirect_uri, scope=["profile","email"])
print("Go to:", auth_url)

# پس از دریافت کد از callback (مثلاً ?code=abc123)
code = "CODE_FROM_PROVIDER"

# آماده‌سازی درخواست توکن
token_request_body = client.prepare_request_body(code=code, redirect_uri=redirect_uri, client_secret=client_secret)
headers = {"Content-Type": "application/x-www-form-urlencoded"}

resp = requests.post(token_url, data=token_request_body, headers=headers)
print(resp.json())

توضیح: این مثال نشان می‌دهد چگونه با WebApplicationClient یک URL احراز هویت بسازیم، کد تأیید را از provider گرفته و سپس با prepare_request_body درخواست توکن را ارسال کنیم. در عمل بهتر است client_secret را در هدر Authorization (Basic) ارسال کنید یا از requests-oauthlib استفاده نمایید تا مدیریت امن‌تری روی فرمت‌ها و headerها داشته باشید.

مثال عملی با requests-oauthlib (ساده و متداول)

from requests_oauthlib import OAuth2Session

client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
authorize_url = "https://provider.example.com/oauth/authorize"
token_url = "https://provider.example.com/oauth/token"
redirect_uri = "https://yourapp.example.com/callback"

oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=["profile","email"])
authorization_url, state = oauth.authorization_url(authorize_url)

print("Visit this URL:", authorization_url)

# بعد از دریافت کد:
code = "CODE_FROM_PROVIDER"
token = oauth.fetch_token(token_url, code=code, client_secret=client_secret)
print("Access token:", token)

توضیح: این کد از requests-oauthlib استفاده می‌کند که روی oauthlib ساخته شده است و فرایند دریافت توکن و مدیریت حالت (state) را ساده می‌کند. fetch_token به‌صورت خودکار اطلاعات لازم را همراه با header مناسب می‌فرستد و پاسخ توکن را پارس می‌کند.

مثال: استفاده از client credentials (machine-to-machine)

from oauthlib.oauth2 import BackendApplicationClient
from requests_oauthlib import OAuth2Session

client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
token_url = "https://provider.example.com/oauth/token"

client = BackendApplicationClient(client_id=client_id)
oauth = OAuth2Session(client=client)
token = oauth.fetch_token(token_url=token_url, client_id=client_id, client_secret=client_secret)
print(token)

توضیح: این نمونه برای حالت client_credentials مناسب است؛ هیچ کاربر انسانی دخیل نیست و سرویس‌ها با شناسه و راز خود توکن می‌گیرند. توجه داشته باشید که این جریان فقط برای دسترسی به منابع غیرشخصی یا سرویس‌های سرور-به-سرور توصیه می‌شود.

بهترین شیوه‌ها و نکات امنیتی

  • همیشه از کانال HTTPS استفاده کنید تا client_secret و توکن‌ها ایمن بمانند.
  • توکن‌های دسترسی را با عمر محدود تنظیم و از refresh token استفاده کنید.
  • توکن‌های حساس را در حافظه امن (مثلاً vault یا سیستم مدیریت اسرار) ذخیره کنید، نه در کد منبع.
  • از state و PKCE در authorization code flow برای جلوگیری از حملات CSRF و code injection استفاده کنید.
  • برای پیاده‌سازی provider، آزمون‌های امنیتی (fuzzing, replay, token leakage) اجرا کنید؛ oauthlib ابزارهایی فراهم می‌کند اما مسئولیت پیاده‌سازی امن با شماست.

مقایسه سریع گرنت‌های مهم

Grant Typeکاربردمناسب برای
authorization_codeدریافت کد از کاربر و سپس توکنبرنامه‌های وب و موبایل با واسط کاربر
client_credentialsبدون کاربر، فقط سرویس‌هاارتباط سرویس-به-سرویس
refresh_tokenتجدید توکن بدون ورود مجدد کاربرحفظ نشست طولانی مدت

ملاحظات پیشرفته و توصیه‌های فنی

  • oauthlib کتابخانه‌ای پایینی‌سطح است؛ برای بسیاری از پروژه‌ها استفاده از requests-oauthlib یا Authlib (که رابط کاربری دوستانه‌تر و قابلیت‌های بیشتر دارد) توصیه می‌شود.
  • در پیاده‌سازی provider با oauthlib باید به جزئیات RFCها توجه کنید؛ کوچک‌ترین خطا می‌تواند منجر به نشت توکن شود.
  • مکانیزم PKCE را حتی در اپلیکیشن‌های سرور-سمت‌کلاینت فعال کنید تا امنیت کد افزایش یابد.
  • لاگ‌ها را طوری تنظیم کنید که اطلاعات حساس (توکن، client_secret) لاگ نشوند.

نتیجه‌گیری و منابع

oauthlib یک ابزار قدرتمند و قابل اعتماد برای پیاده‌سازی OAuth در پایتون است، اما همان‌طور که دیدیم، نیاز به دقت و رعایت بهترین شیوه‌های امنیتی دارد. در پروژه‌های جدید ممکن است بخواهید از لایه‌هایی مانند requests-oauthlib یا Authlib استفاده کنید تا پیاده‌سازی ساده‌تر و امن‌تری داشته باشید. برای مستندات رسمی و مثال‌های بیشتر به صفحات گیت‌هاب و داکیومنتیشن oauthlib مراجعه کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: