Aller au contenu principal

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.

1. Créer l'application

  1. Connectez-vous à SmartLink en tant qu'administrateur
  2. Allez dans ApplicationsAjouter
  3. 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

  1. Dans l'onglet Authentification
  2. Sélectionnez SAML2
  3. 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)

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

  1. Connectez-vous à Whaller en tant qu'administrateur
  2. Allez dans AdministrationParamètresAuthentification
  3. 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 WhallerAttribut SAMLObligatoire
Emailemail
PrénomfirstName
NomlastName
Nom d'affichagedisplayName
Servicedepartment
Fonctiontitle
Managermanager
Localisationlocation

4. Configuration des domaines

  1. Dans Domaines autorisés
  2. Ajoutez vos domaines d'entreprise
  3. 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

  1. Déconnectez-vous de Whaller
  2. Allez sur https://[votre-organisation].whaller.com
  3. Cliquez sur Connexion SSO
  4. Entrez votre email d'entreprise
  5. Vous êtes redirigé vers SmartLink
  6. 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 :

  1. Vérifiez que l'Entity ID est bien [appid]
  2. Vérifiez le format du certificat X.509
  3. Assurez-vous que l'URL ACS est : https://[votre-organisation].whaller.com/saml/acs
  4. Consultez les logs : AdministrationLogsSSO

Les utilisateurs ne sont pas créés automatiquement

Problème : Le provisioning automatique ne fonctionne pas

Solution :

  1. Vérifiez que l'auto-provisioning est activé dans Whaller
  2. Assurez-vous que les attributs obligatoires sont présents :
    • email
    • firstName
    • lastName
  3. 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 :

  1. Vérifiez la synchronisation des groupes SAML
  2. Contrôlez les règles d'affectation automatique
  3. Vérifiez les permissions de la sphère
  4. Assurez-vous que l'utilisateur est actif

Erreur de timeout

Problème : La connexion SSO expire trop rapidement

Solution :

  1. Augmentez la durée de validité de l'assertion SAML (5-10 minutes)
  2. Vérifiez la synchronisation d'horloge entre les serveurs
  3. 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

Ressources