المصادقة
تستخدم جميع واجهات برمجة تطبيقات IDCloud (عقدا Web & SDK و API) OAuth2 مع نوع منح JWT Bearer (RFC 7523). تقوم بإنشاء تأكيد JWT قصير الأجل على الخادم الخلفي الخاص بك، وتبادله برمز Bearer، ثم تستخدم هذا الرمز في كل استدعاء لاحق.
يجب إنشاء تأكيد JWT على الخادم الخلفي فقط. لا تعرض مفتاحك الخاص في كود الواجهة الأمامية أو التطبيقات المحمولة أو المستودعات أو السجلات.
الحصول على بيانات الاعتماد
قبل أن تتمكن من إنشاء الرموز، تحتاج إلى حساب خدمة يتم توفيره بواسطة Unico. تواصل مع دعم Unico وقدّم:
- اسم حساب الخدمة (بحد أقصى 12 حرفًا)
- اسم الشخص المسؤول، بريده الإلكتروني ورقم هاتفه (أرقام البرازيل أو الولايات المتحدة أو المكسيك فقط)
ستحصل على:
- اسم حساب فريد
- معرف المستأجر (Tenant ID)
- حمولة JWT الأساسية
- ملف المفتاح الخاص (بصيغة
.pem)
احتفظ بحسابات خدمة منفصلة لبيئتي UAT والإنتاج.
بناء تأكيد JWT
التأكيد هو JWT بصيغة JWS المضغوطة: {Base64url(Header)}.{Base64url(Payload)}.{Base64url(Signature)}.
{
"alg": "RS256",
"typ": "JWT"
}
| الحقل | القيمة | ملاحظات |
|---|---|---|
iss | <account_name>@<tenant_id>.iam.acesso.io | مُقدَّم مع بيانات الاعتماد الخاصة بك |
aud | https://identityhomolog.acesso.io (UAT) أو https://identity.acesso.io (الإنتاج) | يجب أن يتطابق مع مضيف نقطة نهاية الرمز |
scope | * | يمنح جميع الأذونات |
iat | الطابع الزمني Unix (بالثواني) | وقت إصدار JWT |
exp | iat + بحد أقصى 3600 | لا يمكن تجاوز ساعة واحدة من iat |
{
"aud": "https://identity.acesso.io",
"scope": "*",
"iat": 1738086000,
"exp": 1738089600
}
قم بتوقيع الترويسة والحمولة باستخدام RS256 (RSA + SHA-256) مع المفتاح الخاص .pem المُقدَّم من Unico.
أي حقل غير مُدرج أعلاه (مثل sub أو jti أو nbf) سيُسبب خطأ 1.2.22. استخدم الحقول المُوضحة فقط.
طلب الرمز
نقطة نهاية الرمز هي نفسها لكلا العقدين:
| البيئة | نقطة النهاية |
|---|---|
| الإنتاج | POST https://identity.acesso.io/oauth2/token |
| UAT | POST https://identityhomolog.acesso.io/oauth2/token |
| المعامل | القيمة |
|---|---|
Content-Type | application/x-www-form-urlencoded |
grant_type | urn:ietf:params:oauth:grant-type:jwt-bearer |
assertion | JWT الموقَّع الخاص بك |
- cURL
- Node.js
- Python
curl -X POST https://identity.acesso.io/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
-d "assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
import jwt from 'jsonwebtoken';
import fs from 'fs';
import qs from 'querystring';
const privateKey = fs.readFileSync('./private-key.pem');
const now = Math.floor(Date.now() / 1000);
const assertion = jwt.sign(
{
aud: 'https://identity.acesso.io',
scope: '*',
iat: now,
exp: now + 3600,
},
privateKey,
{ algorithm: 'RS256' }
);
const res = await fetch('https://identity.acesso.io/oauth2/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: qs.stringify({
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
assertion,
}),
});
const { access_token, expires_in } = await res.json();
import time
import jwt # PyJWT
import requests
with open("private-key.pem", "rb") as f:
private_key = f.read()
now = int(time.time())
assertion = jwt.encode(
{
"aud": "https://identity.acesso.io",
"scope": "*",
"iat": now,
"exp": now + 3600,
},
private_key,
algorithm="RS256",
)
response = requests.post(
"https://identity.acesso.io/oauth2/token",
data={
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": assertion,
},
)
token_data = response.json()
access_token = token_data["access_token"]
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}
| الحقل | النوع | الوصف |
|---|---|---|
access_token | string | رمز وصول JWT. استخدمه في Authorization: Bearer <token> في جميع استدعاءات API. |
expires_in | integer | وقت انتهاء الصلاحية بالثواني. مثال: 3600. |
token_type | string | دائمًا Bearer. |