Authentification
Comment s'authentifier sur l'API Diamond Careers : récupérer un jeton JWT, l'utiliser dans les requêtes et gérer son cycle de vie.
L'API Diamond Careers utilise une authentification par jeton Bearer JWT, émis par le plugin JWT Authentication for WP REST API installé sur la plateforme. Vous récupérez un jeton via une seule requête, puis vous le passez en en-tête HTTP sur chaque appel.
Les jetons API sont délivrés à tout compte WordPress de la plateforme, mais les permissions appliquées dépendent du rôle. Pour une intégration externe (ATS, SIRH), un compte technique avec rôle etablissement ou groupe est créé par notre équipe : voir la procédure dans Vue d'ensemble.
Vue d'ensemble
┌──────────┐ POST /wp-json/jwt-auth/v1/token ┌─────────────────┐
│ Client │ ───────────────────────────────────────▶ │ Diamond API │
│ ATS/SIRH│ { username, password } │ │
└──────────┘ └─────────────────┘
▲ │
│ { token, user_email, user_display_name } │
└─────────────────────────────────────────────────────────┘
┌──────────┐ Authorization: Bearer <token> ┌─────────────────┐
│ Client │ ─────────────────────────────────────▶ │ Diamond API │
└──────────┘ └─────────────────┘Le endpoint d'émission du jeton n'est pas sous le namespace /diamond/v1 mais sous /jwt-auth/v1 (plugin tiers). Tous les autres endpoints documentés sont bien sous /diamond/v1.
Obtenir un jeton
curl -X POST "https://diamondcareers.fr/wp-json/jwt-auth/v1/token" \
-H "Content-Type: application/json" \
-d '{
"username": "integration@votre-etablissement.com",
"password": "VotreMotDePasseTechnique"
}'Le champ username accepte indifféremment l'email ou l'identifiant WordPress du compte.
Réponse :
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"user_email": "integration@votre-etablissement.com",
"user_nicename": "integration-etablissement",
"user_display_name": "Intégration ATS"
}Le jeton a une durée de validité encodée dans son claim exp (timestamp Unix). La durée par défaut du plugin JWT est de 7 jours. Stockez-le côté serveur, jamais dans le navigateur de l'utilisateur final.
Cette réponse ne contient pas le profil métier (rôle, maison rattachée, etc.). Pour le récupérer, appelez ensuite GET /diamond/v1/auth/me avec le jeton.
Récupérer le profil
curl "https://api.diamondcareers.fr/diamond/v1/auth/me" \
-H "Authorization: Bearer <votre_token>"Réponse type :
{
"id": 42,
"email": "integration@votre-etablissement.com",
"display_name": "Intégration ATS",
"role": "etablissement",
"linked": {
"type": "maison",
"id": 87,
"member_role": "owner"
}
}Utiliser le jeton
Sur chaque requête vers /diamond/v1/*, ajoutez l'en-tête Authorization préfixé de Bearer :
curl "https://api.diamondcareers.fr/diamond/v1/offres" \
-H "Authorization: Bearer <votre_token>"Si le jeton est valide et le périmètre cohérent, vous recevez 200 OK avec la ressource. Sinon 401 Unauthorized (jeton invalide/expiré) ou 403 Forbidden (hors périmètre).
Vérifier la validité
Le moyen le plus simple : appeler GET /diamond/v1/auth/me.
curl "https://api.diamondcareers.fr/diamond/v1/auth/me" \
-H "Authorization: Bearer <votre_token>"200 OK avec un objet utilisateur → jeton valide. 401 → jeton expiré ou invalide, régénérez-en un.
Le plugin JWT propose aussi un endpoint dédié POST /wp-json/jwt-auth/v1/token/validate qui répond 200 ou 403.
Cycle de vie
Renouvellement à expiration. Utilisez le jeton jusqu'à recevoir une 401, puis appelez à nouveau /wp-json/jwt-auth/v1/token pour un nouveau. Simple, mais peut introduire un délai d'erreur en pleine action.
Renouvellement préventif. Lisez le claim exp du jeton et renouvelez-le avant expiration. Plus robuste pour les intégrations critiques.
// Extraire la date d'expiration du jeton
function getTokenExpiration(token) {
const payloadBase64 = token.split('.')[1];
const payload = JSON.parse(Buffer.from(payloadBase64, 'base64').toString());
return new Date(payload.exp * 1000);
}Cookie + nonce (SPA même domaine, lecture seule)
Si vous consommez l'API depuis un client navigateur hébergé sur diamondcareers.fr (cas de la SPA Next interne), une alternative au JWT existe : authentification par cookie WordPress + nonce REST.
# 1. Récupérer le nonce (cookie WP existant requis)
curl "https://diamondcareers.fr/wp-json/diamond/v1/auth/bootstrap" \
--cookie "wordpress_logged_in_xxx=..."
# Réponse :
# { "logged_in": true, "user": {...}, "nonce": "abc123..." }
# 2. Utiliser le nonce sur les requêtes suivantes
curl "https://diamondcareers.fr/wp-json/diamond/v1/auth/me" \
--cookie "wordpress_logged_in_xxx=..." \
-H "X-WP-Nonce: abc123..."Ce flux n'est pas adapté aux intégrations externes (cookies cross-domain bloqués). Préférez le JWT pour tout client serveur.
Périmètre du jeton
Un jeton est lié au compte qui l'a généré. Concrètement :
- Compte établissement : accès limité à la maison rattachée. Vous ne voyez que vos propres offres, candidatures, articles, médias. Une tentative d'accès à une autre maison renvoie
403 Forbidden. - Compte groupe : accès aux maisons rattachées au groupe. Vous voyez en lecture l'ensemble des offres et candidatures de ces maisons, et accédez aux endpoints
/groupes/{id}/*agrégés.
Au sein de l'établissement, la granularité est portée par le rôle membre :
owner— gestion complète : offres, candidatures, articles, équipe.editor— gestion des offres, candidatures et articles. Pas de gestion d'équipe.viewer— lecture seule.
Les actions interdites par le rôle renvoient 403 Forbidden.
Bonnes pratiques de sécurité
Stockez les identifiants côté serveur uniquement. Jamais dans du code côté client (navigateur, mobile). Utilisez des variables d'environnement ou un coffre-fort secrets.
HTTPS obligatoire. Toutes les communications passent en HTTPS.
Renouvelez les mots de passe régulièrement. Le compte technique doit avoir un mot de passe long et unique, renouvelé au moins une fois par an.
Limitez les permissions au strict nécessaire. Demandez le rôle adapté à votre besoin (souvent editor suffit pour un ATS qui pousse des offres et lit des candidatures, owner n'est utile que si vous gérez aussi l'équipe).
Erreurs courantes
| Erreur | Cause probable | Solution |
|---|---|---|
401 Unauthorized au login ([jwt_auth] invalid_username / [jwt_auth] incorrect_password) | Identifiants incorrects | Vérifiez username (email ou login WP) et password |
401 Unauthorized après login ([jwt_auth] jwt_auth_invalid_token) | Jeton expiré ou mal formé | Régénérez via /wp-json/jwt-auth/v1/token |
403 Forbidden | Permission insuffisante (rôle ou périmètre) | Vérifiez votre rôle membre et la maison ciblée |
Authorization header missing | En-tête Authorization absent | Vérifiez votre client HTTP |
Bearer prefix missing | Préfixe Bearer manquant | Préfixez la valeur de l'en-tête avec Bearer (espace inclus) |
Vue d'ensemble de l'API
Introduction à l'API publique de Diamond Careers : périmètre, base URL, conventions REST et premiers pas pour connecter votre établissement à un ATS, un SIRH ou un outil RH externe.
Référence complète des endpoints
Spécification OpenAPI 3.1 de l'API publique Diamond Careers, paramètres, corps de requête et schémas de réponse.