L'API renvoie des erreurs 404

Bonjour à la communauté Discourse,

Je rencontre actuellement des difficultés avec les points de terminaison de l’API Discourse, en particulier ceux liés à la suspension des utilisateurs, et j’apprécierais toute aide ou orientation que vous pourriez m’offrir.

Résumé des problèmes

  1. 404 Non trouvé :

    • Lorsque j’utilise le point de terminaison :
      /admin/users/15/suspend.json, je reçois constamment une erreur « Page non trouvée », même si l’utilisateur existe.
    • J’ai également essayé le point de terminaison alternatif :
      /admin/u/15/suspend.json, qui aboutit au même problème.
  2. Réponse HTML inattendue :

    • Au lieu de renvoyer la réponse JSON attendue, l’API renvoie une page HTML avec le message :
      « Oups ! Cette page n’existe pas ou est privée. »
    • Cela se produit, que j’utilise curl ou PowerShell pour la requête.
  3. Clé API et autorisations :

    • La clé API utilisée dispose d’un accès administrateur complet, mais les requêtes continuent de renvoyer une erreur 404.
    • J’ai également testé avec des clés granulaires (restreintes aux actions de suspension) et une clé en lecture seule, mais le problème persiste.
    • Il est intéressant de noter que le point de terminaison fonctionne parfaitement lorsqu’il est accédé via un navigateur, mais échoue lorsqu’il utilise des requêtes API avec la clé.

Exemples de requêtes

Exemple 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"}'

Exemple PowerShell

# Script PowerShell pour suspendre un utilisateur sur 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 "Utilisateur suspendu avec succès !" -ForegroundColor Green
} catch {
    Write-Host "Erreur lors de la suspension de l'utilisateur :" -ForegroundColor Red
    Write-Host $_.Exception.Message
}

Détails supplémentaires

  • Version de Discourse : 3.4.0.beta3
  • Étapes de dépannage effectuées :
    J’ai essayé d’ajuster les en-têtes de requête, y compris User-Agent et Referer, mais sans succès.

Toute idée ou suggestion pour m’aider à résoudre ces problèmes serait grandement appréciée. Merci d’avance pour votre temps et votre soutien !

Cordialement,
Ross

Votre exemple fonctionne tel quel, à l’exception des paramètres attendus sur notre site de 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"
    }
  }
}
  • Valider la clé API
    Discourse affiche-t-il un utilisateur authentifié valide (x-discourse-username) lors d’une simple requête GET avec cette clé ?
  • Valider l’ID utilisateur
    il existe vraiment, n’est-ce pas ? Il renverra une erreur 404 s’il n’existe pas.
  • Êtes-vous derrière Cloudflare ?
    Cela peut perturber les paramètres.
2 « J'aime »
  1. Validation de la clé d’API
    La clé d’API a été confirmée comme valide à l’aide de la commande suivante :
curl -X GET "https://redactedurl.com/admin/users/list/active.json" -H "Api-Key: LIVEPRODKEYHERE" -H "Api-Username: system"

La réponse (avec les données sensibles masquées pour des raisons de confidentialité) est la suivante :

[
  {
    "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. Confirmation de l’existence de l’utilisateur
    L’utilisateur de test (ID : 15) a été vérifié comme existant, comme le démontre la requête des données de l’utilisateur à l’aide de /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. Configuration réseau
    Le site n’utilise pas Cloudflare. Il fonctionne plutôt derrière un proxy inverse NGINX. L’application écoute sur le port 8080 en interne, NGINX gérant la terminaison SSL sur le port 443 pour l’accès externe. La configuration app.yml ne se lie pas directement au port 443, car la gestion SSL et des certificats est assurée par NGINX pour garantir la connectivité sécurisée et la disponibilité.

Bonjour,
Je voulais simplement faire un suivi, je crois que la portée globale des clés API ne comprend pas la portée de suspension. Je suis tombé sur la même erreur. J’ai dû échanger ma clé contre une clé granulaire avec la portée de suspension pour que cela fonctionne. J’espérais aussi que la fonctionnalité de réactivation soit disponible, mais il semble qu’elle ne le soit pas encore via l’API.