← Retour à la liste
API … 🔒 privée
URL publique
—
Provisioning en cours…
Tu peux quitter cette page, on te notifiera quand c'est prêt.
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
JWT signé activé sur cette API. Le backend reçoit aussi
Authorization: ApimSigned eyJ… validable via
/.well-known/jwks.json.
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)
| # | 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…