Custom UI sayfan iframe içinde açıldığında, hangi tenant'ın baktığını App Bridge'den aldığın session token ile öğrenirsin. Token'ı backend'inde webhookSecret ile doğrularsın; böylece iframe'den gelen istekler güvenle tenant'a bağlanır.
iframe sayfan (frontend)
│ const token = await bridge.getSessionToken(); // App Bridge
│ fetch('/api/me', { headers: { Authorization: 'Bearer ' + token } })
▼
Senin backend'in
1) token'ı webhookSecret ile doğrula (JWT HS256) — audience = pluginId ZORUNLU
2) claims: { iss, aud, sub, role, tenantId, pluginId, iat, exp }
tenant = claims.tenantId · userId = claims.sub · role = claims.role (manager|staff)
3) o tenant + kullanıcı için veriyi güvenle döndür// iframe Custom UI — App Bridge session token doğrulama (Node)
// Sayfan Restomenum içinde iframe olarak açılır; tenant kimliğini App Bridge'den alırsın:
// const token = await bridge.getSessionToken(); // (iframe içinde, frontend)
// fetch('/api/me', { headers: { Authorization: 'Bearer ' + token } });
// Backend'inde token'ı webhookSecret ile doğrula (JWT HS256):
import jwt from 'jsonwebtoken';
function verifySessionToken(bearer, webhookSecret, pluginId) {
const token = bearer.replace(/^Bearer /, '');
// HS256, webhookSecret ile imzalı. Claim'ler: { iss, aud, sub, role, tenantId, pluginId, iat, exp }
// sub = userId (iframe'i açan kullanıcı) role = manager | staff
// audience (= pluginId) doğrulaması ZORUNLU — başka eklentinin token'ı kabul edilmesin:
const claims = jwt.verify(token, webhookSecret, { algorithms: ['HS256'], audience: pluginId });
// per-user yetki: claims.role / claims.sub ile kur (ad/PII için users/get — users:read + consent)
return { tenantId: claims.tenantId, userId: claims.sub, role: claims.role, exp: claims.exp };
}webhookSecret'ıdır (token exchange'ten).audience = pluginId doğrulaması ZORUNLU (jwt.verify(…, { audience: pluginId }') — başka eklentinin token'ı kabul edilmesin. exp'in geçmediğini de doğrula.sub = userId (iframe'i açan kullanıcı), role = manager | staff → per-user yetkiyi bununla kur (ad/PII için users/get, users:read + consent)./plugins/ui, bridge, action, hook) tüm tenant kullanıcılarına açıktır (yalnız eklenti yönetimi manager-only). Belirli işlemleri kısıtlamak senin işin — gövdedeki/token'daki actor.role ile uygula (örn. "iadeyi yalnız manager yapabilir").