التضمين في موقعك
ثلاث خطوات، والوسطى هي النموذج الأمني كله: خادمك يصدر الرمز، ومتصفحك لا يرى المفتاح أبداً.
1 — خادمك يصدر رمزاً لأحد مستخدميك المسجّلين
// POST /api/gurb-token (your app, your auth)
app.post('/api/gurb-token', async (req, res) => {
const session = await gurb.embed.createSession({
externalUserId: req.user.id, // your id for this human, stable forever
displayName: req.user.name,
})
res.json({ token: session.token })
})أول مرة يرى قُرب المعرّف الخارجي ينشئ مستخدماً ويضيفه لمجتمعك كعضو. بعدها نفس المعرّف يُحل دائماً لنفس الشخص — ولهذا لازم يكون معرّفاً داخلياً ثابتاً، لا بريداً ولا اسم مستخدم يقدر يغيّره.
2 — صفحتك تركّب الإطار
import { mount } from '@gurb/embed'
const embed = mount({
target: '#community',
section: 'community', // or 'tweets' | 'events' | 'blogs' | 'albums'
fetchToken: () => fetch('/api/gurb-token', { method: 'POST' })
.then(r => r.json())
.then(d => d.token),
})
embed.destroy() // on unmountالمفاضلة حقيقية: المجتمع كاملاً يجلب ارتفاعه الخاص وتوجيهه الداخلي — زر الرجوع عندك لن يتبعه — وروابط قد تحاول مغادرة الإطار. اللوح لا يجلب شيئاً من ذلك. والارتفاعات الافتراضية تتبع ذلك: ٩٠٠ بكسل للمجتمع و٦٠٠ للّوح.
echo $gurb->embedSnippet()->iframe(EmbedSection::Community, $session->token);3 — ما فيه خطوة ثالثة
الصلاحيات وبوابات الميزات والإشراف كلها تنطبق داخل الإطار تماماً كما تنطبق على قُرب، لأن المستخدم المضمَّن عضو عادي.
المجتمع كاملاً، أو قسم واحد
الخيار community يضع صفحة المجتمع نفسها في إطار — تنقّلها وكل قسم تتيحه الخطة — تماماً كما يراها العضو بعد تسجيل الدخول. أما البقية فألواح بلا واجهة تُركّب داخل تخطيطك أنت: ترويستك، تنقّلك، ولوح واحد من قُرب بين محتواك.
ما لا تستطيع فعله، عن قصد
- تمرير دور. ما فيه حقل له. كل مستخدم مضمَّن عضو. مفتاح مسرّب يقدر ينشئ أعضاء وهميين في مجتمع واحد، ولا يقدر أبداً يصنع مشرفاً.
- تسجيل الدخول بحساب قُرب قائم. الهويات المضمَّنة منفصلة، وإلا لقدر أي موقع مضيف يدّعي بريد شخص ويستولي على حسابه.
- إرسال مفتاح API للمتصفح. التركيب يرفض أي رمز يبدأ بـ gurb_، وبناء العميل يرمي استثناءً لو اكتشف وجود window.
قُرب لازم يسمح لنطاقك بوضعه في إطار
التأطير مرفوض ما لم يرسل قُرب ترويسة frame-ancestors تشمل موقعك على مسار التضمين. لو بقي الإطار فارغاً ومعه رسالة في الطرفية عن X-Frame-Options، فهذي إعدادات خادم من طرف قُرب لا خلل في تكاملك.
Content-Security-Policy: frame-ancestors https://your-site.com
