Skip to main content

Matrix Synapse Benutzer nach Authentik migrieren

Die Migration von Benutzern von Matrix Synapse nach Authentik kann mit dem folgenden Workflow durchgeführt werden. Hier werden die Daten von einer Postgres Datenbank in eine CSV-Datei exportiert und mit einem Python Script nach Authentik importiert.

Exportieren aller aktiven Benutzer

Mit dem SQL werden alle Benutzer exportiert, die die folgenden Kriterien erfüllen:

  • Benutzer ist aktiv
  • Benutzer besitzt eine E-Mail-Adresse
  • Ist kein Appservice (Bridge Benutzer, wie Whatsapp, Telegram, etc.)
  1. Mit dem folgenden SQL alle Benutzer exportieren
    SELECT DISTINCT u.name AS username,
           ut.address AS email
    FROM users u
    LEFT JOIN user_threepids ut ON u.name = ut.user_id
      AND ut.medium = 'email'
    WHERE deactivated = 0
      AND appservice_id IS NULL
      AND ut.address IS NOT NULL
    ORDER BY u.name;
  2. Diese Liste muss in einer auf dem lokalen Desktop Rechner verfügbaren CSV-Datei gespeichert werden

Setzen der Berechtigungen in Authentik

Damit die Benutzer in Authentik importiert werden können, muss der Admin-Benutzer die korrekte Berechtigung erhalten.

  1. Mit dem Admin-Benutzer in Authentik anmelden
  2. Unter Verzeichnis > Benutzer den Admin-Benutzer editieren
  3. Den Tab "Permissions" auswählen und dort auf "Assign permission" anklicken

    image.png

  4. Im neuen Dialog auf das + Symbol neben "Permission to add" klicken
  5. Nun nach "user" suchen und den Eintrag "Can add User" anhaken

    image.png

  6. Auf Hinzufügen und anschließend auf Assign klicken

    image.png


Erzeugen eines Auth Tokens

Im nächsten Schritt benötigen wir ein Auth Token, damit sich das Python Script mit Authentik authentifizieren und somit die API bedienen kann.

  1. In der Admin-Oberfläche von Authentik auf Verzeichnis > Tokens und App Passwörter klicken
  2. Auf Erstellen klicken
  3. In dem Dialog folgende Informationen eingeben / auswählen
    Kennung, Benutzer auswählen (Admin Benutzer), Läuft ab am

    image.png

  4. Nun auf Erstellen klicken und den Token über das Symbol in der entsprechenden neuen Zeile kopieren

Importieren der CSV-Benutzerliste

Das folgende Script liest die CSV-Datei aus und führt für jeden gefundenen Benutzer einen API-Call zum Hinzufügen aus.

Wichtig!

Den Benutzern wird ein zufällig generiertes Passwort zugewiesen. Da sie dieses nicht können, müssen sie bei der ersten Anmeldung an Authentik ein neues Passwort vergeben.

Script

Vor der Ausführung unbedingt die vier Werte konfigurieren.

DOMAIN        = "example.com"             # Replace with your domain
AUTHENTIK_URL = f"https://auth.{DOMAIN}"  # Replace with your authentik URL
API_TOKEN     = ""                        # Replace with your API token
CSV_FILE_PATH = "/full/path/to/csv/file"  # Update with your actual CSV file path

Hier das vollständig Script:

import csv
import requests
import random
import string

# --- Configuration for authentik API ---
DOMAIN        = "example.com"             # Replace with your domain
AUTHENTIK_URL = f"https://auth.{DOMAIN}"  # Replace with your authentik URL
API_TOKEN     = ""                        # Replace with your API token
CSV_FILE_PATH = "/full/path/to/csv/file"  # Update with your actual CSV file path

headers = {
    "Authorization": f"Bearer {API_TOKEN}",
    'Accept': 'application/json',
    "Content-Type": "application/json",
}

# A helper function to generate a temporary password
def generate_temp_password(length=12):
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))

with open(CSV_FILE_PATH, newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        # Assuming the CSV has columns 'username' and 'email'
        username = row.get("username").replace('@', '').replace(f":{DOMAIN}", '')
        email = row.get("email")
        
        temp_password = generate_temp_password()

        # Build the user payload for authentik
        user_data = {
            "username": username,
            "name": username,
            "email": email,
            "password": temp_password,
            "is_active": True,
            "groups": [],
            "attributes": {},
            "path": "string",
            "type": "internal",
        }
        
        # Adjust the API endpoint URL according to your authentik version and configuration
        url = f"{AUTHENTIK_URL}/api/v3/core/users/"
        
        response = requests.post(url, json=user_data, headers=headers)
        if response.status_code in (200, 201):
            print(f"Created user {username} in authentik.")
        else:
            print(f"Failed to create user {username}: {response.status_code} - {response.text}")