1 · OAuth Connect (/connect)

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.

Akış

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

Referans — /connect (Node)

// /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
});

Adımlar

  1. Manifest'te Connect path tanımla (sürümün Origin'i + path).
  2. state parametresini kurulum başlangıcında üret ve /connect'te doğrula (CSRF).
  3. Gelen code'u Token exchange ile değiştir.
  4. Connect tamamlanmadan eklenti aktif olmaz; akışı eksiksiz tamamla.
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.
Bu akışı yayınlamadan denemek için Test Mağazaları (Dev Stores) kullan — yayınlanmamış eklentini kendi test restoranında kurup connect'i uçtan uca test edebilirsin.