کتابخانه 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 مراجعه کنید.
آیا این مطلب برای شما مفید بود ؟




