OAuth 2.0 · OpenID Connect

أضف «تسجيل الدخول عبر Ismilink» إلى موقعك.

يسجّل مستخدموك الدخول بحسابهم على Ismilink وتحصل على ملفهم الشخصي بأمان. يتبع التدفق المعايير: أي مكتبة OAuth أو OpenID Connect تعمل.

المبدأ

يستخدم Ismilink تدفق «رمز التفويض» (Authorization Code)، الموصى به للمواقع وتطبيقات الهاتف.

  1. سجّل تطبيقك
    في مساحتك على Ismilink، تبويب المطوّرين: الاسم والشعار وعناوين الرجوع المسموح بها. تحصل على Client ID وClient secret.
  2. حوّل إلى Ismilink
    يرسل زرّك المستخدم إلى ‎/oauth/authorize. يسجّل الدخول ويوافق على الصلاحيات المطلوبة.
  3. استلم رمزًا
    يعيد Ismilink المستخدم إلى عنوان الرجوع مع رمز لمرة واحدة صالح لمدة 10 دقائق.
  4. استبدله من جهة الخادم
    يستبدل خادمك الرمز برمز وصول ورمز تحديث وid_token موقّع.

نقاط الوصول

نقطة الوصولالرابط
اكتشاف OpenIDhttps://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 عشوائية تتحقق منها عند العودة.

GET /oauth/authorize
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 أو في جسم الطلب.

Node.js — من جهة الخادم
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();
PHP
$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>. تعتمد الحقول المُعادة على الصلاحيات الممنوحة.

GET /oauth/userinfo — الاستجابة
{
  "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 عند الاستبدال.

JavaScript
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));

التحديث والإلغاء

تنتهي صلاحية رمز الوصول بعد ساعة. استخدم رمز التحديث للحصول على رمز جديد: يُستبدل عند كل استخدام (تدوير). لتسجيل خروج مستخدم، ألغِ رموزه.

POST /oauth/token
grant_type=refresh_token&refresh_token=alrt_…
# إلغاء رمز (تسجيل الخروج)
POST /oauth/revoke   token=alat_…

الزر الرسمي

استخدم هذا الزر ليتعرّف مستخدموك على Ismilink من النظرة الأولى. احتفظ بعبارة «تسجيل الدخول عبر Ismilink» وارتفاع لا يقل عن 44 بكسل.

HTML + CSS
<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>