SocleHub
Utilisateurs Changer de tenant

Changer le mot de passe

Minimum 8 caracteres

← Retour à la liste

API …

URL publique
—

Configuration

Chargement…

Modifier

Cible backend

…

Headers HTTP que l'APIM injecte

X-Apim-Tenant-Id:    6
X-Apim-Tenant-Slug:  apim-test
X-Apim-User-Id:      42
X-Apim-Key-Id:       25
X-Apim-Key-Name:     data-app-demo
X-Apim-Scopes:       api:<slug>:read
X-Apim-Request-Id:   uuid-tracing
X-Apim-Plan:         business

Snippets backend ready-to-paste

Copie-colle dans ton code backend pour lire l'identité injectée par APIM.

@RestController
public class MyController {

    @GetMapping("/api/data/items")
    public List<Item> list(
        @RequestHeader("X-Apim-Tenant-Id")   long   tenantId,
        @RequestHeader("X-Apim-Tenant-Slug") String tenantSlug,
        @RequestHeader("X-Apim-User-Id")     long   userId,
        @RequestHeader("X-Apim-Scopes")      String scopes,
        @RequestHeader("X-Apim-Request-Id")  String requestId) {

        // Filtrage par tenant — bonne pratique
        List<String> scopeList = Arrays.asList(scopes.split(","));
        if (!scopeList.contains("api:data:read") && !scopeList.contains("api:data:*")) {
            throw new ForbiddenException("Missing scope");
        }
        return itemService.findByTenant(tenantId);
    }
}
import express from 'express';
const app = express();

app.get('/api/data/items', (req, res) => {
    const tenantId   = parseInt(req.header('X-Apim-Tenant-Id'),   10);
    const tenantSlug = req.header('X-Apim-Tenant-Slug');
    const userId     = parseInt(req.header('X-Apim-User-Id'),     10);
    const scopes     = (req.header('X-Apim-Scopes') || '').split(',');
    const requestId  = req.header('X-Apim-Request-Id');

    if (!scopes.includes('api:data:read') && !scopes.includes('api:data:*')) {
        return res.status(403).json({ error: 'forbidden' });
    }
    res.json(itemsForTenant(tenantId));
});
from fastapi import FastAPI, Header, HTTPException
app = FastAPI()

@app.get("/api/data/items")
def list_items(
    x_apim_tenant_id:   int = Header(..., alias="X-Apim-Tenant-Id"),
    x_apim_tenant_slug: str = Header(..., alias="X-Apim-Tenant-Slug"),
    x_apim_user_id:     int = Header(..., alias="X-Apim-User-Id"),
    x_apim_scopes:      str = Header("",  alias="X-Apim-Scopes"),
    x_apim_request_id:  str = Header("",  alias="X-Apim-Request-Id"),
):
    scopes = x_apim_scopes.split(",")
    if "api:data:read" not in scopes and "api:data:*" not in scopes:
        raise HTTPException(403, "forbidden")
    return items_for_tenant(x_apim_tenant_id)
package main

import (
    "net/http"
    "strconv"
    "strings"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/api/data/items", func(c *gin.Context) {
        tenantId, _ := strconv.Atoi(c.GetHeader("X-Apim-Tenant-Id"))
        scopes := strings.Split(c.GetHeader("X-Apim-Scopes"), ",")
        hasRead := false
        for _, s := range scopes {
            if s == "api:data:read" || s == "api:data:*" {
                hasRead = true
                break
            }
        }
        if !hasRead {
            c.JSON(403, gin.H{"error": "forbidden"})
            return
        }
        c.JSON(200, itemsForTenant(tenantId))
    })
    r.Run(":8080")
}

Tenants éligibles

Tenants qui peuvent appeler cette API grâce à au moins une de leurs clés actives avec scope matchant.

Tenant Plan Keys Calls 30j Statut
Chargement…

Tarif de base

€ / call
—
€ / MB IN
—
€ / MB OUT
—
Mode
—

Règles JDM pricing actives

Chargement…

Simulateur

…

Règles JDM applicables (règles ciblant cette API + règles globales)

📚 Templates
# Slug Nom Point Scope Statut Prio
Chargement…

Derniers appels (last 50)

Voir audit complet →
Date Méthode Path Status Durée Tenant IP
Chargement…
Chargement de la documentation…
Démonstrateur RealMock · données fictivesHub TheSocle 3.77.0, société Exemplia. Survolez un bouton ou un champ, ou cliquez sur ? pour voir tout ce qui est expliqué.Sommaire