Zum Hauptinhalt springen

Authentifizierung

Misskey verwendet tokenbasierte Authentifizierung. Ein geheimes Token (in der Misskey-API als i bezeichnet) wird in jeden authentifizierten POST-Anfrage-Body eingefuegt. Anders als bei OAuth-basierten APIs gibt es keinen Bearer-Header — das Token wird im JSON-Body uebertragen.

Funktionsweise von TokenProvider

TokenProvider ist ein Typedef fuer einen Callback, der FutureOr<String?> zurueckgibt:

typedef TokenProvider = FutureOr<String?> Function();

Der Callback wird fuer jede authentifizierte Anfrage aufgerufen. Dieses Design ermoeglicht es, Tokens zu aktualisieren oder verzoegert zu laden, ohne den Client neu aufzubauen.

Synchrones Token

final client = MisskeyClient(
config: MisskeyClientConfig(
baseUrl: Uri.parse('https://misskey.example.com'),
),
tokenProvider: () => 'your_token_here',
);

Asynchrones Token (z. B. aus sicherem Speicher geladen)

final client = MisskeyClient(
config: MisskeyClientConfig(
baseUrl: Uri.parse('https://misskey.example.com'),
),
tokenProvider: () async {
return await secureStorage.read(key: 'misskey_token');
},
);

Token-Aktualisierungsmuster

Wenn Ihr Token rotiert werden kann, geben Sie den aktuellen Wert vom Provider zurueck. Der Client ruft den Callback unmittelbar vor dem Senden auf, daher genuegt es, einen aktuellen Wert zurueckzugeben:

String? _cachedToken;

final client = MisskeyClient(
config: MisskeyClientConfig(
baseUrl: Uri.parse('https://misskey.example.com'),
),
tokenProvider: () => _cachedToken,
);

// Aktualisieren Sie den zwischengespeicherten Wert, wenn sich das Token aendert.
void onTokenRefreshed(String newToken) {
_cachedToken = newToken;
}

AuthMode-Enum

Jeder API-Endpunkt deklariert seine Authentifizierungsanforderung mithilfe des AuthMode-Enums:

ModusVerhalten
AuthMode.requiredToken wird eingefuegt; wirft eine Ausnahme, wenn keins angegeben ist (Standard)
AuthMode.optionalToken wird eingefuegt, wenn vorhanden; Anfrage wird auch ohne Token ausgefuehrt
AuthMode.noneToken wird niemals eingefuegt, unabhaengig vom Provider

Dies ist eine interne Bibliotheksangelegenheit. Als Verwender muessen Sie lediglich tokenProvider angeben. Die Bibliothek uebernimmt die Einfuegung automatisch.

Endpunkte mit AuthMode.optional liefern reichhaltigere Antworten bei authentifizierten Anfragen. Beispielsweise enthaelt notes/show die Felder myReaction und isFavorited nur, wenn ein Token vorhanden ist.

Token erhalten: MiAuth-Ablauf

Misskey verwendet kein OAuth 2.0. Der empfohlene Ablauf fuer Drittanbieter-Apps ist MiAuth, ein vereinfachter Browser-Redirect-Ablauf.

1. Eine Sitzungs-UUID generieren
2. Die MiAuth-URL im Browser oeffnen
3. Benutzer erteilt die Berechtigung in der Misskey-Weboberflaeche
4. Weiterleitung erfolgt zur Callback-URL (oder Sie fragen die API ab)
5. Die Sitzungs-UUID gegen ein Token eintauschen

Schritt 1: Autorisierungs-URL erstellen

import 'package:uuid/uuid.dart';

final session = const Uuid().v4();
final baseUrl = 'https://misskey.example.com';

final authUrl = Uri.parse('$baseUrl/miauth/$session').replace(
queryParameters: {
'name': 'My App',
'callback': 'myapp://auth/callback',
'permission': 'read:account,write:notes',
},
);
// authUrl im Browser oder WebView oeffnen

Schritt 2: Sitzung gegen Token eintauschen

Nachdem der Benutzer die Anfrage genehmigt hat, rufen Sie den Check-Endpunkt auf. Dies ist ein einfaches HTTP-GET und verwendet nicht den authentifizierten Pfad der Bibliothek:

final response = await http.get(
Uri.parse('$baseUrl/api/miauth/$session/check'),
);
final json = jsonDecode(response.body) as Map<String, dynamic>;
final token = json['token'] as String?;

Speichern Sie das Token sicher und uebergeben Sie es an tokenProvider.

Nicht authentifizierte Verwendung

Uebergeben Sie keinen tokenProvider, um auf oeffentliche Endpunkte zuzugreifen:

final client = MisskeyClient(
config: MisskeyClientConfig(
baseUrl: Uri.parse('https://misskey.example.com'),
),
);

// Funktioniert ohne Token
final info = await client.meta.fetch();
final notes = await client.notes.timelineLocal(limit: 10);

Der Aufruf eines Endpunkts mit AuthMode.required ohne Provider wirft eine MisskeyUnauthorizedException.