Deine App akzeptiert nur Requests, die über MeinGPT kommen, und nutzt MeinGPT als vertrauenswürdigen Auth-Proxy.
Token empfangen — Der JWT wird im URL-Hash übergeben:
const token = new URLSearchParams(window.location.hash.slice(1)).get('token');
Token verifizieren — Prüfe Signatur und Claims serverseitig über den JWKS-Endpunkt.
Ablauf beachten — Tokens laufen nach 1 Stunde ab; Refresh erfolgt per postMessage.
- JWT-Signatur über JWKS verifizieren
iss auf MeinGPT prüfen
aud auf erwartete organizationId prüfen
exp/iat validieren
- Requests ohne validen Token ablehnen
JWKS-Endpunkt:
https://app.meingpt.com/api/custom-apps/v1/jwks/{organizationId}
| Claim | Beschreibung |
|---|
iss | immer https://app.meingpt.com |
sub | eindeutige Nutzer-ID |
aud | Organisations-ID |
exp / iat | Ablauf- und Ausstellungszeit |
email, username | Nutzeridentität |
role, teams | Rollen-/Teamkontext für Autorisierung |
Setze CSP für Dein Frontend:
Content-Security-Policy: frame-ancestors https://app.meingpt.com;
Optional mit weiteren erlaubten Domains (z. B. regionale Hostnamen), falls bei Dir verwendet.
- API-Keys bleiben serverseitig in Deiner App
- Frontend ruft nur Deine Backend-Endpunkte
- Backend setzt Berechtigungen anhand der MeinGPT-JWT-Claims durch
Damit fungiert MeinGPT als Identitäts-Quelle und Dein Backend als Policy-Enforcer.
import * as jose from 'jose';
const JWKS = jose.createRemoteJWKSet(
new URL('https://app.meingpt.com/api/custom-apps/v1/jwks/<ORG_ID>')
);
export async function requireMeinGPTAuth(req, res, next) {
try {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) return res.status(401).json({ error: 'Missing token' });
const { payload } = await jose.jwtVerify(token, JWKS, {
issuer: 'https://app.meingpt.com',
audience: '<ORG_ID>',
});
req.user = payload;
next();
} catch {
res.status(401).json({ error: 'Invalid token' });
}
}