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 euch 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 Identity-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' });
}
}