Azure Api Management возвращает подробное сообщение об ошибке, если резервное копирование отключено, включая токен присяги - PullRequest
0 голосов
/ 14 июня 2019

Я работаю над управлением API, серверная часть защищена учетными данными клиента oauth. Если бэкэнд выключен, я получаю ответ 200 и ошибку детализации, как показано ниже.

{
  "error": {
    "name": "StatusCodeError",
    "statusCode": 404,
    "message": "HTTP Error 404. The requested resource is not found.",
    "options": {
      "url": "https://...net.au/api/case/mycases/",
      "method": "GET",
      "headers": {
        "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhb....."
      },
      "simple": true,
      "resolveWithFullResponse": false,
      "transform2xxOnly": false
    },
    "response": {
      "statusCode": 404,
      "body": "HTTP Error 404. The requested resource is not found.",
      "headers": {
        "content-length": "315",
        "content-type": "text/html; charset=us-ascii",
        "server": "Microsoft-HTTPAPI/2.0 Microsoft-HTTPAPI/2.0",
        "date": "Fri, 14 Jun 2019 02:12:36 GMT",
        "connection": "close"
      },
      "request": {
        "uri": {
          "protocol": "https:",
          "slashes": true,
          "auth": null,
          "host": ".....",
          "port": 443,
          "hostname": "....net.au",
          "hash": null,
          "search": null,
          "query": null,
          "pathname": "/api/case/mycases/",
          "path": "/api/case/mycases/",
          "href": "https://...."
        },
        "method": "GET",
        "headers": {
          "Authorization": "Bearer eyJ0eXAiO....."
        }
      }
    }
  },
  "status": 501
}

Я хочу возвращать ответ только так, когда вызывается API. и скрыть все дополнительные данные, включая токен доступа.

{
  "error": {
    "name": "StatusCodeError",
    "statusCode": 404,
    "message": "HTTP Error 404. The requested resource is not found.",
 }
}

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

        <choose>
            <when condition="@{

               var token = context.Response.Body.As<JToken>();
               if (token is JObject){
                    return true;
               }

                return false;
            }">
                <return-response>
                    <set-status code="404" reason="NotFound" />
                    <set-header name="Content-Type" exists-action="override">
                        <value>application/json</value>
                    </set-header>
                    <set-body>{
  "error": {
    "name": "StatusCodeError",
    "statusCode": 404,
    "message": "HTTP Error 404. The requested resource is not found.",
 }
}</set-body>
                </return-response>
            </when>
        </choose>

1 Ответ

0 голосов
/ 15 июня 2019

Есть два случая, когда вы можете получить 404 ответа от APIM. Во-первых, когда вы пытаетесь вызвать API / операцию, о которой APIM не знает, в этом случае APIM сгенерирует ответ 404, и он будет очень коротким, очень похожим на ваш второй.

Другой случай, когда APIM идентифицирует API / операцию, выполняет вызов бэкэнда, а бэкэнд отвечает 404. В этом сценарии APIM не рассматривает это как проблему, а просто передает ответ бэкэнда клиенту. То, что у вас есть в первом примере, похоже на то, с чем ответит серверная часть. Это можно подтвердить, позвонив с тестовой консоли на портале Azure и проверив предоставленную трассировку.

Итак, что вы хотите сделать, это заменить основную часть ответа 404 на ваш выбор, что легко сделать с помощью политик. Во всяком случае, добавьте что-нибудь в этом роде:

<outbound>
    <base/>
    <choose>
        <when condition="@(context.Response.StatusCode == 404)">
            <return-response>
                <set-status code="404" reason="NotFound">
                <set-header name="Content-Type">
                    <value>application/json</value>
                </set-header>
                <set-body>{
  "error": {
    "name": "StatusCodeError",
    "statusCode": 404,
    "message": "HTTP Error 404. The requested resource is not found.",
 }
}</set-body>
            </return-response>
        </when>
    </choose>
</outbound>
...