Entwicklerzentrum · Plattform erweitern
Eingebettete Seiten – Fügen Sie Ihre eigenen Tools in den Adminbereich ein.
Registrieren Sie Ihre eigene https-gehostete Seite und sie wird zu einem berechtigten Menüelement im SocialHub-Administrator – einem ganzseitigen Sandbox-Iframe. Flash übergibt Ihrer Seite ein kurzlebiges, PII-freies Identitätstoken, damit Sie den Betreiber autorisieren können, ohne dass er sich erneut anmelden muss.
Früher Zugriff · hinter dem Open-Extensibility-Modul
So funktioniert es
Vier Schritte von Ihrer URL zu einem Menüpunkt.
Registrieren Sie Ihre Seite
Ein Workspace-Administrator fügt Ihre HTTPS-URL unter Flash → Konfigurieren → Eingebettete Seiten hinzu, inklusive Menübezeichnung, Liste zulässiger Ursprünge und den Rollen/Stufen, die die Seite öffnen dürfen.
Signaturgeheimnis kopieren
Flash zeigt einmalig ein Signaturgeheimnis an (slotsec_…). Speichern Sie es als Servergeheimnis in Ihrer App – damit verifizieren Sie das Identitätstoken von Flash.
Flash Optimiert Ihre Seite
Die Seite erscheint als Menüpunkt in der Seitenleiste unter „Apps“ für autorisierte Betreiber. Beim Öffnen wird Ihre URL in einem isolierten iFrame mit dem angehängten Parameter „?flash_context=<token>“ geladen.
Prüfen + Autorisieren
Token lesen, serverseitig verifizieren (HS256) und Benutzeroberfläche anhand der Workspace-ID und der zugehörigen Operatorrolle steuern.
Das Identitätstoken
Kurzlebig, keine personenbezogenen Daten, mit Ihrem Geheimnis signiert.
Bei jedem Rendern hängt Flash ?flash_context=<JWT> an Ihre URL an. Es handelt sich um ein HS256-JWT, das mit dem Geheimnis Ihrer Seite signiert ist (Sie – nicht die Plattform – sind also der Vertrauensanker), maximal 120 Sekunden lang gültig ist und keine persönlichen Daten des Mitglieds enthält – nur die Workspace-ID und die undurchsichtige ID des Betreibers + grobe Rolle, damit Sie autorisieren können.
{
"iss": "flash",
"aud": "nav.page",
"slotKey": "nav.page",
"ctx": {
"teamId": "team_...", // the workspace (tenant) — the tenant already owns this
"userId": "usr_...", // opaque operator id (NOT an email/name/phone)
"role": "org_admin", // coarse role: org_owner | org_admin | marketer | store_manager
"pageType": "nav.page",
"locale": "en"
},
"jti": "…", "iat": 1730000000, "nbf": 1730000000,
"exp": 1730000110 // <= 120s after iat
}Überprüfen Sie dies.
Vertrauen Sie dem Token, nicht der Anfrage.
Überprüfen Sie Signatur, Aussteller (flash), Zielgruppe (nav.page) und Ablaufdatum auf Ihrem Server. Anschließend autorisieren Sie anhand der Workspace-ID und der zugehörigen Rolle – niemals über Cookies (der iFrame hat keinen verwendbaren Ursprung; siehe unten).
// Node (jose). The secret is your page's signing secret, shown ONCE at registration.
import { jwtVerify } from "jose";
const SECRET = new TextEncoder().encode(process.env.FLASH_EMBED_SECRET); // slotsec_…
export async function verifyFlashContext(token) {
const { payload } = await jwtVerify(token, SECRET, {
algorithms: ["HS256"],
issuer: "flash",
audience: "nav.page",
requiredClaims: ["exp", "jti"],
maxTokenAge: "120s",
});
// payload.ctx = { teamId, userId, role, pageType, locale }
return payload.ctx; // → authorize the operator with this
}// In your page: read ?flash_context=… , verify it server-side, then authorize.
const token = new URLSearchParams(location.search).get("flash_context");
// POST it to YOUR backend, verify with the snippet above, and gate the UI on
// ctx.teamId + ctx.role. Never trust it unverified, and never rely on cookies —
// the iframe is a null origin (see "Framing" below).Framing & Sicherheit
Was Ihre Seite leisten muss.
Rahmen zulassen
Ihre Seite muss das Einbetten in Flash-Frames zulassen.socialhub.ai – Senden Sie nicht X-Frame-Options: DENY; setzen Sie Content-Security-Policy: frame-ancestors. https://flash.socialhub.ai.
Angenommen, es gibt einen Ursprung null
Flash Der iFrame wird in einer Sandbox ausgeführt, wobei Skripte erlaubt, aber Same-Origin nicht erlaubt ist. Dadurch läuft Ihre Seite unter einem null Ursprung: ohne Flash Cookies, Speicher oder übergeordnetes DOM. Die Authentifizierung erfolgt mit dem Token, nicht mit Cookies.
postMessage ist auf der Zulassungsliste
Der Gastgeber akzeptiert nur postMessage Zugriff nur von den von Ihnen registrierten Ursprüngen und ausschließlich aus Ihrem iFrame-Fenster. Halten Sie Ihre Liste der zulässigen Ursprünge kurz und beschränken Sie sie auf HTTPS.
Ändern Sie das Signaturgeheimnis des Managers, falls es jemals offengelegt wird (alte Token werden sofort nicht mehr verifiziert). Eingebettete Seiten sind Frühzugriff, standardmäßig pro Arbeitsbereich deaktiviert und die Aktivierung für den Produktivbetrieb unterliegt der Sicherheitsprüfung von SocialHub für eingebettete Drittanbieter.
Anpassung an das Admin-Design
Integriert sich nahtlos in Ihre bestehende Lösung.
Ihre Seite wird innerhalb des SocialHub-Administrators gerendert, daher sollte sie so aussehen, als ob sie dazugehört. Der Admin ist ein einzelnes flaches, leichtes Theme, das auf ein paar Token basiert – spiegeln Sie sie wider. Flash umschließt Ihre Seite bereits in einem betitelten Fenster mit einem „Drittanbieter“-Logo. Fügen Sie also keine eigene obere Leiste, Seitenleiste oder ganzseitiges Chrome hinzu. Rendern Sie einfach den Inhalt.
/* Starter tokens that match the SocialHub admin (flat, light, single-accent).
Drop into your embedded page so it feels native, not bolted on. */
:root {
/* type — the admin's three families */
--font-sans: "Inter", -apple-system, "Segoe UI", Roboto, sans-serif;
--font-display: "Plus Jakarta Sans", "Inter", system-ui, sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
/* surfaces — light theme only (the admin has no dark mode) */
--bg: #fafbfc; /* page background */
--surface: #ffffff; /* cards / panels */
--subtle: #f7fafc; /* muted fills */
--border: #e2e8f0; /* hairlines */
/* text */
--text: #121c3d; /* primary (brand navy) */
--text-2: #4a5568; /* secondary */
--muted: #64748b; /* muted */
/* accent — the admin's primary action colour */
--accent: #2ecc87;
--accent-dark: #25b678;
/* radius + 4px spacing scale + elevation */
--radius: 8px; --radius-lg: 12px;
--space-2: 8px; --space-3: 12px; --space-4: 16px; --space-6: 24px;
--shadow-sm: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
}
body { margin: 0; background: var(--bg); color: var(--text);
font: 14px/1.5 var(--font-sans); }
h1, h2, h3 { font-family: var(--font-display); color: var(--text); }
.card { background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
padding: var(--space-4); }
.btn { background: var(--accent); color: #fff; border: 0; font-weight: 600;
border-radius: var(--radius); padding: 8px 14px; cursor: pointer; }
.btn:hover { background: var(--accent-dark); }
code { font-family: var(--font-mono); color: var(--text-2); }Keine eigenen Einstellungen
Flash stellt den Fensterrahmen und das Badge bereit. Überspringen Sie die globale Navigation/Seitenleiste/Kopfzeile Ihrer App – rendern Sie nur das Tool.
Hell, flach, ein Akzent
Nur helles Design (Admin-Bereich hat keinen Dunkelmodus): weiße Karten auf einer #fafbfc-Seite, schmale #e2e8f0-Rahmen, ein grüner Akzent (#2ecc87).
Füllen Sie die Breite, fließen Sie die Höhe
Nutzen Sie die volle Breite und lassen Sie den Inhalt fließen. Der Host passt die Rahmengröße an (ungefähr die volle Viewport-Höhe) und scrollt automatisch – erzwingen Sie keine eigene 100vh-Einstellung oder feste Fußzeilen.
Sanftes Auslaufen
Die Schriftarten (Inter / Plus Jakarta Sans / JetBrains Mono) verwenden standardmäßig die System-UI-Schriftart, wenn sie nicht selbst gehostet werden. Die Einstellungen „prefers-reduced-motion“ und „prefers-color-scheme: light“ werden berücksichtigt.
Diese Werte verfolgen das aktuelle Admin-Theme; Betrachten Sie sie als Ausgangspunkt und behalten Sie Ihre eigene Marke dort, wo es darauf ankommt. Das Ziel ist eine Seite, die sich wie eine Oberfläche mit SocialHub liest, und nicht wie ein Fenster zu einem anderen Produkt.
Ein vollständiges Beispiel
Eine funktionierende eingebettete Seite mit ca. 30 Zeilen.
Ein minimaler Express-Server, den Sie direkt ausführen und registrieren können: Er ermöglicht es Flash, sich einzubetten, verifiziert das Identitätstoken, autorisiert die Rolle des Operators und rendert ein auf den Arbeitsbereich beschränktes Tool. Kopieren Sie das Signaturgeheimnis aus dem Manager in FLASH_EMBED_SECRET und führen Sie es aus.
// server.js — a complete, minimal SocialHub Embedded Page (Express + jose).
// Register https://<host>/embed in Flash → Settings → Embedded Pages, allow the
// origin https://<host>, pick roles/tier, then copy the signing secret into env.
import express from "express";
import { jwtVerify } from "jose";
const app = express();
const SECRET = new TextEncoder().encode(process.env.FLASH_EMBED_SECRET); // slotsec_…
const FLASH = "https://flash.socialhub.ai";
app.get("/embed", async (req, res) => {
// 1. Let ONLY Flash frame this page.
res.setHeader("Content-Security-Policy", "frame-ancestors " + FLASH);
// 2. Read + verify the identity token Flash appended (?flash_context=…).
let ctx;
try {
const { payload } = await jwtVerify(String(req.query.flash_context || ""), SECRET, {
algorithms: ["HS256"], issuer: "flash", audience: "nav.page",
requiredClaims: ["exp", "jti"], maxTokenAge: "120s",
});
ctx = payload.ctx; // { teamId, userId, role, pageType, locale }
} catch {
return res.status(401).send("<p>Unauthorized — open this from inside SocialHub.</p>");
}
// 3. Authorize on the VERIFIED role (never on the raw request).
const canEdit = ctx.role === "org_owner" || ctx.role === "org_admin";
// 4. Render your tool, scoped to ctx.teamId. (Values are verified + opaque;
// still escape anything user-supplied you add.)
res.send(
'<!doctype html><meta charset="utf-8"><body style="font:14px system-ui;padding:24px">' +
'<h1>Returns portal</h1>' +
'<p>Workspace <code>' + ctx.teamId + '</code> · operator <code>' + ctx.userId +
'</code> · role <b>' + ctx.role + '</b></p>' +
(canEdit ? '<button>Process a return</button>' : '<p>Read-only for your role.</p>') +
'</body>'
);
});
app.listen(3000, () => console.log("Embedded page on :3000/embed"));1. Den Rahmen zulassen
Frame-Vorfahren https://flash.socialhub.ai – daher kann nur der SocialHub-Administrator einen Iframe erstellen.
2 · Token verifizieren
Lesen Sie ?flash_context, prüfen Sie HS256 + Aussteller-Flash + Zielgruppen-Navigationsseite + ≤120 Sekunden Ablaufzeit; andernfalls ablehnen.
3 · Autorisieren
Gate-Funktionen für die VERIFIED-Rolle (org_owner / org_admin / …), niemals bei der Rohanfrage.
4 · Rendern, Scope
Rendern Sie Ihr Tool für ctx.teamId – den Arbeitsbereich, in dem es geöffnet wurde.
Dann unter Flash → Einstellungen → Eingebettete Seiten: Fügen Sie die URL hinzu (z. B. https://tools.yourapp.com/embed), listen Sie denselben Ursprung auf, wählen Sie die Rollen + Ebene aus, die ihn öffnen darf, und fügen Sie das einmalige Signaturgeheimnis in die Umgebung Ihres Servers ein. Es wird nun unter Apps für die von Ihnen zugelassenen Operatoren angezeigt.