Whaller
Ce guide vous explique comment configurer l'authentification unique (SSO) entre SmartLink et Whaller en utilisant SAML 2.0.
Prérequis
- Abonnement Whaller Business ou Enterprise
- Accès administrateur à Whaller
- Domaine email vérifié dans Whaller
- Application configurée dans SmartLink avec SAML2
Note : Le SSO est disponible uniquement avec les plans Business et Enterprise de Whaller.
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 : Whaller
- URL :
https://[votre-organisation].whaller.com - Description : Réseau social d'entreprise sécurisé
- Icône : Choisissez l'icône Whaller
2. Configurer SAML2
- Dans l'onglet Authentification
- Sélectionnez SAML2
- Configurez les paramètres suivants :
- Entity ID :
[appid] - ACS URL :
https://[votre-organisation].whaller.com/saml/acs - Format NameID :
emailAddress - App ID :
[appid](identifiant unique généré automatiquement)
- Entity ID :
3. Récupérer les métadonnées
Notez les URLs suivantes :
- Métadonnées IdP :
https://[votre-smartlink].link.vaultys.org/api/saml2/[appid]/metadata - SSO URL :
https://[votre-smartlink].link.vaultys.org/api/saml2/[appid]/sso - SLO URL :
https://[votre-smartlink].link.vaultys.org/api/saml2/[appid]/slo - Entity ID :
[appid] - Certificat X.509 : Téléchargez depuis SmartLink
Configuration dans Whaller
1. Accéder aux paramètres SSO
- Connectez-vous à Whaller en tant qu'administrateur
- Allez dans Administration → Paramètres → Authentification
- Dans la section SSO SAML, cliquez sur Configurer
2. Configuration du fournisseur d'identité
Configurez les paramètres SAML :
- IdP Entity ID :
[appid] - SSO URL :
https://[votre-smartlink].link.vaultys.org/api/saml2/[appid]/sso - SLO URL :
https://[votre-smartlink].link.vaultys.org/api/saml2/[appid]/slo - Certificat X.509 : Collez le certificat depuis SmartLink
- Binding :
HTTP-POST
3. Configuration des attributs
| Attribut Whaller | Attribut SAML | Obligatoire |
|---|---|---|
email | ✅ | |
| Prénom | firstName | ✅ |
| Nom | lastName | ✅ |
| Nom d'affichage | displayName | ❌ |
| Service | department | ❌ |
| Fonction | title | ❌ |
| Manager | manager | ❌ |
| Localisation | location | ❌ |
4. Configuration des domaines
- Dans Domaines autorisés
- Ajoutez vos domaines d'entreprise
- Activez Forcer le SSO pour ces domaines
Configuration des sphères et permissions
Types de sphères
spheres:
- type: "corporate"
name: "Entreprise"
visibility: "public"
auto_add_users: true
moderation: true
features:
- news
- events
- documents
- messages
- type: "project"
name: "Projets"
visibility: "private"
invitation_only: true
features:
- tasks
- calendar
- documents
- chat
- type: "community"
name: "Communautés"
visibility: "discoverable"
join_approval: true
features:
- discussions
- polls
- ideas
- wiki
Rôles et permissions
{
"roles": {
"admin": {
"permissions": [
"manage_spheres",
"manage_users",
"manage_settings",
"view_analytics",
"export_data"
],
"saml_groups": ["smartlink-whaller-admins"]
},
"manager": {
"permissions": [
"create_spheres",
"moderate_content",
"invite_users",
"manage_sphere_settings"
],
"saml_groups": ["smartlink-managers"]
},
"contributor": {
"permissions": [
"create_content",
"comment",
"share",
"upload_files"
],
"saml_groups": ["smartlink-users"]
},
"reader": {
"permissions": [
"view_content",
"react",
"download_files"
],
"saml_groups": ["smartlink-external", "smartlink-guests"]
}
}
}
Synchronisation des groupes
<!-- Assertion SAML pour les groupes -->
<saml:Attribute Name="groups">
<saml:AttributeValue>smartlink-whaller-admins</saml:AttributeValue>
<saml:AttributeValue>smartlink-department-hr</saml:AttributeValue>
<saml:AttributeValue>smartlink-project-alpha</saml:AttributeValue>
</saml:Attribute>
Fonctionnalités spécifiques
Sécurité et confidentialité
{
"security_features": {
"encryption": {
"at_rest": "AES-256",
"in_transit": "TLS 1.3",
"end_to_end": true
},
"data_sovereignty": {
"hosting": "France",
"no_third_party_access": true,
"gdpr_compliant": true
},
"content_control": {
"watermark": true,
"download_restrictions": true,
"copy_protection": false,
"expiring_content": true
},
"audit": {
"access_logs": true,
"activity_tracking": true,
"export_logs": true
}
}
}
Gestion documentaire
documents:
storage:
quota_per_sphere: "50GB"
quota_per_user: "10GB"
max_file_size: "2GB"
versioning:
enabled: true
max_versions: 10
auto_cleanup: "after_90_days"
collaboration:
co_editing: true
commenting: true
approval_workflow: true
supported_formats:
- documents: [".pdf", ".doc", ".docx", ".odt"]
- spreadsheets: [".xls", ".xlsx", ".ods"]
- presentations: [".ppt", ".pptx", ".odp"]
- images: [".jpg", ".png", ".gif", ".svg"]
- videos: [".mp4", ".avi", ".mov"]
Analytics et reporting
{
"analytics": {
"dashboard": {
"active_users": "daily/weekly/monthly",
"content_creation": "posts/comments/files",
"engagement_rate": "views/interactions",
"sphere_activity": "per_sphere_metrics"
},
"reports": {
"user_activity": {
"frequency": "weekly",
"format": "pdf",
"recipients": ["admins"]
},
"content_moderation": {
"frequency": "daily",
"auto_flag": true,
"ai_assistance": true
},
"compliance": {
"gdpr_report": "monthly",
"audit_trail": "continuous",
"data_retention": "automated"
}
}
}
}
API Whaller
Client API avec authentification SSO
import requests
from datetime import datetime
class WhallerAPI:
def __init__(self, domain, api_key):
self.base_url = f"https://{domain}.whaller.com/api/v2"
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
def get_user_by_sso_email(self, email):
"""Récupère un utilisateur par son email SSO"""
response = requests.get(
f"{self.base_url}/users",
params={'email': email},
headers=self.headers
)
return response.json()
def create_sphere(self, name, sphere_type, members):
"""Crée une nouvelle sphère"""
data = {
'name': name,
'type': sphere_type,
'members': members,
'settings': {
'moderation': True,
'invitation_only': False
}
}
response = requests.post(
f"{self.base_url}/spheres",
json=data,
headers=self.headers
)
return response.json()
def post_message(self, sphere_id, content, attachments=None):
"""Publie un message dans une sphère"""
data = {
'content': content,
'attachments': attachments or [],
'visibility': 'all_members'
}
response = requests.post(
f"{self.base_url}/spheres/{sphere_id}/messages",
json=data,
headers=self.headers
)
return response.json()
Webhooks
// Configuration des webhooks Whaller
app.post('/webhook/whaller', async (req, res) => {
const { event, data } = req.body;
const signature = req.headers['x-whaller-signature'];
// Vérifier la signature
if (!verifyWhallerSignature(signature, req.body)) {
return res.status(401).json({ error: 'Invalid signature' });
}
switch(event) {
case 'user.created':
await handleNewUser(data);
break;
case 'sphere.created':
await syncSphereToExternalTools(data);
break;
case 'message.posted':
await processNewMessage(data);
break;
case 'document.uploaded':
await scanDocument(data);
break;
case 'user.deactivated':
await handleUserDeactivation(data);
break;
}
res.status(200).json({ received: true });
});
Test de la configuration
1. Test de connexion
- Déconnectez-vous de Whaller
- Allez sur
https://[votre-organisation].whaller.com - Cliquez sur Connexion SSO
- Entrez votre email d'entreprise
- Vous êtes redirigé vers SmartLink
- Après authentification, vous accédez à Whaller
2. Vérification des permissions
# Test via l'API
curl -X GET "https://[votre-organisation].whaller.com/api/v2/me" \
-H "Authorization: Bearer YOUR_API_TOKEN"
3. Test mobile
Applications Whaller disponibles :
- Whaller iOS (App Store)
- Whaller Android (Google Play)
- Support complet du SSO sur mobile
Dépannage
Erreur "SAML assertion invalid"
Problème : L'assertion SAML est rejetée
Solution :
- Vérifiez que l'Entity ID est bien
[appid] - Vérifiez le format du certificat X.509
- Assurez-vous que l'URL ACS est :
https://[votre-organisation].whaller.com/saml/acs - Consultez les logs : Administration → Logs → SSO
Les utilisateurs ne sont pas créés automatiquement
Problème : Le provisioning automatique ne fonctionne pas
Solution :
- Vérifiez que l'auto-provisioning est activé dans Whaller
- Assurez-vous que les attributs obligatoires sont présents :
emailfirstNamelastName
- Vérifiez que le domaine email est autorisé
Problème d'accès aux sphères
Problème : L'utilisateur SSO n'a pas accès aux bonnes sphères
Solution :
- Vérifiez la synchronisation des groupes SAML
- Contrôlez les règles d'affectation automatique
- Vérifiez les permissions de la sphère
- Assurez-vous que l'utilisateur est actif
Erreur de timeout
Problème : La connexion SSO expire trop rapidement
Solution :
- Augmentez la durée de validité de l'assertion SAML (5-10 minutes)
- Vérifiez la synchronisation d'horloge entre les serveurs
- Configurez le paramètre ClockSkew dans Whaller
Sécurité
Configuration recommandée
{
"security_settings": {
"enforce_sso": true,
"session_duration": "8h",
"idle_timeout": "30m",
"ip_filtering": {
"enabled": false,
"whitelist": []
},
"password_policy": {
"min_length": 12,
"require_special": true,
"require_numbers": true,
"rotation": "90d"
},
"data_protection": {
"encryption": "AES-256",
"key_management": "HSM",
"backup": "daily",
"retention": "7y"
}
}
}
Conformité
- RGPD : Totalement conforme, hébergement en France
- SecNumCloud : Qualification en cours
- ISO 27001 : Certifié
- HDS : Hébergeur de Données de Santé agréé
Migration des utilisateurs
Script de migration
import csv
from whaller_api import WhallerAPI
import logging
class WhallerSSOMigration:
def __init__(self, domain, api_key):
self.api = WhallerAPI(domain, api_key)
self.logger = logging.getLogger(__name__)
def migrate_users(self, csv_file):
"""Migre les utilisateurs vers SSO"""
results = []
with open(csv_file, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for user in reader:
try:
# Rechercher l'utilisateur
existing_user = self.api.get_user_by_email(user['email'])
if existing_user:
# Activer SSO
self.api.enable_sso(existing_user['id'])
# Mettre à jour les groupes
self.api.update_user_groups(
existing_user['id'],
user['groups'].split(',')
)
results.append({
'email': user['email'],
'status': 'migrated'
})
else:
# Créer avec SSO
self.api.create_sso_user(user)
results.append({
'email': user['email'],
'status': 'created'
})
except Exception as e:
self.logger.error(f"Erreur migration {user['email']}: {e}")
results.append({
'email': user['email'],
'status': 'error',
'message': str(e)
})
return results