SSO Intercom et Zendesk avec Auth0 : authentification unifiée pour le support

Permettre à vos utilisateurs de se connecter à Intercom et Zendesk avec les mêmes credentials. Identity Verification, JWT SSO et widget integration.

Par Auth0.Expert · 2025-04-15 · 9 min de lecture

Intercom Zendesk SSO Support

SSO Intercom et Zendesk avec Auth0

TL;DR

Intercom et Zendesk supportent l'Identity Verification via un HMAC signé. Avec Auth0, vous générez ce hash côté serveur pour authentifier silencieusement vos utilisateurs dans le widget de support.

---

Intercom Identity Verification

Comment ça marche

Ce schéma présente tout le processus d'identification utilisateur avec Intercom et Auth0 : il s'agit de vérifier que l'utilisateur authentifié correspond à l'identité transmise au widget Intercom.

1. Utilisateur connecté à votre app (Auth0 token valide)
2. Votre backend génère un HMAC(user_id, secret_key)
3. Ce hash est passé à window.Intercom('boot', { user_hash: hash })
4. Intercom vérifie → accès au chat avec l'historique du contact

Backend : générer le hash HMAC

Ce code Python montre comment générer un hash HMAC à partir du user_id Auth0 pour valider l'identité côté Intercom.

import hmac
import hashlib

INTERCOM_SECRET_KEY = os.environ['INTERCOM_IDENTITY_VERIFICATION_SECRET']

def generate_intercom_hash(user_id: str) -> str:
    """Génère le hash HMAC pour Intercom Identity Verification."""
    return hmac.new(
        INTERCOM_SECRET_KEY.encode('utf-8'),
        user_id.encode('utf-8'),
        hashlib.sha256
    ).hexdigest()

@app.get('/api/intercom/identity')
async def get_intercom_identity(payload=Depends(get_current_user)):
    user_id = payload['sub']  # Auth0 user_id
    user_hash = generate_intercom_hash(user_id)

    return {
        'user_id': user_id,
        'user_hash': user_hash,
        'email': payload.get('email'),
        'name': payload.get('name'),
    }

Ce code retourne un objet JSON contenant l'identité de l'utilisateur et le hash sécurisé attendu par Intercom.

Frontend : initialiser Intercom

Ce script côté frontend permet d'initialiser Intercom avec les infos récupérées via Auth0, en incluant le hash d'identité sécurisé provenant de votre backend.

// Après login Auth0, initialiser Intercom avec l'identité
const { user, getAccessTokenSilently } = useAuth0();

useEffect(() => {
  if (!user) return;

  async function initIntercom() {
    const token = await getAccessTokenSilently();

    // Récupérer le hash depuis votre backend
    const { user_hash } = await fetch('/api/intercom/identity', {
      headers: { Authorization: `Bearer ${token}` },
    }).then(r => r.json());

    window.Intercom('boot', {
      app_id: 'YOUR_INTERCOM_APP_ID',
      user_id: user.sub,
      email: user.email,
      name: user.name,
      user_hash: user_hash,
      // Données custom
      plan: user['https://yourapp.com/plan'],
      company: {
        id: user['https://yourapp.com/company_id'],
        name: user['https://yourapp.com/company_name'],
      },
    });
  }

  initIntercom();
}, [user]);

Cette logique permet à tous les utilisateurs connectés via Auth0 d'accéder au support Intercom sans resaisir leurs infos.

---

Zendesk SSO avec Auth0

Avant toute configuration, il est important de connecter Auth0 en tant que fournisseur d'identité (IdP) à Zendesk pour activer le SSO centralisé.

1. Configurer Auth0 comme IdP Zendesk

Ajoutez et configurez l'addon Zendesk sur votre application Auth0 pour fournir à Zendesk les informations SAML nécessaires.

{
  "name": "zendesk",
  "options": {
    "zendesk_subdomain": "yourcompany"
  }
}

URL SSO Zendesk : https://YOUR_DOMAIN.auth0.com/samlp/APPLICATION_CLIENT_ID

2. Configurer Zendesk

Dans l’interface Zendesk, indiquez les URLs de redirection et certificats pour permettre l'authentification via Auth0.

Remote Login URL: https://YOUR_DOMAIN.auth0.com/samlp/CLIENT_ID
Certificate Fingerprint: [de la config Auth0]
Remote Logout URL: https://YOUR_DOMAIN.auth0.com/samlp/CLIENT_ID/logout

3. JWT SSO (alternative SAML)

Ce code backend Node.js montre comment générer un JWT pour permettre à vos utilisateurs de se connecter à Zendesk depuis votre application Auth0.

// Backend : générer un JWT Zendesk
const jwt = require('jsonwebtoken');

function generateZendeskToken(user) {
  const payload = {
    jti: crypto.randomUUID(),
    iat: Math.floor(Date.now() / 1000),
    name: user.name,
    email: user.email,
    external_id: user.sub,  // Auth0 user_id
    organization: user.company_name,
    tags: user.plan ? [user.plan] : [],
    role: user.role === 'admin' ? 'agent' : 'end-user',
  };

  return jwt.sign(payload, process.env.ZENDESK_SHARED_SECRET);
}

@app.get('/api/zendesk/sso')
async def zendesk_sso(payload=Depends(get_current_user)):
    token = generateZendeskToken(payload)
    subdomain = 'yourcompany'
    return_to = request.query_params.get('return_to', f'https://{subdomain}.zendesk.com')

    # Rediriger vers Zendesk avec le token
    redirect_url = f'https://{subdomain}.zendesk.com/access/jwt?jwt={token}&return_to={return_to}'
    return RedirectResponse(redirect_url)

En résumé, le backend génère un JWT court et redirige vers Zendesk pour connecter automatiquement l'utilisateur via SSO.

4. Bouton SSO dans votre app

Voici comment proposer un bouton support qui déclenchera l'authentification SSO avec Zendesk pour vos utilisateurs Auth0.

function SupportButton() {
  const { getAccessTokenSilently } = useAuth0();

  const openZendesk = async () => {
    const token = await getAccessTokenSilently();
    // Votre backend redirige vers Zendesk SSO
    window.open(`/api/zendesk/sso?token=${token}`, '_blank');
  };

  return (
    <button onClick={openZendesk}>
      💬 Contacter le support
    </button>
  );
}

Ce bouton permet d'offrir une expérience utilisateur cohérente et sécurisée pour accéder au support Zendesk sans friction.

---

Synchroniser les données utilisateur

Grâce à ce script d’Action Post Login Auth0, vous pouvez synchroniser les données utilisateur (plan, email, date de connexion) vers Intercom ou Zendesk après chaque login.

// Action Post Login : enrichir Intercom et Zendesk avec le plan
exports.onExecutePostLogin = async (event, api) => {
  const plan = event.user.app_metadata?.plan || 'free';
  const api_url = event.secrets.BACKEND_URL;

  // Mettre à jour Intercom via votre backend (fire & forget)
  fetch(`${api_url}/api/intercom/update-contact`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      auth0_id: event.user.user_id,
      email: event.user.email,
      plan: plan,
      last_login: new Date().toISOString(),
    }),
  }).catch(() => {}); // Non-bloquant
};

Cette logique garantit que les informations de support sont toujours à jour côté Intercom/Zendesk, sans perturber la connexion utilisateur.

---

> 💬 Intégration support unifiée : nous configurons votre SSO Intercom/Zendesk avec Auth0 pour une expérience utilisateur seamless entre votre app et le support.

📧 [email protected]


Autres articles