API возвращает ошибки 404

Привет, сообщество Discourse,

В настоящее время я сталкиваюсь с проблемами при работе с конечными точками API Discourse, в частности, связанными с приостановкой пользователей, и был бы крайне признателен за любую помощь или рекомендации, которые вы можете предложить.

Краткое описание проблем

  1. 404 Not Found:

    • При использовании конечной точки:
      /admin/users/15/suspend.json я постоянно получаю ошибку «Page Not Found» (Страница не найдена), даже если пользователь существует.
    • Я также пробовал альтернативную конечную точку:
      /admin/u/15/suspend.json, но результат тот же.
  2. Неожиданный HTML-ответ:

    • Вместо ожидаемого JSON-ответа API возвращает HTML-страницу с сообщением:
      «Oops! That page doesn’t exist or is private.» (Упс! Страница не существует или является приватной).
    • Это происходит независимо от того, использую ли я curl или PowerShell для отправки запроса.
  3. Ключ API и разрешения:

    • Используемый ключ API имеет полный доступ администратора, однако запросы продолжают возвращать ошибку 404.
    • Я также тестировал использование точечных ключей (ограниченных действиями по приостановке) и ключа только для чтения, но проблема сохраняется.
    • Примечательно, что конечная точка отлично работает при доступе через браузер, но не работает при использовании API-запросов с ключом.

Примеры запросов

Пример 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"}'

Пример PowerShell

# Скрипт PowerShell для приостановки пользователя в 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
}

Дополнительная информация

  • Версия Discourse: 3.4.0.beta3
  • Принятые меры по устранению неполадок:
    Я пробовал изменять заголовки запроса, включая User-Agent и Referer, но безрезультатно.

Буду очень признателен за любые идеи или предложения, которые помогут решить эти проблемы. Заранее спасибо за ваше время и поддержку!

С наилучшими пожеланиями,
Росс

Ваш пример работает без изменений, за исключением ожидаемых параметров для нашего тестового сайта:

○ → 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-ключ
    Показывает ли Discourse корректную аутентификацию пользователя (x-discourse-username) при выполнении простого GET-запроса с этим ключом?
  • Проверьте ID пользователя
    Он действительно существует, верно? Если нет, вернётся ошибка 404.
  • Находитесь ли вы за Cloudflare?
    Это может нарушить работу параметров.
  1. Проверка API-ключа
    Валидность API-ключа подтверждена с помощью следующей команды:

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

    Ответ (с конфиденциальными данными, скрытыми в целях конфиденциальности) выглядит следующим образом:

    [
      {
        "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. Подтверждение существования пользователя
    Тестовый пользователь (ID: 15) подтвержден как существующий, что продемонстрировано запросом данных пользователя через /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. Настройка сети
    Сайт не использует Cloudflare. Вместо этого он работает за обратным прокси-сервером NGINX. Приложение слушает порт 8080 внутри сети, а NGINX обрабатывает завершение SSL на порту 443 для внешнего доступа. Файл конфигурации app.yml не привязан напрямую к порту 443, так как управление SSL и сертификатами осуществляется через NGINX для обеспечения безопасного подключения и доступности.

Привет,
Просто хочу уточнить: я считаю, что в глобальной области действия ключей API отсутствует область suspend. Я столкнулся с той же ошибкой. Чтобы это заработало, мне пришлось заменить свой ключ на точечный ключ с областью suspend. Я также надеялся, что функция unsuspend будет работать, но, похоже, она пока недоступна через API.