API está lançando erros 404

Olá Comunidade Discourse,

Estou atualmente enfrentando desafios com os endpoints da API do Discourse, especificamente relacionados à suspensão de usuários, e agradeceria muito qualquer ajuda ou orientação que vocês possam oferecer.

Resumo dos Problemas

  1. 404 Não Encontrado:

    • Ao usar o endpoint:
      /admin/users/15/suspend.json, recebo consistentemente um erro de “Página Não Encontrada”, mesmo que o usuário exista.
    • Também tentei o endpoint alternativo:
      /admin/u/15/suspend.json, que resulta no mesmo problema.
  2. Resposta HTML Inesperada:

    • Em vez de retornar a resposta JSON esperada, a API retorna uma página HTML com a mensagem:
      “Oops! Essa página não existe ou é privada.”
    • Isso ocorre independentemente de eu estar usando curl ou PowerShell para a solicitação.
  3. Chave de API e Permissões:

    • A chave de API em uso tem acesso total de administrador, mas as solicitações continuam retornando um erro 404.
    • Também testei usando chaves granulares (restritas a ações de suspensão) e uma chave somente leitura, mas o problema persiste.
    • Curiosamente, o endpoint funciona perfeitamente quando acessado via navegador, mas falha ao usar solicitações de API com a chave.

Exemplos de Solicitações

Exemplo com 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"}'

Exemplo com PowerShell

# Script PowerShell para Suspender um Usuário no 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 "Usuário suspenso com sucesso!" -ForegroundColor Green
} catch {
    Write-Host "Erro ao suspender usuário:" -ForegroundColor Red
    Write-Host $_.Exception.Message
}

Detalhes Adicionais

  • Versão do Discourse: 3.4.0.beta3
  • Etapas de Solução de Problemas Realizadas:
    Tentei ajustar os cabeçalhos da solicitação, incluindo User-Agent e Referer, mas sem sucesso.

Quaisquer insights ou sugestões para ajudar a resolver esses problemas seriam muito apreciados. Obrigado antecipadamente pelo seu tempo e apoio!

Atenciosamente,
Ross

Seu exemplo funciona como está, com ressalvas para os parâmetros esperados em nosso site de teste:

○ → 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"
    }
  }
}
  • validar a chave da API
    o Discourse mostra uma autenticação de usuário válida (x-discourse-username) ao fazer um GET simples com essa chave?
  • validar o ID do usuário
    ele realmente existe, certo? retornará 404 se não existir
  • você está atrás do Cloudflare?
    ele pode bagunçar os parâmetros
2 curtidas
  1. Validação da Chave da API
    A chave da API foi confirmada como válida usando o seguinte comando:

    curl -X GET "https://redactedurl.com/admin/users/list/active.json" -H "Api-Key: LIVEPRODKEYHERE" -H "Api-Username: system"
    

    A resposta (com dados sensíveis omitidos por confidencialidade) é a seguinte:

    [
      {
        "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"
      }
    ]
    
  2. Confirmação de Existência do Usuário
    O usuário de teste (ID: 15) foi verificado como existente, conforme demonstrado pela consulta aos dados do usuário usando /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. Configuração de Rede
    O site não está utilizando Cloudflare. Em vez disso, ele opera atrás de um proxy reverso NGINX. A aplicação escuta na porta 8080 internamente, com o NGINX gerenciando a terminação SSL na porta 443 para acesso externo. A configuração app.yml não se vincula diretamente à porta 443, pois o gerenciamento de SSL e certificados é tratado pelo NGINX para garantir conectividade e disponibilidade seguras.

Oi,
Só para acompanhar, acredito que o escopo global para chaves de API está faltando o escopo de suspensão. Eu estava enfrentando o mesmo erro. Tive que trocar minha chave por uma chave granular com o escopo de suspensão para que ela funcionasse. Também esperava que a reativação funcionasse, mas ainda não parece estar disponível através da API.