Tenant eklentiyi kurduğunda, Restomenum tarayıcıyı senin connectUrl'ine tek-kullanımlık bir code ile yönlendirir. Bu code'u sunucu tarafında credential'a çevirirsin (bir sonraki adım). Bu, eklentinin etkinleşmesi için zorunlu kapıdır.
Tenant: "Eklentiyi kur / Bağlan" │ ▼ Restomenum ──redirect──► https://<senin-origin>/connect?code=<once>&state=<csrf> │ ▼ Senin /connect (sunucu): 1) state'i doğrula (CSRF) 2) code'u Token exchange ile credential'a çevir (adım 2) 3) credential'ı tenant başına sakla 4) kendi paneline yönlendir
// /connect — OAuth Connect redirect hedefi (Node + Express)
// Tenant eklentiyi kurunca tarayıcı buraya ?code=..&state=.. ile gelir.
// client_secret SADECE burada (sunucuda) kullanılır; tarayıcıya ASLA gitmez.
import express from 'express';
const app = express();
const CLIENT_ID = process.env.RESTOMENUM_CLIENT_ID; // = pluginId
const CLIENT_SECRET = process.env.RESTOMENUM_CLIENT_SECRET; // portalda üretilen cs_...
const TOKEN_URL = 'https://<runtime>/plugin-api/oauth/token';
app.get('/connect', async (req, res) => {
const { code, state } = req.query;
// 1) CSRF: state'i kurulum başlangıcında oturuma yazdıysan burada doğrula
if (!verifyState(state)) return res.status(400).send('invalid state');
// 2) code → credential exchange (server-to-server)
const r = await fetch(TOKEN_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
grant_type: 'authorization_code',
code,
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
}),
});
if (!r.ok) return res.status(502).send('exchange failed');
const { apiKey, webhookSecret, tenantId, scopes } = await r.json();
// 3) tenant başına SAKLA (apiKey: Callback API çağrıları, webhookSecret: imza doğrulama)
await saveInstallCredentials({ tenantId, apiKey, webhookSecret, scopes });
res.redirect('/panel?connected=1'); // kendi paneline dön
});state parametresini kurulum başlangıcında üret ve /connect'te doğrula (CSRF).code'u Token exchange ile değiştir.client_secret yalnız sunucuda kullanılır; tarayıcıya/iframe'e asla gönderme. codetek kullanımlıktır ve kısa ömürlüdür.