Aller à la documentation
SparkGlimSparkGlim Développeurs
Rechercher dans toute la documentation

Essayez un sujet dans votre langue ou un chemin API exact.

    SparkGlim Développeurs

    Le bon identifiant pour chaque périmètre.

    Lectures publiques, signatures Organisation et sessions Revendeur répondent à des modèles différents.

    Clés et capacités

    Copiez la valeur unique keyId:secret des paramètres Créateur. Les clés publiques utilisent x-white-label-key ; les clés privées restent sur votre serveur.

    Domaines et origine des requêtes

    Liez la signature au domaine vérifié, à la méthode, au chemin complet, à la requête canonique et aux octets exacts du corps. Utilisez un nonce frais à chaque tentative.

    Nouvelles tentatives et idempotence

    La tolérance temporelle est de cinq minutes. Nonces et clés d’idempotence comportent 16–128 lettres, chiffres, tirets ou soulignements. Une clé stable ne remplace pas un nonce frais.

    Accès Revendeur

    Le portail Revendeur utilise la session SparkGlim existante et la relation membre autorisée. Les routes publiques suivent leurs règles documentées, sans en-têtes de clé privée Organisation.

    Requête illustrative avec valeurs fictives

    API Organisation Version 1
    typescript
    import { createHash, createHmac, randomBytes } from 'node:crypto'
    
    // Server-side only; this example signs but does not send a request.
    const [keyId, secret] = process.env.SPARKGLIM_PRIVATE_KEY.split(':')
    const domain = process.env.SPARKGLIM_VERIFIED_DOMAIN
    const url = new URL('https://api.sparkglim.net/api/white-label/v1/context')
    const timestamp = String(Date.now())
    const nonce = randomBytes(16).toString('hex')
    const method = 'GET'
    const body = ''
    const idempotencyKey = '' // Stable operation key for routes that require it.
    const campaignKey = '' // Complete optional scoped campaign credential.
    const pairs = [...url.searchParams.entries()].sort((a, b) =>
      a[0] === b[0] ? a[1].localeCompare(b[1]) : a[0].localeCompare(b[0]))
    const query = pairs.map(([key, value]) =>
      encodeURIComponent(key) + '=' + encodeURIComponent(value)).join('&')
    const pathname = url.pathname.replace(/\/$/, '') || '/'
    const bodyHash = createHash('sha256').update(body).digest('hex')
    const canonical = ['v2', domain, idempotencyKey, campaignKey,
      timestamp, nonce, method, pathname, query, bodyHash].join('.')
    const signature = createHmac('sha256', secret).update(canonical).digest('hex')
    const headers = {
      'x-white-label-domain': domain,
      'x-white-label-key-id': keyId,
      'x-white-label-signature-version': '2',
      'x-white-label-timestamp': timestamp,
      'x-white-label-nonce': nonce,
      'x-white-label-signature': signature,
    }
    // For signed POST requests, hash the exact JSON string sent as the body.
    // Add X-Idempotency-Key when required and include it in canonical.
    // Never expose this private key or generated headers to a public client.