Lucca
Ce guide vous explique comment configurer l'authentification unique (SSO) entre SmartLink et Lucca en utilisant SAML 2.0 ou OpenID Connect.
Prérequis
- Compte Lucca avec module SSO activé
- Accès administrateur à Lucca
- Application configurée dans SmartLink avec SAML2 ou OpenID Connect
- Domaine email vérifié
Note : Le SSO nécessite l'activation du module SSO dans votre contrat Lucca.
Configuration avec OpenID Connect (Recommandé)
Configuration dans SmartLink
1. Créer l'application
- Connectez-vous à SmartLink en tant qu'administrateur
- Allez dans Applications → Ajouter
- Créez une nouvelle application :
- Nom : Lucca
- URL :
https://[votre-instance].ilucca.net - Description : Suite SIRH complète (Figgo, Pagga, Timmi, etc.)
- Icône : Choisissez l'icône Lucca
2. Configurer OpenID Connect
- Dans l'onglet Authentification
- Sélectionnez OpenID Connect
- Notez les informations :
- Client ID :
lucca-xxxxxx - Client Secret :
secret-xxxxxx - App ID :
[appid](identifiant unique généré automatiquement)
- Client ID :
3. URLs de redirection
Ajoutez dans URLs de redirection autorisées :
https://[votre-instance].ilucca.net/identity/oidc/callback
https://[votre-instance].ilucca.net/auth/oidc/callback
Configuration dans Lucca
1. Accéder aux paramètres SSO
- Connectez-vous à Lucca en tant qu'administrateur
- Allez dans Configuration → Paramètres → Authentification
- Cliquez sur Single Sign-On (SSO)
- Sélectionnez OpenID Connect
2. Configuration du fournisseur d'identité
Configurez les paramètres suivants :
- Discovery URL :
https://[votre-smartlink].link.vaultys.org/api/oidc/[appid]/.well-known/openid-configuration - Client ID :
lucca-xxxxxx(depuis SmartLink) - Client Secret :
secret-xxxxxx(depuis SmartLink) - Scopes :
openid profile email groups
3. Mapping des attributs
| Attribut Lucca | Claim OpenID | Obligatoire |
|---|---|---|
email | ✅ | |
| Prénom | given_name | ✅ |
| Nom | family_name | ✅ |
| Matricule | employee_number | ❌ |
| Service | department | ❌ |
| Manager | manager_email | ❌ |
Configuration avec SAML 2.0
Configuration dans SmartLink
1. Configurer SAML2
- Dans l'application Lucca
- Onglet Authentification → SAML2
- Configurez :
- Entity ID :
https://[votre-smartlink].link.vaultys.org/[appid] - ACS URL :
https://[votre-instance].ilucca.net/identity/saml2/acs - Format NameID :
emailAddress
- Entity ID :
2. Récupérer les métadonnées
Notez les URLs :
- Métadonnées IdP :
https://[votre-smartlink].link.vaultys.org/api/saml2/[appid]/metadata - SSO URL :
https://[votre-smartlink].link.vaultys.org/api/saml2/sso/[appid] - SLO URL :
https://[votre-smartlink].link.vaultys.org/api/saml2/slo/[appid] - Entity ID :
https://[votre-smartlink].link.vaultys.org/[appid]
Configuration dans Lucca
- Dans Configuration → Authentification → SAML 2.0
- Importez les métadonnées ou configurez manuellement :
- IdP Entity ID :
[appid] - SSO URL :
https://[votre-smartlink].link.vaultys.org/api/saml2/sso/[appid] - Certificat X.509 : Importez depuis SmartLink
- IdP Entity ID :
Configuration des modules Lucca
Figgo (Gestion des congés)
{
"figgo_settings": {
"auto_provision": true,
"sync_managers": true,
"default_leave_policy": "standard",
"sso_groups_mapping": {
"smartlink-managers": "validateur_n1",
"smartlink-hr": "administrateur_rh",
"smartlink-employees": "collaborateur"
}
}
}
Pagga (Gestion de paie)
{
"pagga_settings": {
"restricted_access": true,
"allowed_groups": ["smartlink-hr", "smartlink-payroll"],
"permissions": {
"smartlink-payroll": ["edit_bulletins", "export_dsn"],
"smartlink-hr": ["view_bulletins", "manage_employees"],
"smartlink-managers": ["view_team_bulletins"]
}
}
}
Timmi (Gestion des temps)
timmi_configuration:
projects:
sync_with_sso_groups: true
default_access: "member"
time_tracking:
mandatory: true
validation_workflow: "manager"
permissions:
smartlink-project-managers:
- create_projects
- manage_budgets
- view_all_timesheets
smartlink-employees:
- submit_timesheet
- view_own_timesheet
Poplee Core RH
{
"poplee_settings": {
"employee_sync": {
"source": "sso",
"update_on_login": true,
"fields_mapping": {
"department": "{{department}}",
"job_title": "{{title}}",
"manager": "{{manager_email}}",
"location": "{{office_location}}"
}
}
}
}
Synchronisation des données
API Lucca avec SSO
const axios = require('axios');
class LuccaAPIClient {
constructor(apiKey, domain) {
this.apiKey = apiKey;
this.baseUrl = `https://${domain}.ilucca.net/api/v3`;
}
async syncUserFromSSO(ssoUserData) {
// Rechercher l'utilisateur par email
const user = await this.getUserByEmail(ssoUserData.email);
if (!user) {
// Créer l'utilisateur
return await this.createUser({
mail: ssoUserData.email,
firstName: ssoUserData.given_name,
lastName: ssoUserData.family_name,
department: ssoUserData.department,
authenticationMode: 'sso'
});
} else {
// Mettre à jour l'utilisateur
return await this.updateUser(user.id, {
department: ssoUserData.department,
jobTitle: ssoUserData.title
});
}
}
async getUserByEmail(email) {
const response = await axios.get(`${this.baseUrl}/users`, {
headers: { 'Authorization': `lucca application=${this.apiKey}` },
params: { mail: email }
});
return response.data.items[0];
}
}
Webhooks Lucca
// Endpoint pour recevoir les webhooks Lucca
app.post('/webhook/lucca', async (req, res) => {
const { event, data } = req.body;
switch(event) {
case 'user.created':
// Synchroniser avec SmartLink si nécessaire
await syncNewUserToSmartLink(data);
break;
case 'leave.approved':
// Notifier via SmartLink
await sendNotification(data.userId, 'Votre demande de congé a été approuvée');
break;
case 'timesheet.submitted':
// Déclencher workflow de validation
await triggerValidationWorkflow(data);
break;
}
res.status(200).json({ success: true });
});
Test de la configuration
1. Test de connexion
- Déconnectez-vous de Lucca
- Allez sur
https://[votre-instance].ilucca.net - Cliquez sur Se connecter avec SSO
- Entrez votre email professionnel
- Authentifiez-vous via SmartLink
- Vérifiez l'accès aux différents modules Lucca
2. Test des permissions
# Test API avec authentification SSO
curl -X GET "https://[votre-instance].ilucca.net/api/v3/users/me" \
-H "Authorization: lucca application=YOUR_API_KEY"
3. Test mobile
Les applications Lucca Mobile supportent le SSO :
- Figgo Mobile (iOS/Android)
- Timmi Mobile
- Lucca Mobile (app unifiée)
Dépannage
Erreur "Authentification SSO échouée"
Problème : L'authentification SSO ne fonctionne pas
Solution :
- Vérifiez que l'Entity ID est
[appid]pour SAML - Pour OIDC, vérifiez la Discovery URL
- Assurez-vous que l'email existe dans Lucca
- Consultez les logs : Configuration → Logs d'authentification
Les groupes ne sont pas synchronisés
Problème : Les rôles Lucca ne correspondent pas aux groupes SmartLink
Solution :
// Configuration correcte des claims pour les groupes
{
"groups_claim": "groups",
"groups_mapping": {
"smartlink-rh": "ADMIN_RH",
"smartlink-managers": "MANAGER",
"smartlink-employees": "COLLABORATEUR"
}
}
Erreur "Utilisateur non autorisé pour ce module"
Problème : L'utilisateur SSO n'a pas accès à certains modules
Solution :
- Vérifiez les licences attribuées dans Lucca
- Contrôlez les permissions du rôle de l'utilisateur
- Assurez-vous que le module est activé pour l'utilisateur
Problème de synchronisation des managers
Problème : La hiérarchie n'est pas correctement synchronisée
Solution :
<!-- Attribut SAML pour le manager -->
<saml:Attribute Name="manager_email">
<saml:AttributeValue>manager@entreprise.fr</saml:AttributeValue>
</saml:Attribute>
Sécurité
Configuration recommandée
{
"security_settings": {
"enforce_sso": true,
"session_timeout": "8h",
"ip_filtering": {
"enabled": true,
"allowed_ips": ["10.0.0.0/8", "192.168.0.0/16"]
},
"api_security": {
"token_rotation": "30d",
"rate_limiting": true,
"audit_api_calls": true
},
"data_protection": {
"encryption_at_rest": true,
"anonymize_exports": true,
"gdpr_compliant": true
}
}
}
Conformité RGPD
Lucca est conforme RGPD avec :
- Hébergement des données en France
- Droit à l'oubli
- Portabilité des données
- Chiffrement des données sensibles
- Audit trail complet
Migration des utilisateurs existants
Script de migration
import csv
import requests
from datetime import datetime
class LuccaSSOMigration:
def __init__(self, api_key, instance):
self.api_key = api_key
self.instance = instance
self.api_url = f"https://{instance}.ilucca.net/api/v3"
def migrate_users_to_sso(self, user_list_file):
"""Migration batch vers SSO"""
results = []
with open(user_list_file, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for user in reader:
try:
# Activer SSO pour l'utilisateur
self.enable_sso_for_user(user['email'])
# Désactiver l'authentification par mot de passe
self.disable_password_auth(user['id'])
# Envoyer email de notification
self.send_migration_email(user['email'])
results.append({
'email': user['email'],
'status': 'success',
'timestamp': datetime.now()
})
except Exception as e:
results.append({
'email': user['email'],
'status': 'failed',
'error': str(e)
})
return results
def enable_sso_for_user(self, email):
# Implémenter l'activation SSO via API Lucca
pass