API wirft 404-Fehler

Hallo Discourse Community,

Ich habe derzeit Probleme mit den Discourse API-Endpunkten, insbesondere im Zusammenhang mit der Suspendierung von Benutzern, und würde mich sehr über jede Hilfe oder Anleitung freuen, die Sie anbieten können.

Zusammenfassung der Probleme

  1. 404 Nicht gefunden:

    • Wenn ich den Endpunkt /admin/users/15/suspend.json verwende, erhalte ich durchweg die Fehlermeldung “Seite nicht gefunden”, obwohl der Benutzer existiert.
    • Ich habe auch den alternativen Endpunkt /admin/u/15/suspend.json ausprobiert, was zum gleichen Problem führt.
  2. Unerwartete HTML-Antwort:

    • Anstatt die erwartete JSON-Antwort zurückzugeben, gibt die API eine HTML-Seite mit der Meldung zurück: “Ups! Diese Seite existiert nicht oder ist privat.”
    • Dies geschieht unabhängig davon, ob ich curl oder PowerShell für die Anfrage verwende.
  3. API-Schlüssel und Berechtigungen:

    • Der verwendete API-Schlüssel hat vollen Admin-Zugriff, dennoch geben die Anfragen weiterhin einen 404-Fehler zurück.
    • Ich habe auch getestet, indem ich granulare Schlüssel (beschränkt auf Suspendierungsaktionen) und einen schreibgeschützten Schlüssel verwendet habe, aber das Problem bleibt bestehen.
    • Interessanterweise funktioniert der Endpunkt einwandfrei, wenn er über einen Browser aufgerufen wird, schlägt aber bei API-Anfragen mit dem Schlüssel fehl.

Beispielanfragen

curl-Beispiel

curl -X PUT "https://your-discourse-domain.com/admin/users/15/suspend.json" \
-H "Api-Key: [REDACTED_API_KEY]" \
-H "Api-Username: system" \
-H "Content-Type: application/json" \
-d '{"suspend_until": "2024-12-31", "reason": "Verstoß gegen Community-Richtlinien"}'

PowerShell-Beispiel

# PowerShell-Skript zum Suspendieren eines Benutzers in Discourse

$baseUrl = "https://your-discourse-domain.com"
$userId = 15
$apiKey = "[REDACTED_API_KEY]"
$apiUsername = "system"
$suspendUntil = "2024-12-31"
$reason = "Verstoß gegen Community-Richtlinien"

$headers = @{
    "Api-Key" = $apiKey
    "Api-Username" = $apiUsername
    "Content-Type" = "application/json"
}

$body = @{
    suspend_until = $suspendUntil
    reason = $reason
} | ConvertTo-Json

$endpoint = "$baseUrl/admin/users/$userId/suspend.json"

try {
    $response = Invoke-RestMethod -Uri $endpoint -Method Put -Headers $headers -Body $body -ErrorAction Stop
    Write-Host "Benutzer erfolgreich suspendiert!" -ForegroundColor Green
} catch {
    Write-Host "Fehler beim Suspendieren des Benutzers:" -ForegroundColor Red
    Write-Host $_.Exception.Message
}

Zusätzliche Details

  • Discourse-Version: 3.4.0.beta3
  • Durchgeführte Fehlerbehebungsschritte:
    Ich habe versucht, die Anfrage-Header anzupassen, einschließlich User-Agent und Referer, aber ohne Erfolg.

Jede Einsicht oder jeder Vorschlag zur Lösung dieser Probleme wäre sehr willkommen. Vielen Dank im Voraus für Ihre Zeit und Unterstützung!

Mit freundlichen Grüßen,
Ross

Ihr Beispiel funktioniert wie erwartet, abgesehen von den erwarteten Parametern auf unserer Testseite:

○ → curl -i -X PUT "https://try.discourse.org/admin/users/41/suspend.json" \
  -H "Api-Key: swordfish" \
  -H "Api-Username: michael" \
  -H "Content-Type: application/json" \
  -d '{"suspend_until": "2024-12-31", "reason": "Violation of community guidelines"}'

HTTP/2 200
server: nginx
date: Mon, 11 Nov 2024 19:27:44 GMT
content-type: application/json; charset=utf-8
vary: Accept-Encoding
x-frame-options: SAMEORIGIN
x-xss-protection: 0
x-content-type-options: nosniff
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-username: michael
x-discourse-route: users/suspend
cache-control: no-cache, no-store
x-request-id: fe9c5ddc-b11a-45ba-ab41-9403eb53f255
cdck-proxy-id: app-router-tiehunter03.sea1
strict-transport-security: max-age=31536000
cdck-proxy-id: app-balancer-tieinterceptor1b.sea1

{
  "suspension": {
    "suspend_reason": "Violation of community guidelines",
    "full_suspend_reason": "Violation of community guidelines",
    "suspended_till": "2024-12-31T00:00:00.000Z",
    "suspended_at": "2024-11-11T19:27:44.927Z",
    "suspended_by": {
      "id": 85,
      "username": "michael",
      "name": "Michael Brown",
      "avatar_template": "/user_avatar/try.discourse.org/michael/{size}/639_2.png"
    }
  }
}
  • API-Schlüssel validieren
    zeigt Discourse eine gültige Benutzerauthentifizierung (x-discourse-username) an, wenn eine einfache GET-Anfrage mit diesem Schlüssel gestellt wird?
  • Benutzer-ID validieren
    existiert er wirklich, oder? Er gibt 404 zurück, wenn er nicht existiert.
  • Sind Sie hinter Cloudflare?
    Dies kann Parameter durcheinander bringen.
2 „Gefällt mir“
  1. API-Schlüsselvalidierung
    Der API-Schlüssel wurde mit dem folgenden Befehl als gültig bestätigt:
curl -X GET "https://redactedurl.com/admin/users/list/active.json" -H "Api-Key: LIVEPRODKEYHERE" -H "Api-Username: system"

Die Antwort (mit vertraulichen Daten zur Vertraulichkeit geschwärzt) lautet wie folgt:

[
  {
    "id": 1,
    "username": "User1",
    "name": "Redacted",
    "avatar_template": "/user_avatar/yourforum.com/user1/{size}/avatar.png",
    "active": true,
    "admin": true,
    "moderator": true,
    "trust_level": 4,
    "title": "Recognized Member",
    "days_visited": 6,
    "post_count": 3
  },
  {
    "id": 19,
    "username": "User2",
    "name": "Redacted",
    "avatar_template": "/letter_avatar_proxy/v4/letter/j/{size}.png",
    "active": true,
    "admin": false,
    "moderator": false,
    "trust_level": 1,
    "title": "Member (Unverified)"
  },
  {
    "id": 3,
    "username": "User3",
    "name": "Redacted",
    "avatar_template": "/user_avatar/yourforum.com/user3/{size}/avatar.png",
    "active": true,
    "admin": true,
    "moderator": true,
    "trust_level": 4,
    "title": "Community Founder"
  },
  {
    "id": -1,
    "username": "system",
    "name": "system",
    "avatar_template": "/user_avatar/yourforum.com/system/{size}/avatar.png",
    "active": true,
    "admin": true,
    "moderator": true,
    "trust_level": 4,
    "title": "Bot"
  }
]
  1. Bestätigung der Benutzerexistenz
    Der Testbenutzer (ID: 15) wurde als existierend verifiziert, wie die Abfrage der Benutzerdaten unter Verwendung von /admin/users/15/suspend.json zeigt:
{
  "id": 15,
  "username": "User15",
  "active": true,
  "admin": false,
  "moderator": false,
  "trust_level": 0,
  "days_visited": 1,
  "post_count": 0,
  "can_send_activation_email": true,
  "can_activate": false,
  "can_deactivate": true,
  "can_grant_admin": true,
  "can_grant_moderation": true,
  "can_impersonate": true,
  "groups": [
    {
      "name": "trust_level_0",
      "bio_excerpt": "New members with limited abilities"
    }
  ]
}

  1. Netzwerkkonfiguration
    Die Seite nutzt kein Cloudflare. Stattdessen läuft sie hinter einem NGINX Reverse Proxy. Die Anwendung lauscht intern auf Port 8080, wobei NGINX die SSL-Terminierung auf Port 443 für den externen Zugriff übernimmt. Die Konfiguration app.yml bindet nicht direkt an Port 443, da SSL und Zertifikatsverwaltung von NGINX gehandhabt werden, um eine sichere Konnektivität und Verfügbarkeit zu gewährleisten.

Hallo,

nur eine kurze Rückmeldung dazu: Ich glaube, der globale Geltungsbereich für API-Schlüssel fehlt der Suspend-Bereich. Ich bin auf den gleichen Fehler gestoßen. Ich musste meinen Schlüssel auf einen granulären Schlüssel mit dem Suspend-Bereich umstellen, um es zum Laufen zu bringen. Ich hatte auch gehofft, dass das Unsuspenden funktioniert, aber das scheint durch die API noch nicht verfügbar zu sein.