diff --git a/OAuth_Complete_Documentation.md b/OAuth_Complete_Documentation.md new file mode 100644 index 0000000..163a78f --- /dev/null +++ b/OAuth_Complete_Documentation.md @@ -0,0 +1,957 @@ +# مستندات کامل سیستم OAuth 2.0 - Hesabix + +## 📋 فهرست مطالب + +1. [معرفی OAuth 2.0](#معرفی-oauth-20) +2. [معماری سیستم](#معماری-سیستم) +3. [بخش مدیریت](#بخش-مدیریت) +4. [بخش کاربری](#بخش-کاربری) +5. [API Documentation](#api-documentation) +6. [نحوه اتصال](#نحوه-اتصال) +7. [امنیت](#امنیت) +8. [مثالهای عملی](#مثالهای-عملی) +9. [عیبیابی](#عیبیابی) +10. [پشتیبانی](#پشتیبانی) + +--- + +## 🚀 معرفی OAuth 2.0 + +OAuth 2.0 یک پروتکل استاندارد برای احراز هویت و مجوزدهی است که به برنامههای خارجی اجازه میدهد بدون نیاز به رمز عبور، به حساب کاربران دسترسی داشته باشند. + +### مزایای OAuth 2.0: +- ✅ **امنیت بالا:** عدم اشتراکگذاری رمز عبور +- ✅ **کنترل دسترسی:** محدود کردن دسترسیها با Scope +- ✅ **قابلیت لغو:** امکان لغو دسترسی در هر زمان +- ✅ **استاندارد:** سازگار با پروتکلهای جهانی +- ✅ **IP Whitelist:** کنترل دسترسی بر اساس IP +- ✅ **Rate Limiting:** محدودیت تعداد درخواست + +--- + +## 🏗️ معماری سیستم + +### اجزای اصلی: + +``` +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ Client App │ │ OAuth Server │ │ Resource Owner │ +│ (Third Party) │◄──►│ (Hesabix) │◄──►│ (User) │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +### جریان OAuth: + +1. **Client Registration:** ثبت برنامه در بخش مدیریت +2. **Authorization Request:** درخواست مجوز از کاربر +3. **User Consent:** تأیید کاربر +4. **Authorization Code:** دریافت کد مجوز +5. **Token Exchange:** تبدیل کد به Access Token +6. **Resource Access:** دسترسی به منابع + +### پایگاه داده: + +```sql +-- جداول OAuth +oauth_application -- برنامههای ثبت شده +oauth_scope -- محدودههای دسترسی +oauth_authorization_code -- کدهای مجوز موقت +oauth_access_token -- توکنهای دسترسی +``` + +--- + +## ⚙️ بخش مدیریت + +### 1. دسترسی به بخش مدیریت + +``` +مدیریت سیستم → تنظیمات سیستم → تب "برنامههای OAuth" +``` + +### 2. آمار کلی + +سیستم چهار کارت آمار نمایش میدهد: + +- **کل برنامهها:** تعداد کل برنامههای ثبت شده +- **فعال:** تعداد برنامههای فعال +- **غیرفعال:** تعداد برنامههای غیرفعال +- **جدید (7 روز):** برنامههای ایجاد شده در هفته گذشته + +### 3. ایجاد برنامه جدید + +#### مراحل ایجاد: + +1. **کلیک روی "ایجاد برنامه جدید"** +2. **پر کردن فرم:** + - **نام برنامه:** نام منحصر به فرد برنامه + - **توضیحات:** توضیح کاربرد برنامه + - **آدرس وبسایت:** URL اصلی برنامه + - **آدرس بازگشت:** URL callback برنامه + - **محدودیت درخواست:** تعداد درخواست مجاز در ساعت + +#### تنظیمات امنیتی: + +##### IP Whitelist: +``` +- در صورت خالی بودن: از هر IP مجاز است +- افزودن IP: 192.168.1.1 یا 192.168.1.0/24 +- پشتیبانی از CIDR notation +- Validation خودکار آدرسهای IP +``` + +##### Scope Management: +``` +read_profile - دسترسی به اطلاعات پروفایل +write_profile - تغییر اطلاعات پروفایل +read_business - دسترسی به اطلاعات کسب و کار +write_business - تغییر اطلاعات کسب و کار +read_financial - دسترسی به اطلاعات مالی +write_financial - تغییر اطلاعات مالی +read_contacts - دسترسی به لیست مخاطبین +write_contacts - تغییر لیست مخاطبین +read_documents - دسترسی به اسناد +write_documents - تغییر اسناد +admin_access - دسترسی مدیریتی +``` + +### 4. مدیریت برنامهها + +#### کارت برنامه: +- **وضعیت:** فعال/غیرفعال با رنگبندی +- **Client ID:** شناسه یکتا برنامه +- **تاریخ ایجاد:** تاریخ ثبت برنامه +- **توضیحات:** شرح برنامه + +#### عملیات موجود: + +##### دکمههای اصلی: +- **ویرایش:** تغییر اطلاعات برنامه +- **آمار:** مشاهده آمار استفاده +- **فعال/غیرفعال:** تغییر وضعیت برنامه + +##### منوی سه نقطه: +- **بازسازی کلید:** تولید Client Secret جدید +- **لغو توکنها:** لغو تمام توکنهای فعال +- **حذف:** حذف کامل برنامه + +### 5. اطلاعات امنیتی + +پس از ایجاد برنامه، اطلاعات زیر نمایش داده میشود: + +``` +Client ID: mL0qT1fkIL6MCJfxIPAh7nM2cQ7ykxEy +Client Secret: goM7latD9akY83z2O2e9IIEYED3Re6sRMd36f5cUSYHm389PPSqYbFHSX8GtQ9H1 +``` + +⚠️ **هشدار:** این اطلاعات را در جای امنی ذخیره کنید! + +--- + +## 👤 بخش کاربری + +### 1. صفحه مجوزدهی + +هنگام اتصال برنامه خارجی، کاربر به صفحه زیر هدایت میشود: + +``` +┌─────────────────────────────────────┐ +│ مجوزدهی OAuth │ +├─────────────────────────────────────┤ +│ │ +│ [آیکون برنامه] نام برنامه │ +│ توضیحات برنامه... │ +│ │ +│ این برنامه درخواست دسترسی به: │ +│ ✓ خواندن اطلاعات پروفایل │ +│ ✓ خواندن اطلاعات کسب و کار │ +│ │ +│ [لغو] [تأیید] │ +└─────────────────────────────────────┘ +``` + +### 2. اطلاعات نمایش داده شده: + +- **نام و لوگوی برنامه** +- **توضیحات برنامه** +- **محدودههای دسترسی درخواستی** +- **دکمههای تأیید/لغو** + +### 3. تصمیم کاربر: + +- **تأیید:** ادامه فرآیند OAuth +- **لغو:** بازگشت به برنامه اصلی + +--- + +## 📡 API Documentation + +### Base URL +``` +https://your-domain.com/oauth +``` + +### 1. Authorization Endpoint + +#### درخواست مجوز: +```http +GET /oauth/authorize +``` + +#### پارامترهای مورد نیاز: +```javascript +{ + "response_type": "code", + "client_id": "mL0qT1fkIL6MCJfxIPAh7nM2cQ7ykxEy", + "redirect_uri": "https://your-app.com/callback", + "scope": "read_profile read_business", + "state": "random_string_for_csrf" +} +``` + +#### پاسخ موفق: +```http +HTTP/1.1 302 Found +Location: https://your-app.com/callback?code=AUTHORIZATION_CODE&state=random_string +``` + +### 2. Token Endpoint + +#### درخواست Access Token: +```http +POST /oauth/token +Content-Type: application/x-www-form-urlencoded +``` + +#### پارامترهای مورد نیاز: +```javascript +{ + "grant_type": "authorization_code", + "client_id": "mL0qT1fkIL6MCJfxIPAh7nM2cQ7ykxEy", + "client_secret": "goM7latD9akY83z2O2e9IIEYED3Re6sRMd36f5cUSYHm389PPSqYbFHSX8GtQ9H1", + "code": "AUTHORIZATION_CODE", + "redirect_uri": "https://your-app.com/callback" +} +``` + +#### پاسخ موفق: +```json +{ + "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...", + "token_type": "Bearer", + "expires_in": 3600, + "refresh_token": "def50200...", + "scope": "read_profile read_business" +} +``` + +### 3. User Info Endpoint + +#### درخواست اطلاعات کاربر: +```http +GET /oauth/userinfo +Authorization: Bearer ACCESS_TOKEN +``` + +#### پاسخ موفق: +```json +{ + "id": 123, + "email": "user@example.com", + "name": "نام کاربر", + "profile": { + "phone": "+989123456789", + "address": "تهران، ایران" + } +} +``` + +### 4. Refresh Token Endpoint + +#### تمدید Access Token: +```http +POST /oauth/token +Content-Type: application/x-www-form-urlencoded +``` + +#### پارامترهای مورد نیاز: +```javascript +{ + "grant_type": "refresh_token", + "client_id": "mL0qT1fkIL6MCJfxIPAh7nM2cQ7ykxEy", + "client_secret": "goM7latD9akY83z2O2e9IIEYED3Re6sRMd36f5cUSYHm389PPSqYbFHSX8GtQ9H1", + "refresh_token": "def50200..." +} +``` + +### 5. Revoke Endpoint + +#### لغو Token: +```http +POST /oauth/revoke +Authorization: Bearer ACCESS_TOKEN +``` + +#### پارامترهای مورد نیاز: +```javascript +{ + "token": "ACCESS_TOKEN_OR_REFRESH_TOKEN" +} +``` + +### 6. Discovery Endpoint + +#### دریافت اطلاعات OAuth Server: +```http +GET /.well-known/oauth-authorization-server +``` + +#### پاسخ: +```json +{ + "issuer": "https://hesabix.ir", + "authorization_endpoint": "https://hesabix.ir/oauth/authorize", + "token_endpoint": "https://hesabix.ir/oauth/token", + "userinfo_endpoint": "https://hesabix.ir/oauth/userinfo", + "revocation_endpoint": "https://hesabix.ir/oauth/revoke", + "response_types_supported": ["code"], + "grant_types_supported": ["authorization_code", "refresh_token"], + "token_endpoint_auth_methods_supported": ["client_secret_post"], + "scopes_supported": [ + "read_profile", + "write_profile", + "read_business", + "write_business", + "read_financial", + "write_financial", + "read_contacts", + "write_contacts", + "read_documents", + "write_documents", + "admin_access" + ] +} +``` + +--- + +## 🔗 نحوه اتصال + +### 1. ثبت برنامه + +ابتدا برنامه خود را در بخش مدیریت ثبت کنید: + +```javascript +// اطلاعات مورد نیاز +const appInfo = { + name: "My Application", + description: "توضیح برنامه من", + website: "https://myapp.com", + redirectUri: "https://myapp.com/oauth/callback", + allowedScopes: ["read_profile", "read_business"], + ipWhitelist: ["192.168.1.0/24"], // اختیاری + rateLimit: 1000 +}; +``` + +### 2. پیادهسازی OAuth Flow + +#### مرحله 1: درخواست مجوز +```javascript +function initiateOAuth() { + const params = new URLSearchParams({ + response_type: 'code', + client_id: 'YOUR_CLIENT_ID', + redirect_uri: 'https://myapp.com/oauth/callback', + scope: 'read_profile read_business', + state: generateRandomString() + }); + + window.location.href = `https://hesabix.com/oauth/authorize?${params}`; +} +``` + +#### مرحله 2: دریافت Authorization Code +```javascript +// در callback URL +function handleCallback() { + const urlParams = new URLSearchParams(window.location.search); + const code = urlParams.get('code'); + const state = urlParams.get('state'); + + if (code && state) { + exchangeCodeForToken(code); + } +} +``` + +#### مرحله 3: تبدیل Code به Token +```javascript +async function exchangeCodeForToken(code) { + const response = await fetch('https://hesabix.com/oauth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'authorization_code', + client_id: 'YOUR_CLIENT_ID', + client_secret: 'YOUR_CLIENT_SECRET', + code: code, + redirect_uri: 'https://myapp.com/oauth/callback' + }) + }); + + const tokenData = await response.json(); + // ذخیره token + localStorage.setItem('access_token', tokenData.access_token); + localStorage.setItem('refresh_token', tokenData.refresh_token); +} +``` + +#### مرحله 4: استفاده از Access Token +```javascript +async function getUserInfo() { + const response = await fetch('https://hesabix.com/oauth/userinfo', { + headers: { + 'Authorization': `Bearer ${localStorage.getItem('access_token')}` + } + }); + + const userData = await response.json(); + return userData; +} +``` + +### 3. مدیریت Token + +#### تمدید Access Token: +```javascript +async function refreshAccessToken() { + const response = await fetch('https://hesabix.com/oauth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'refresh_token', + client_id: 'YOUR_CLIENT_ID', + client_secret: 'YOUR_CLIENT_SECRET', + refresh_token: localStorage.getItem('refresh_token') + }) + }); + + const tokenData = await response.json(); + localStorage.setItem('access_token', tokenData.access_token); + localStorage.setItem('refresh_token', tokenData.refresh_token); +} +``` + +#### لغو Token: +```javascript +async function revokeToken() { + await fetch('https://hesabix.com/oauth/revoke', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${localStorage.getItem('access_token')}` + }, + body: JSON.stringify({ + token: localStorage.getItem('access_token') + }) + }); + + localStorage.removeItem('access_token'); + localStorage.removeItem('refresh_token'); +} +``` + +--- + +## 🔒 امنیت + +### 1. محدودیتهای IP + +```javascript +// بررسی IP در backend +function checkIpWhitelist($clientIp, $whitelist) { + if (empty($whitelist)) { + return true; // همه IP ها مجاز + } + + foreach ($whitelist as $allowedIp) { + if (ipInRange($clientIp, $allowedIp)) { + return true; + } + } + + return false; +} +``` + +### 2. محدودیتهای Scope + +```javascript +// بررسی دسترسی در backend +function checkScope($requestedScope, $allowedScopes) { + $requestedScopes = explode(' ', $requestedScope); + + foreach ($requestedScopes as $scope) { + if (!in_array($scope, $allowedScopes)) { + return false; + } + } + + return true; +} +``` + +### 3. Rate Limiting + +```javascript +// محدودیت درخواست +function checkRateLimit($clientId, $limit) { + $requests = getRequestCount($clientId, '1 hour'); + return $requests < $limit; +} +``` + +### 4. Token Security + +- **Access Token:** عمر 1 ساعت +- **Refresh Token:** عمر 30 روز +- **JWT Signature:** امضای دیجیتال +- **Token Revocation:** امکان لغو فوری + +### 5. نکات امنیتی مهم + +1. **HTTPS اجباری:** تمام ارتباطات باید روی HTTPS باشد +2. **State Parameter:** همیشه از state parameter استفاده کنید +3. **Client Secret:** Client Secret را در کد سمت کلاینت قرار ندهید +4. **Token Storage:** توکنها را در جای امنی ذخیره کنید +5. **Scope Validation:** همیشه scope ها را بررسی کنید + +--- + +## 💻 مثالهای عملی + +### مثال 1: اپلیکیشن وب + +```html + + +
+