Whaller
Dieser Leitfaden erklärt Ihnen, wie Sie die Einzelanmeldung (SSO) zwischen SmartLink und Whaller unter Verwendung von SAML 2.0 konfigurieren.
Voraussetzungen
- Whaller Business- oder Enterprise-Abonnement
- Administrativer Zugriff auf Whaller
- Verifizierte E-Mail-Domain in Whaller
- Anwendung in SmartLink mit SAML2 konfiguriert
Hinweis: SSO ist nur mit den Business- und Enterprise-Plänen von Whaller verfügbar.
Konfiguration in SmartLink
1. Anwendung erstellen
- Melden Sie sich als Administrator bei SmartLink an
- Gehen Sie zu Anwendungen → Hinzufügen
- Erstellen Sie eine neue Anwendung:
- Name: Whaller
- URL:
https://[your-organization].whaller.com - Beschreibung: Sicheres Unternehmens-Soziales Netzwerk
- Symbol: Wählen Sie das Whaller-Symbol aus
2. SAML2 konfigurieren
- Im Tab Authentifizierung
- Wählen Sie SAML2
- Konfigurieren Sie die folgenden Parameter:
- Entitäts-ID:
[appid] - ACS-URL:
https://[your-organization].whaller.com/saml/acs - Format NameID:
emailAddress - App-ID:
[appid](automatisch generierte eindeutige Kennung)
- Entitäts-ID:
3. Metadaten abrufen
Notieren Sie sich die folgenden URLs:
- IdP-Metadaten:
https://[your-smartlink].link.vaultys.org/api/saml2/[appid]/metadata - SSO-URL:
https://[your-smartlink].link.vaultys.org/api/saml2/[appid]/sso - SLO-URL:
https://[your-smartlink].link.vaultys.org/api/saml2/[appid]/slo - Entitäts-ID:
[appid] - X.509-Zertifikat: Herunterladen von SmartLink
Konfiguration in Whaller
1. Zugriff auf SSO-Einstellungen
- Melden Sie sich als Administrator bei Whaller an
- Gehen Sie zu Verwaltung → Einstellungen → Authentifizierung
- Klicken Sie im Abschnitt SSO SAML auf Konfigurieren
2. Konfiguration des Identitätsanbieters
Konfigurieren Sie die SAML-Parameter:
- IdP-Entitäts-ID:
[appid] - SSO-URL:
https://[your-smartlink].link.vaultys.org/api/saml2/[appid]/sso - SLO-URL:
https://[your-smartlink].link.vaultys.org/api/saml2/[appid]/slo - X.509-Zertifikat: Fügen Sie das Zertifikat von SmartLink ein
- Binding:
HTTP-POST
3. Attributkonfiguration
| Whaller-Attribut | SAML-Attribut | Erforderlich |
|---|---|---|
email | ✅ | |
| Vorname | firstName | ✅ |
| Nachname | lastName | ✅ |
| Anzeigename | displayName | ❌ |
| Service | department | ❌ |
| Funktion | title | ❌ |
| Manager | manager | ❌ |
| Standort | location | ❌ |
4. Domainkonfiguration
- In Zugelassene Domains
- Fügen Sie Ihre Unternehmensdomains hinzu
- Aktivieren Sie SSO erzwingen für diese Domains
Konfiguration von Sphären und Berechtigungen
Arten von Sphären
spheres:
- type: "corporate"
name: "Unternehmen"
Sichtbarkeit: "öffentlich"
auto_add_users: true
Moderation: true
Funktionen:
- Neuigkeiten
- Veranstaltungen
- Dokumente
- Nachrichten
- type: "project"
name: "Projekte"
Sichtbarkeit: "privat"
Nur auf Einladung: true
Funktionen:
- Aufgaben
- Kalender
- Dokumente
- Chat
- type: "community"
name: "Gemeinschaften"
Sichtbarkeit: "entdeckbar"
Beitrittszustimmung: true
Funktionen:
- Diskussionen
- Umfragen
- Ideen
- Wiki
Rollen und Berechtigungen
{
"Rollen": {
"admin": {
"Berechtigungen": [
"Sphären verwalten",
"Benutzer verwalten",
"Einstellungen verwalten",
"Analysen anzeigen",
"Daten exportieren"
],
"saml_groups": ["smartlink-whaller-admins"]
},
"Manager": {
"Berechtigungen": [
"Sphären erstellen",
"Inhalte moderieren",
"Benutzer einladen",
"Sphären-Einstellungen verwalten"
],
"saml_groups": ["smartlink-managers"]
},
"Mitwirkender": {
"Berechtigungen": [
"Inhalte erstellen",
"Kommentieren",
"Teilen",
"Dateien hochladen"
],
"saml_groups": ["smartlink-users"]
},
"Leser": {
"Berechtigungen": [
"Inhalte anzeigen",
"Reagieren",
"Dateien herunterladen"
],
"saml_groups": ["smartlink-external", "smartlink-guests"]
}
}
}
Gruppensynchronisierung
<!-- SAML-Assertion für Gruppen -->
<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>
Spezifische Funktionen
Sicherheit und Datenschutz
{
"Sicherheitsfunktionen": {
"Verschlüsselung": {
"Ruhezustand": "AES-256",
"In Transit": "TLS 1.3",
"End-to-End": true
},
"Datensouveränität": {
"Hosting": "Frankreich",
"Kein Zugriff von Drittanbietern": true,
"GDPR-konform": true
},
"Inhaltskontrolle": {
"Wasserzeichen": true,
"Download-Beschränkungen": true,
"Kopierschutz": false,
"Ablaufender Inhalt": true
},
"Audit": {
"Zugriffsprotokolle": true,
"Aktivitätsverfolgung": true,
"Exportprotokolle": true
}
}
}
Dokumentenverwaltung
Dokumente:
Speicher:
Quota pro Sphäre: "50GB"
Quota pro Benutzer: "10GB"
Maximale Dateigröße: "2GB"
Versionierung:
Aktiviert: true
Maximale Versionen: 10
Automatische Bereinigung: "nach_90_Tagen"
Zusammenarbeit:
Co-Bearbeitung: true
Kommentieren: true
Genehmigungsworkflow: true
Unterstützte Formate:
- Dokumente: [".pdf", ".doc", ".docx", ".odt"]
- Tabellenkalkulationen: [".xls", ".xlsx", ".ods"]
- Präsentationen: [".ppt", ".pptx", ".odp"]
- Bilder: [".jpg", ".png", ".gif", ".svg"]
- Videos: [".mp4", ".avi", ".mov"]
Analytik und Berichterstattung
{
"Analytik": {
"Dashboard": {
"Aktive Benutzer": "täglich/wöchentlich/monatlich",
"Inhalts-Erstellung": "Beiträge/Kommentare/Dateien",
"Engagement-Rate": "Ansichten/Interaktionen",
"Sphären-Aktivität": "Pro-Sphäre-Metriken"
},
"Berichte": {
"Benutzeraktivität": {
"Frequenz": "wöchentlich",
"Format": "pdf",
"Empfänger": ["Admins"]
},
"Inhaltsmoderation": {
"Frequenz": "täglich",
"Auto-Flag": true,
"KI-Unterstützung": true
},
"Compliance": {
"GDPR-Bericht": "monatlich",
"Audit-Trail": "kontinuierlich",
"Datenretention": "automatisiert"
}
}
}
}
Whaller API
Client-API mit SSO-Authentifizierung
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):
"""Holt einen Benutzer anhand seiner SSO-E-Mail"""
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):
"""Erstellt eine neue 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):
"""Veröffentlicht eine Nachricht in einer 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
// Konfiguration der Whaller-Webhooks
app.post('/webhook/whaller', async (req, res) => {
const { event, data } = req.body;
const signature = req.headers['x-whaller-signature'];
// Überprüfen der Signatur
if (!verifyWhallerSignature(signature, req.body)) {
return res.status(401).json({ error: 'Ungültige Signatur' });
}
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 });
});
Konfigurationstest
1. Verbindungstest
- Melden Sie sich von Whaller ab
- Gehen Sie zu
https://[your-organization].whaller.com - Klicken Sie auf SSO-Anmeldung
- Geben Sie Ihre Unternehmens-E-Mail ein
- Sie werden zu SmartLink weitergeleitet
- Nach der Authentifizierung gelangen Sie zu Whaller
2. Berechtigungsüberprüfung
# Test über die API
curl -X GET "https://[your-organization].whaller.com/api/v2/me" \
-H "Authorization: Bearer YOUR_API_TOKEN"
3. Mobile Test
Verfügbare Whaller-Apps:
- Whaller iOS (App Store)
- Whaller Android (Google Play)
- Vollständige SSO-Unterstützung auf Mobilgeräten
Fehlerbehebung
Fehler "Ungültige SAML-Aussage"
Problem: Die SAML-Aussage wird abgelehnt
Lösung:
- Stellen Sie sicher, dass die Entitäts-ID korrekt ist
[appid] - Überprüfen Sie das Format des X.509-Zertifikats
- Stellen Sie sicher, dass die ACS-URL lautet:
https://[your-organization].whaller.com/saml/acs - Überprüfen Sie die Protokolle: Verwaltung → Protokolle → SSO
Benutzer werden nicht automatisch erstellt
Problem: Die automatische Bereitstellung funktioniert nicht
Lösung:
- Überprüfen Sie, ob die automatische Bereitstellung in Whaller aktiviert ist
- Stellen Sie sicher, dass die obligatorischen Attribute vorhanden sind:
emailfirstNamelastName
- Überprüfen Sie, ob die E-Mail-Domain autorisiert ist
Zugriffsproblem auf Sphären
Problem: Der SSO-Benutzer hat keinen Zugriff auf die richtigen Sphären
Lösung:
- Überprüfen Sie die Synchronisation der SAML-Gruppen
- Überprüfen Sie die Regeln für die automatische Zuweisung
- Überprüfen Sie die Berechtigungen der Sphäre
- Stellen Sie sicher, dass der Benutzer aktiv ist
Zeitüberschreitungsfehler
Problem: Die SSO-Verbindung läuft zu schnell ab
Lösung:
- Erhöhen Sie die Gültigkeitsdauer der SAML-Aussage (5-10 Minuten)
- Überprüfen Sie die Uhrzeitsynchronisation zwischen den Servern
- Konfigurieren Sie den Parameter ClockSkew in Whaller
Sicherheit
Empfohlene Konfiguration
{
"Sicherheitseinstellungen": {
"SSO erzwingen": true,
"Sitzungsdauer": "8h",
"Inaktivitäts-Timeout": "30m",
"IP-Filterung": {
"aktiviert": false,
"Whitelist": []
},
"Passwortrichtlinie": {
"Mindestlänge": 12,
"Sonderzeichen erforderlich": true,
"Zahlen erforderlich": true,
"Rotation": "90d"
},
"Datenschutz": {
"Verschlüsselung": "AES-256",
"Schlüsselverwaltung": "HSM",
"Backup": "täglich",
"Aufbewahrung": "7y"
}
}
}
Konformität
- DSGVO: Vollständig konform, Hosting in Frankreich
- SecNumCloud: Qualifizierung läuft
- ISO 27001: Zertifiziert
- HDS: Zertifizierter Gesundheitsdaten-Hoster
Migration der Benutzer
Migrations-Skript
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):
"""Migriert Benutzer zu SSO"""
results = []
with open(csv_file, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for user in reader:
try:
# Benutzer suchen
existing_user = self.api.get_user_by_email(user['email'])
if existing_user:
# SSO aktivieren
self.api.enable_sso(existing_user['id'])
# Gruppen aktualisieren
self.api.update_user_groups(
existing_user['id'],
user['groups'].split(',')
)
results.append({
'email': user['email'],
'status': 'migrated'
})
else:
# Mit SSO erstellen
self.api.create_sso_user(user)
results.append({
'email': user['email'],
'status': 'created'
})
except Exception as e:
self.logger.error(f"Fehler bei Migration {user['email']}: {e}")
results.append({
'email': user['email'],
'status': 'error',
'message': str(e)
})
return results