Module 3 - Configuration du SSO (Single Sign-On)

Maîtrisez la configuration des systèmes d'authentification unique pour WikiJS

Module 3

Introduction au SSO

Le Single Sign-On (SSO) permet aux utilisateurs de se connecter à WikiJS avec leurs comptes existants (Google, Microsoft, LDAP, etc.). Dans ce module, nous configurerons plusieurs méthodes d'authentification.

Méthodes SSO supportées par WikiJS
  • OAuth 2.0 : Google, GitHub, Facebook
  • Microsoft : Azure AD, Office 365
  • LDAP : Active Directory, OpenLDAP
  • SAML 2.0 : Okta, Auth0, ADFS
  • OpenID Connect : Standards modernes
  • CAS : Central Authentication Service
  • Discord : Authentification Discord
  • Slack : Intégration workspace
Prérequis

Pour suivre ce module, vous devez avoir WikiJS installé et fonctionnel (Module 2 complété). Vous devrez également créer des applications/comptes développeur chez les fournisseurs SSO choisis.

Concepts fondamentaux du SSO

Authentification

Vérification de l'identité de l'utilisateur par un service externe. L'utilisateur s'authentifie une seule fois.

Autorisation

Définition des permissions et rôles de l'utilisateur authentifié dans WikiJS.

Flux SSO typique
1
Utilisateur accède à WikiJS
2
WikiJS redirige vers le fournisseur SSO
3
Utilisateur s'authentifie chez le fournisseur
4
Fournisseur retourne un token d'authentification
5
WikiJS valide le token et connecte l'utilisateur
Avantages du SSO
  • Expérience utilisateur : Un seul mot de passe à retenir
  • Sécurité : Centralisation des politiques de sécurité
  • Administration : Gestion centralisée des utilisateurs
  • Audit : Traçabilité des connexions

Configuration OAuth (Google, GitHub)

OAuth 2.0 - Authentification déléguée

OAuth permet à WikiJS d'authentifier les utilisateurs via Google, GitHub, Facebook, etc. sans avoir accès à leurs mots de passe.

Google
GitHub
Facebook
Configuration Google OAuth
1
Créer un projet Google Cloud
Étapes Google Cloud Console
# 1. Aller sur https://console.cloud.google.com/
# 2. Créer un nouveau projet ou sélectionner un existant
# 3. Activer l'API Google+ 
# 4. Aller dans "Identifiants" → "Créer des identifiants" → "ID client OAuth 2.0"
# 5. Type d'application : "Application Web"
# 6. Origines JavaScript autorisées : http://localhost:3000
# 7. URI de redirection : http://localhost:3000/login/google/callback
2
Configuration dans WikiJS
Interface d'administration WikiJS
# 1. Se connecter en tant qu'admin sur WikiJS
# 2. Aller dans Administration → Authentification
# 3. Cliquer sur "+ Ajouter une stratégie"
# 4. Sélectionner "Google"
# 5. Remplir les champs :
#    - Client ID : [votre client ID Google]
#    - Client Secret : [votre client secret Google]
# 6. Activer la stratégie
# 7. Sauvegarder
Exemple de configuration Google OAuth
# Configuration Google OAuth dans WikiJS
google:
  enabled: true
  clientId: "123456789-abcdefghijk.apps.googleusercontent.com"
  clientSecret: "GOCSPX-votre_client_secret_ici"
  domain: ""  # Optionnel : restreindre à un domaine
  
  # Mapping automatique des utilisateurs
  autoRegister: true
  autoAssignGroups: ["users"]
  
  # Champs utilisateur mappés
  mapProfile:
    id: "id"
    displayName: "displayName"  
    email: "email"
    avatar: "picture"
Configuration GitHub OAuth
1
Créer une GitHub App
GitHub Developer Settings
# 1. Aller sur https://github.com/settings/developers
# 2. "OAuth Apps" → "New OAuth App"
# 3. Application name : "MonWiki"
# 4. Homepage URL : http://localhost:3000
# 5. Authorization callback URL : http://localhost:3000/login/github/callback
# 6. Cliquer "Register application"
# 7. Noter le Client ID et Client Secret
Configuration GitHub dans WikiJS
# Configuration GitHub OAuth
github:
  enabled: true
  clientId: "votre_github_client_id"
  clientSecret: "votre_github_client_secret"
  
  # Options avancées
  autoRegister: true
  autoAssignGroups: ["developers"]
  
  # Restriction par organisation (optionnel)
  organizations: ["mon-entreprise"]
  
  # Mapping des champs
  mapProfile:
    id: "id"
    displayName: "login"
    email: "email"
    avatar: "avatar_url"
Configuration Facebook OAuth
Facebook for Developers

Créez une application sur Facebook for Developers et configurez Facebook Login avec l'URI de redirection appropriée.

Configuration Facebook dans WikiJS
# Configuration Facebook OAuth
facebook:
  enabled: true
  appId: "votre_facebook_app_id"
  appSecret: "votre_facebook_app_secret"
  
  # Permissions demandées
  scope: "public_profile,email"
  
  # Configuration utilisateur
  autoRegister: true
  autoAssignGroups: ["users"]

Configuration Microsoft Azure AD

Azure Active Directory

Intégration avec Azure AD pour les environnements d'entreprise utilisant Microsoft 365, Office 365 ou Azure AD.

1
Enregistrer l'application dans Azure AD
Azure Portal - App Registration
# 1. Aller sur https://portal.azure.com
# 2. Azure Active Directory → App registrations
# 3. "New registration"
#    - Name: WikiJS-SSO
#    - Supported account types: selon vos besoins
#    - Redirect URI: Web - http://localhost:3000/login/microsoft/callback
# 4. Créer l'application
# 5. Noter l'Application (client) ID et Directory (tenant) ID
2
Créer un client secret
Génération du secret client
# Dans votre app registration :
# 1. "Certificates & secrets"
# 2. "New client secret"
# 3. Description: WikiJS Secret
# 4. Expires: 24 months (recommandé)
# 5. Ajouter et noter immédiatement la "Value"
3
Configuration des permissions API
API Permissions
# Permissions requises :
# 1. "API permissions" → "Add a permission"
# 2. Microsoft Graph → Delegated permissions
# 3. Ajouter :
#    - openid
#    - profile  
#    - email
#    - User.Read
# 4. "Grant admin consent" si vous êtes admin
Configuration Microsoft Azure AD dans WikiJS
# Configuration Microsoft Azure AD
microsoft:
  enabled: true
  clientId: "votre-application-client-id"
  clientSecret: "votre-client-secret"
  tenantId: "votre-tenant-id"  # ou "common" pour multi-tenant
  
  # Configuration avancée
  resource: "https://graph.microsoft.com/"
  autoRegister: true
  autoAssignGroups: ["employees"]
  
  # Restriction par domaine
  allowedDomains: ["monentreprise.com"]
  
  # Mapping utilisateur
  mapProfile:
    id: "id"
    displayName: "displayName"
    email: "mail" 
    avatar: "photo"
    
  # Synchronisation des groupes Azure AD
  syncGroups: true
  groupAttribute: "groups"

Configuration LDAP / Active Directory

LDAP - Lightweight Directory Access Protocol

Authentification contre un serveur LDAP ou Active Directory d'entreprise. Idéal pour les environnements corporate existants.

Prérequis LDAP
  • Accès réseau au serveur LDAP/AD
  • Compte de service avec permissions de lecture
  • Connaissance de la structure de l'annuaire
  • Certificats SSL si LDAPS est utilisé
Active Directory
OpenLDAP
Configuration Active Directory
Configuration AD typique
# Configuration Active Directory dans WikiJS
ldap:
  enabled: true
  
  # Connexion au serveur
  url: "ldap://dc.monentreprise.local:389"
  # ou pour LDAPS : "ldaps://dc.monentreprise.local:636"
  
  # Compte de service
  bindDN: "CN=wikijs-service,OU=Service Accounts,DC=monentreprise,DC=local"
  bindCredentials: "MotDePasseService123!"
  
  # Base de recherche
  searchBase: "DC=monentreprise,DC=local"
  searchFilter: "(&(objectCategory=person)(objectClass=user)(sAMAccountName={{username}}))"
  
  # Attributs utilisateur
  attributes:
    id: "objectGUID"
    displayName: "displayName"
    email: "mail" 
    avatar: "thumbnailPhoto"
    
  # Options de sécurité
  tls:
    enabled: false  # true pour LDAPS
    rejectUnauthorized: true
    
  # Groupes 
  groupSearchBase: "DC=monentreprise,DC=local"
  groupSearchFilter: "(&(objectClass=group)(member={{dn}}))"
  groupAttribute: "cn"
Conseils Active Directory
  • sAMAccountName : Nom de connexion Windows classique
  • userPrincipalName : Format email (user@domain.com)
  • objectGUID : Identifiant unique immuable
  • LDAPS : Fortement recommandé en production
Configuration OpenLDAP
Configuration OpenLDAP typique
# Configuration OpenLDAP dans WikiJS
ldap:
  enabled: true
  
  # Serveur OpenLDAP
  url: "ldap://ldap.monentreprise.com:389"
  
  # Authentification simple
  bindDN: "cn=wikijs,ou=services,dc=monentreprise,dc=com"
  bindCredentials: "secretPassword"
  
  # Recherche utilisateurs
  searchBase: "ou=users,dc=monentreprise,dc=com"
  searchFilter: "(&(objectClass=inetOrgPerson)(uid={{username}}))"
  
  # Attributs OpenLDAP standards
  attributes:
    id: "entryUUID"
    displayName: "cn"
    email: "mail"
    avatar: "jpegPhoto"
    
  # Groupes POSIX
  groupSearchBase: "ou=groups,dc=monentreprise,dc=com"
  groupSearchFilter: "(&(objectClass=posixGroup)(memberUid={{username}}))"
  groupAttribute: "cn"
  
  # Sécurité
  tls:
    enabled: true
    rejectUnauthorized: true
Test de connexion LDAP
# Test manuel de connexion LDAP
ldapsearch -H ldap://votre-serveur:389 \
           -D "cn=service-account,dc=example,dc=com" \
           -W \
           -b "dc=example,dc=com" \
           "(sAMAccountName=testuser)"

# Test avec LDAPS
ldapsearch -H ldaps://votre-serveur:636 \
           -D "cn=service-account,dc=example,dc=com" \
           -W \
           -b "dc=example,dc=com" \
           "(uid=testuser)"

Configuration SAML 2.0

SAML 2.0 - Security Assertion Markup Language

SAML est un standard d'échange d'informations d'authentification et d'autorisation. Compatible avec Okta, Auth0, ADFS, et autres fournisseurs d'identité.

1
Configurer WikiJS comme Service Provider (SP)
Configuration SAML dans WikiJS
# Configuration SAML 2.0 dans WikiJS
saml:
  enabled: true
  
  # Métadonnées du Service Provider (WikiJS)
  entryPoint: "https://votre-idp.com/saml/sso"
  issuer: "https://wiki.mondomaine.com"
  callbackUrl: "https://wiki.mondomaine.com/login/saml/callback"
  
  # Certificat du fournisseur d'identité
  cert: |
    -----BEGIN CERTIFICATE-----
    MIIDXTCCAkWgAwIBAgIJAKoK/heBjcOuMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
    ... certificat complet ici ...
    -----END CERTIFICATE-----
    
  # Options de mapping
  attributes:
    id: "NameID"
    displayName: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
    email: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
    
  # Options de sécurité
  wantAssertionsSigned: true
  wantAuthnResponseSigned: true
  signatureAlgorithm: "sha256"
2
Configurer le fournisseur d'identité
Okta
Auth0
ADFS
Configuration Okta SAML
Étapes dans Okta Admin Console
# 1. Applications → Create App Integration
# 2. Sign-in method: SAML 2.0
# 3. General Settings:
#    - App name: WikiJS
# 4. SAML Settings:
#    - Single sign on URL: https://wiki.mondomaine.com/login/saml/callback
#    - Audience URI: https://wiki.mondomaine.com
#    - Name ID format: EmailAddress
# 5. Attribute Statements:
#    - Name: displayName, Value: user.displayName
#    - Name: email, Value: user.email
# 6. Finish et assigner aux utilisateurs
Configuration Auth0 SAML
Auth0 Dashboard
# 1. Applications → Create Application
# 2. Type: Regular Web Applications
# 3. Settings → Advanced Settings → Endpoints
# 4. SAML Protocol URLs:
#    - SAML 2.0 Endpoint: noter l'URL
# 5. Addons → SAML2 WEB APP
#    - Application Callback URL: https://wiki.mondomaine.com/login/saml/callback
#    - Settings JSON:
{
  "audience": "https://wiki.mondomaine.com",
  "mappings": {
    "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
    "name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
  }
}
Configuration ADFS SAML
ADFS Management Console
# 1. Add Relying Party Trust
# 2. Select Data Source: Enter data about the relying party manually
# 3. Display Name: WikiJS
# 4. Configure URL: Enable SAML 2.0 WebSSO protocol
#    - URL: https://wiki.mondomaine.com/login/saml/callback
# 5. Relying Party Trust Identifier: https://wiki.mondomaine.com
# 6. Access Control Policy: Permit everyone (ou selon vos règles)
# 7. Finish
# 8. Edit Claim Rules:
#    - Send LDAP Attributes as Claims:
#      - Display-Name → Name
#      - E-Mail-Addresses → E-Mail Address

Configuration OpenID Connect (OIDC)

OpenID Connect - Standard moderne

OIDC est une couche d'identité au-dessus d'OAuth 2.0. Standard moderne pour l'authentification, supporté par de nombreux fournisseurs.

Configuration OpenID Connect générique
# Configuration OIDC générique dans WikiJS
oidc:
  enabled: true
  
  # URLs du fournisseur OIDC
  issuer: "https://accounts.google.com"  # exemple Google
  authorizationURL: "https://accounts.google.com/o/oauth2/v2/auth"
  tokenURL: "https://oauth2.googleapis.com/token"
  userInfoURL: "https://openidconnect.googleapis.com/v1/userinfo"
  
  # Application credentials
  clientId: "votre-client-id"
  clientSecret: "votre-client-secret"
  
  # Scopes demandés
  scope: "openid profile email"
  
  # Configuration utilisateur
  autoRegister: true
  autoAssignGroups: ["users"]
  
  # Mapping des claims
  claims:
    id: "sub"
    displayName: "name"
    email: "email"
    avatar: "picture"
Découverte automatique OIDC

De nombreux fournisseurs OIDC supportent la découverte automatique. WikiJS peut récupérer automatiquement les endpoints à partir de l'URL https://fournisseur.com/.well-known/openid_configuration

Configuration avec découverte automatique
# Configuration OIDC avec découverte automatique
oidc:
  enabled: true
  
  # URL de découverte (la plupart des fournisseurs)
  issuer: "https://login.microsoftonline.com/tenant-id/v2.0"
  # WikiJS récupérera automatiquement les endpoints
  
  clientId: "votre-client-id"
  clientSecret: "votre-client-secret"
  scope: "openid profile email"
  
  # Options avancées
  responseType: "code"
  responseMode: "query"
  
  # Validation du token
  clockTolerance: 60  # secondes
  maxTokenAge: 3600   # secondes

Mapping et gestion des utilisateurs

Concepts de mapping

Le mapping définit comment les informations du fournisseur SSO sont transformées en profil utilisateur WikiJS. Cela inclut les attributs de base et l'assignation automatique aux groupes.

Attributs utilisateur
  • id : Identifiant unique immuable
  • displayName : Nom d'affichage
  • email : Adresse email
  • avatar : Photo de profil
Groupes et rôles
  • autoAssignGroups : Groupes par défaut
  • syncGroups : Synchronisation automatique
  • groupAttribute : Attribut des groupes
  • roleMapping : Mapping des rôles
Configuration avancée de mapping
# Mapping avancé pour OAuth/OIDC
oauth_provider:
  enabled: true
  # ... configuration de base ...
  
  # Enregistrement automatique
  autoRegister: true
  
  # Groupes assignés automatiquement
  autoAssignGroups: 
    - "users"
    - "external-users"
  
  # Synchronisation des groupes depuis le fournisseur
  syncGroups: true
  groupAttribute: "groups"  # ou "roles", "memberOf", etc.
  
  # Mapping conditionnel basé sur les attributs
  conditionalMapping:
    - condition: "email.endsWith('@admin.com')"
      groups: ["administrators"]
    - condition: "department === 'IT'"
      groups: ["it-team"]
    - condition: "country === 'FR'"
      groups: ["france-users"]
  
  # Transformation des attributs
  attributeTransforms:
    displayName: "firstName + ' ' + lastName"
    email: "email.toLowerCase()"
    
  # Règles de validation
  validation:
    requiredFields: ["email", "displayName"]
    emailDomains: ["monentreprise.com", "partenaire.com"]
Mapping LDAP avancé
# Mapping LDAP avec groupes Active Directory
ldap:
  enabled: true
  # ... configuration de connexion ...
  
  # Mapping des attributs utilisateur
  attributes:
    id: "objectGUID"
    displayName: "displayName"
    email: "mail"
    avatar: "thumbnailPhoto"
    
  # Attributs personnalisés
  customAttributes:
    department: "department"
    title: "title"
    phone: "telephoneNumber"
    manager: "manager"
  
  # Configuration des groupes
  groupSearchBase: "DC=monentreprise,DC=local"
  groupSearchFilter: "(&(objectClass=group)(member={{dn}}))"
  groupAttribute: "cn"
  
  # Mapping des groupes AD vers groupes WikiJS
  groupMapping:
    "Domain Admins": ["administrators"]
    "IT Department": ["it-team", "power-users"]
    "All Users": ["users"]
    "Managers": ["managers"]
  
  # Groupes par défaut pour tous les utilisateurs LDAP
  autoAssignGroups: ["ldap-users"]
Bonnes pratiques de mapping
  • ID immutable : Utilisez un identifiant qui ne change jamais
  • Validation email : Assurez-vous que l'email est valide
  • Groupes par défaut : Définissez des groupes de base pour tous
  • Test mapping : Testez avec plusieurs profils utilisateur

Tests et validation SSO

Tests de validation SSO
Activation des logs de debug SSO
# Dans config.yml de WikiJS
logLevel: debug

# Ou via variables d'environnement
DEBUG=wiki:auth,wiki:passport

# Logs spécifiques aux stratégies
DEBUG=passport:*
Procédure de test complète
  1. Test admin : Vérifier la configuration dans l'admin
  2. Navigation privée : Tester en mode incognito
  3. Plusieurs utilisateurs : Tester différents profils
  4. Vérifier les logs : Analyser les messages d'erreur
  5. Test de déconnexion : Vérifier la déconnexion complète
  6. Re-connexion : Tester la reconnexion automatique
Commandes de diagnostic SSO
# Vérifier la connectivité réseau
ping votre-serveur-sso.com
nslookup votre-serveur-sso.com

# Test de certificat SSL
openssl s_client -connect votre-serveur:443 -verify_return_error

# Pour LDAP/AD
ldapsearch -H ldap://serveur:389 -x -D "cn=test,dc=example,dc=com" -W

# Analyser les logs WikiJS en temps réel
tail -f logs/wiki.log | grep -i auth

Guide de dépannage SSO

Solutions
  1. Vérifier l'URL de callback : Doit être exacte dans le fournisseur SSO
  2. HTTP vs HTTPS : Assurer la cohérence des protocoles
  3. Port inclus : Vérifier si le port doit être spécifié
  4. Trailing slash : Avec ou sans slash final selon le fournisseur
URLs de callback courantes
# OAuth providers
https://wiki.mondomaine.com/login/google/callback
https://wiki.mondomaine.com/login/github/callback
https://wiki.mondomaine.com/login/microsoft/callback

# SAML
https://wiki.mondomaine.com/login/saml/callback

# OpenID Connect
https://wiki.mondomaine.com/login/oidc/callback

Diagnostics réseau
  1. Connectivité : Ping et telnet vers le serveur
  2. Port correct : 389 (LDAP), 636 (LDAPS), 3268 (Global Catalog)
  3. Firewall : Vérifier les règles de pare-feu
  4. DNS : Résolution du nom de serveur
Tests de connectivité
# Test de connectivité basique
ping dc.monentreprise.local

# Test du port LDAP
telnet dc.monentreprise.local 389

# Test LDAPS
openssl s_client -connect dc.monentreprise.local:636

# Test de recherche LDAP manuelle
ldapsearch -H ldap://dc.monentreprise.local:389 \
           -x -D "cn=test,dc=example,dc=com" -W \
           -b "dc=example,dc=com" "(sAMAccountName=testuser)"

Problèmes de mapping
  1. Groupes par défaut : Vérifier autoAssignGroups
  2. Synchronisation : Activer syncGroups si nécessaire
  3. Mapping manuel : Assigner manuellement dans l'admin
  4. Attributs manquants : Vérifier les claims/attributs retournés
Configuration minimale requise
# Assigner au minimum le groupe "users"
autoAssignGroups: ["users"]

# Ou créer un groupe spécifique pour les utilisateurs SSO
autoAssignGroups: ["sso-users"]

Problèmes SAML
  1. Certificat : Vérifier le certificat du fournisseur
  2. Horloge : Synchroniser l'heure entre serveurs
  3. Audience : Vérifier l'URL audience/issuer
  4. Signature : Paramètres de signature corrects
Validation des paramètres SAML
  • Certificat X.509 valide et non expiré
  • URL Issuer identique côté IdP et SP
  • URL de callback exacte
  • Algorithmes de signature compatibles