API sta dando errori 404

Ciao Community di Discourse,

Attualmente sto riscontrando problemi con gli endpoint dell’API di Discourse, in particolare per quanto riguarda la sospensione degli utenti, e apprezzerei molto qualsiasi assistenza o guida possiate offrire.

Riepilogo dei problemi

  1. 404 Non trovato:

    • Quando si utilizza l’endpoint:
      /admin/users/15/suspend.json, ricevo costantemente un errore “Pagina non trovata”, anche se l’utente esiste.
    • Ho anche provato l’endpoint alternativo:
      /admin/u/15/suspend.json, che porta allo stesso problema.
  2. Risposta HTML inattesa:

    • Invece di restituire la risposta JSON prevista, l’API restituisce una pagina HTML con il messaggio:
      “Oops! That page doesn’t exist or is private.”
    • Ciò si verifica indipendentemente dal fatto che si utilizzi curl o PowerShell per la richiesta.
  3. Chiave API e autorizzazioni:

    • La chiave API utilizzata ha accesso completo da amministratore, tuttavia le richieste continuano a restituire un errore 404.
    • Ho anche testato utilizzando chiavi granulari (limitate alle azioni di sospensione) e una chiave di sola lettura, ma il problema persiste.
    • Interessante notare che l’endpoint funziona perfettamente quando viene acceduto tramite browser, ma fallisce quando si utilizzano richieste API con la chiave.

Esempi di richieste

Esempio curl

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": "Violation of community guidelines"}'

Esempio PowerShell

# Script PowerShell per sospendere un utente su Discourse

$baseUrl = "https://your-discourse-domain.com"
$userId = 15
$apiKey = "[REDACTED_API_KEY]"
$apiUsername = "system"
$suspendUntil = "2024-12-31"
$reason = "Violation of community guidelines"

$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 "User suspended successfully!" -ForegroundColor Green
} catch {
    Write-Host "Error suspending user:" -ForegroundColor Red
    Write-Host $_.Exception.Message
}

Dettagli aggiuntivi

  • Versione di Discourse: 3.4.0.beta3
  • Passaggi di risoluzione dei problemi eseguiti:
    Ho provato a modificare gli header delle richieste, inclusi User-Agent e Referer, ma senza successo.

Qualsiasi intuizione o suggerimento per aiutare a risolvere questi problemi sarebbe molto apprezzato. Grazie in anticipo per il vostro tempo e supporto!

Cordiali saluti,
Ross

Il tuo esempio funziona così com’è, modulo i parametri previsti sul nostro sito di test:

○ → 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"
    }
  }
}
  • convalida la chiave API
    Discourse mostra un’autenticazione utente valida (x-discourse-username) quando si effettua una semplice GET con quella chiave?
  • convalida l’ID utente
    esiste davvero, vero? restituirà 404 se non esiste
  • sei dietro Cloudflare?
    può incasinare i parametri
2 Mi Piace
  1. Validazione della chiave API
    La chiave API è stata confermata come valida utilizzando il seguente comando:
curl -X GET "https://redactedurl.com/admin/users/list/active.json" -H "Api-Key: LIVEPRODKEYHERE" -H "Api-Username: system"

La risposta (con dati sensibili redatti per riservatezza) è la seguente:

[
  {
    "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. Conferma dell’esistenza dell’utente
    L’utente di test (ID: 15) è stato verificato come esistente, come dimostrato dalla query dei dati dell’utente tramite /admin/users/15/suspend.json:
{
  "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. Configurazione di rete
    Il sito non utilizza Cloudflare. Al contrario, opera dietro un proxy inverso NGINX. L’applicazione ascolta sulla porta 8080 internamente, con NGINX che gestisce la terminazione SSL sulla porta 443 per l’accesso esterno. La configurazione app.yml non si collega direttamente alla porta 443, poiché la gestione SSL e dei certificati è gestita da NGINX per garantire connettività e disponibilità sicure.

Ciao,
solo per seguire, credo che nel campo globale delle chiavi API manchi lo scope di sospensione. Ho riscontrato lo stesso errore. Ho dovuto cambiare la mia chiave con una chiave granulare con lo scope di sospensione per farla funzionare. Speravo anche di poter usare la funzionalità di riattivazione, ma sembra che non sia ancora disponibile tramite l’API.