المبدأ
يستخدم Ismilink تدفق «رمز التفويض» (Authorization Code)، الموصى به للمواقع وتطبيقات الهاتف.
- سجّل تطبيقك
في مساحتك على Ismilink، تبويب المطوّرين: الاسم والشعار وعناوين الرجوع المسموح بها. تحصل على Client ID وClient secret. - حوّل إلى Ismilink
يرسل زرّك المستخدم إلى /oauth/authorize. يسجّل الدخول ويوافق على الصلاحيات المطلوبة. - استلم رمزًا
يعيد Ismilink المستخدم إلى عنوان الرجوع مع رمز لمرة واحدة صالح لمدة 10 دقائق. - استبدله من جهة الخادم
يستبدل خادمك الرمز برمز وصول ورمز تحديث وid_token موقّع.
نقاط الوصول
| نقطة الوصول | الرابط |
|---|---|
| اكتشاف OpenID | https://mylinkis.com/.well-known/openid-configuration |
| التفويض | https://mylinkis.com/oauth/authorize |
| الرموز | https://mylinkis.com/oauth/token |
| ملف المستخدم | https://mylinkis.com/oauth/userinfo |
| الإلغاء | https://mylinkis.com/oauth/revoke |
| المفاتيح العامة (JWKS) | https://mylinkis.com/oauth/jwks |
الصلاحيات (Scopes)
| Scope | يتيح الوصول إلى |
|---|---|
openid | معرّف فريد لتسجيل دخولك (OpenID Connect). |
profile | الاسم، اسم المستخدم، الصورة، اللغة وروابط صفحاتك العامة. |
email | عنوان البريد الإلكتروني لحسابك على Ismilink. |
links | الروابط العامة في صفحتك (باستثناء الروابط المقفلة). |
portfolio | العنوان والنبذة والمدينة المعروضة في معرض أعمالك المنشور. |
1. تحويل المستخدم
أنشئ رابط التفويض باستخدام Client ID وعنوان رجوع مسجّل والصلاحيات المطلوبة وقيمة state عشوائية تتحقق منها عند العودة.
https://mylinkis.com/oauth/authorize
?response_type=code
&client_id=al_xxxxxxxxxxxx
&redirect_uri=https://ooyee.net/auth/ismilink/callback
&scope=openid%20profile%20email
&state=RANDOM_STATE
&code_challenge=BASE64URL_SHA256_VERIFIER
&code_challenge_method=S256إذا وافق المستخدم، يعود إلى عنوان الرجوع مع ?code=…&state=…. وإذا رفض، تتلقى ?error=access_denied.
2. استبدال الرمز
من خادمك فقط (لا تضع السر في المتصفح أبدًا)، استبدل الرمز بالرموز. تتم مصادقة العميل عبر Basic أو في جسم الطلب.
const res = await fetch('https://mylinkis.com/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Authorization: 'Basic ' + Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64'),
},
body: new URLSearchParams({
grant_type: 'authorization_code',
code,
redirect_uri: 'https://ooyee.net/auth/ismilink/callback',
code_verifier, // إذا استخدمت PKCE
}),
});
const { access_token, refresh_token, id_token, expires_in } = await res.json();$ch = curl_init('https://mylinkis.com/oauth/token');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => CLIENT_ID . ':' . CLIENT_SECRET,
CURLOPT_POSTFIELDS => http_build_query([
'grant_type' => 'authorization_code',
'code' => $_GET['code'],
'redirect_uri' => 'https://ooyee.net/auth/ismilink/callback',
]),
]);
$tokens = json_decode(curl_exec($ch), true);3. قراءة الملف الشخصي
استدعِ /oauth/userinfo مع الترويسة Authorization: Bearer <access_token>. تعتمد الحقول المُعادة على الصلاحيات الممنوحة.
{
"sub": "42",
"name": "Sara Benali",
"preferred_username": "sara",
"picture": "https://mylinkis.com/uploads/…",
"profile": "https://mylinkis.com/p/sara",
"website": "https://mylinkis.com/@sara",
"locale": "fr",
"email": "sara@example.com",
"email_verified": false
}استخدم الحقل «sub» كمعرّف ثابت للمستخدم: لا يتغيّر أبدًا حتى لو غيّر المستخدم اسمه أو بريده.
PKCE (التطبيقات العامة)
لتطبيق بدون خادم (هاتف، SPA)، فعّل «تطبيق عام»: لا يُستخدم أي سر، ويصبح PKCE إلزاميًا. أنشئ code_verifier، وأرسل بصمته SHA-256 كـ code_challenge، ثم مرّر code_verifier عند الاستبدال.
const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
const challenge = base64url(new Uint8Array(digest));التحديث والإلغاء
تنتهي صلاحية رمز الوصول بعد ساعة. استخدم رمز التحديث للحصول على رمز جديد: يُستبدل عند كل استخدام (تدوير). لتسجيل خروج مستخدم، ألغِ رموزه.
grant_type=refresh_token&refresh_token=alrt_…
# إلغاء رمز (تسجيل الخروج)
POST /oauth/revoke token=alat_…الزر الرسمي
استخدم هذا الزر ليتعرّف مستخدموك على Ismilink من النظرة الأولى. احتفظ بعبارة «تسجيل الدخول عبر Ismilink» وارتفاع لا يقل عن 44 بكسل.
<a class="ismilink-btn" href="/auth/ismilink">
<img src="https://mylinkis.com/img/logo.png" alt="" width="22" height="22">
تسجيل الدخول عبر Ismilink
</a>
<style>
.ismilink-btn{display:inline-flex;align-items:center;gap:12px;min-height:48px;padding:0 20px;
border-radius:14px;background:linear-gradient(135deg,#3d5afe,#7c3aed);color:#fff;
font:600 16px/1 system-ui,sans-serif;text-decoration:none;
box-shadow:0 10px 30px -10px rgba(124,58,237,.8),inset 0 1px 0 rgba(255,255,255,.25)}
.ismilink-btn:hover{filter:brightness(1.08)}
.ismilink-btn:focus-visible{outline:3px solid #6d28d9;outline-offset:2px}
</style>