Module 3 - Configuration du SSO (Single Sign-On)
Maîtrisez la configuration des systèmes d'authentification unique pour WikiJS
Module 3Introduction 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
Vérification de l'identité de l'utilisateur par un service externe. L'utilisateur s'authentifie une seule fois.
Définition des permissions et rôles de l'utilisateur authentifié dans WikiJS.
Flux SSO typique
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 permet à WikiJS d'authentifier les utilisateurs via Google, GitHub, Facebook, etc. sans avoir accès à leurs mots de passe.
Configuration Google OAuth
# 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
# 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. 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
Intégration avec Azure AD pour les environnements d'entreprise utilisant Microsoft 365, Office 365 ou Azure AD.
# 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
# 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"
# 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
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é
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 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 est un standard d'échange d'informations d'authentification et d'autorisation. Compatible avec Okta, Auth0, ADFS, et autres fournisseurs d'identité.
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"
Configuration Okta SAML
# 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
# 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
# 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)
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 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.
- id : Identifiant unique immuable
- displayName : Nom d'affichage
- email : Adresse email
- avatar : Photo de profil
- 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 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
# 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
- Test admin : Vérifier la configuration dans l'admin
- Navigation privée : Tester en mode incognito
- Plusieurs utilisateurs : Tester différents profils
- Vérifier les logs : Analyser les messages d'erreur
- Test de déconnexion : Vérifier la déconnexion complète
- Re-connexion : Tester la reconnexion automatique
# 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
- Vérifier l'URL de callback : Doit être exacte dans le fournisseur SSO
- HTTP vs HTTPS : Assurer la cohérence des protocoles
- Port inclus : Vérifier si le port doit être spécifié
- Trailing slash : Avec ou sans slash final selon le fournisseur
# 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
- Connectivité : Ping et telnet vers le serveur
- Port correct : 389 (LDAP), 636 (LDAPS), 3268 (Global Catalog)
- Firewall : Vérifier les règles de pare-feu
- DNS : Résolution du nom de serveur
# 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
- Groupes par défaut : Vérifier autoAssignGroups
- Synchronisation : Activer syncGroups si nécessaire
- Mapping manuel : Assigner manuellement dans l'admin
- 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
- Certificat : Vérifier le certificat du fournisseur
- Horloge : Synchroniser l'heure entre serveurs
- Audience : Vérifier l'URL audience/issuer
- 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