Authorization Framework & Grant Types
OAuth 2.0 هو إطار عمل تفويض يمنح التطبيقات إمكانية الوصول المحدود إلى حسابات المستخدمين على خدمات HTTP — دون مشاركة كلمات المرور.
OAuth 2.0 (RFC 6749) يتيح لتطبيق "العميل" (client application) الحصول على وصول محدود إلى "مورد محمي" (protected resource) على behalf of المالك (user) — بدون أن يعرف كلمة مروره.
الشخص أو entity يمنح الوصول — عادة المستخدم. يمكنه تفويض أو سحب الوصول.
التطبيق الذي يريد الوصول إلى المورد. يجب تسجيله مسبقاً لدى Authorization Server.
ميثاق يعمل كـ Authorization Server. يصدر access tokens بعد موافقة المستخدم.
الخدمة التي تحمي الموارد — تتحقق من access token قبل السماح بالوصول.
الأكثر أماناً وتوافقاً — مناسب لجميع أنواع العملاء. يمرر التفويض عبر redirect.
# Step 1: Authorization Request
GET /authorize
?response_type=code
&client_id=my-client
&redirect_uri=https://client.com/callback
&scope=read write
&state=xyz# Step 2: Token Request
POST /token
grant_type=authorization_code
&code=AUTH_CODE
&redirect_uri=https://client.com/callback
&client_id=my-client
&client_secret=CLIENT_SECRETللآلات (M2M) — عندما لا يكون هناك مستخدم بشري. العميل يطلب token باسمه الخاص.
POST /token
grant_type=client_credentials
&client_id=my-service
&client_secret=CLIENT_SECRET
&scope=read# Response
{
"access_token": "eyJhbG...",
"token_type": "Bearer",
"expires_in": 300
}للأجهزة المحدودة (Smart TVs, CLI tools). الجهاز يعرض رمزاً المستخدم يزوره في متصفح آخر.
# Device requests code
POST /token
grant_type=urn:ietf:params:oauth:grant-type:device_code
&client_id=MY_DEVICE
&device_code=VmCcJ1yIXxu0qM3Z...لتجديد access token منتهي الصلاحية بدون إعادة المستخدم.
POST /token
grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
&client_id=my-client
&client_secret=CLIENT_SECRET| النوع | الوصف | أمثلة |
|---|---|---|
| Confidential | عميل قادر على حفظ secret — يعمل على خادم آمن | Backend APIs, Node.js servers |
| Public | عميل لا يستطيع حفظ secret — يعتمد على PKCE | SPA, Mobile apps, Desktop apps |
# 1. client_secret_basic (HTTP Basic Auth header)
Authorization: Basic base64(client_id:client_secret)
# 2. client_secret_post (in request body)
POST /token
client_id=my-app
client_secret=MY_SECRET
grant_type=client_credentials
# 3. private_key_jwt (JWT assertion — recommended for modern apps)
POST /token
grant_type=client_credentials
&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
&client_assertion=eyJhbG...(signed JWT)PKCE (RFC 7636) يحمي من intercept attacks على Authorization Code flow — يصبح إلزامياً لـ public clients.
سلسلة عشوائية بطول 43-128 حرف (A-Z, a-z, 0-9, -, ., _, ~)
BASE64URL(SHA256(code_verifier))
مرر code_challenge و code_challenge_method=S256
Authorization Server يتحقق من تطابق SHA256(code_verifier) مع code_challenge
allows a resource server to query the authorization server to determine the active state of a token and get metadata about it.
POST /realms/{realm}/protocol/openid-connect/token/introspect
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/x-www-form-urlencoded
token=RECEIVED_ACCESS_TOKEN
token_type_hint=access_token# Response (active token)
{
"active": true,
"scope": "read write",
"client_id": "my-app",
"username": "johndoe",
"exp": 1713000000,
"iat": 1712996400,
"sub": "user-uuid",
"iss": "https://your-methaq-server/realms/methaq"
}
# Response (inactive/expired token)
{ "active": false }