REST API как обрабатывать неполные ответы - PullRequest
1 голос
/ 26 февраля 2020

В настоящее время я разрабатываю REST API с бэкэндом MongoDB, и из-за прав доступа клиенты могут искать данные там, где некоторые доступны, а другие запрещены.

Например, допустим, у меня есть sh, чтобы иметь в одном запросе объекты A, B и X из базы данных, но у меня недостаточно прав для доступа к объекту X.

Я бы хотел, чтобы мой API отвечал на A, B и запрещенный статус для объекта X. Любые лучшие практики , чтобы сделать это? Каков результат запроса код статуса ?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Когда пользователь пытается получить представление отдельного ресурса , используя свой URI, и у пользователя недостаточно прав для доступа к такому ресурсу, ожидается, что сервер вернет 403 . Или 404, если сервер хочет скрыть существование этого ресурса.

С другой стороны, в сценарии, когда пользователь выбирает представление коллекции ресурсов и не все доступные ресурсы могут быть возвращены из-за, например, отсутствия разрешений, сервер должен возвращать только представление ресурсов, к которым у пользователя есть доступ.


Если вы намереваетесь ограничить доступ к полям ресурса, вы можете иметь разные URI для них и затем соответствующим образом проверить разрешения.

Рассмотрите следующий пример:

  • /orders/{id} : Сводка данного заказа
  • /orders/{id}/items: Товары данного заказа
  • /orders/{id}/payment: Платежные реквизиты данного заказа
  • /orders/{id}/invoice: Счета-фактуры данный заказ
  • /orders/{id}/delivery: детали доставки данного заказа
0 голосов
/ 26 февраля 2020

Вы можете использовать конверты для каждого подресурса и добавлять статус к каждому подресурсу.

Предполагая, что ваш API возвращает основной ресурс A, который, в свою очередь, содержит два вложенных ресурса. ресурсы B и X. Если вызывающий не имеет разрешения на доступ к A, то API должен четко ответить HTTP / 403, как правильно указал cassiomolin.

Если вызывающий имеет полные разрешения для всех ресурсов, пример ответа будет (при условии JSON полезной нагрузки):

    {
    "entityEnvelopeA": {
        "status": "OK",
        "data": {
            "propertyΑ1": "value1",
            "propertyΑ2": "value2"
        }
    },
    "entityEnvelopeΒ": {
        "status": "OK",
        "data": {
            "propertyΒ1": "value1",
            "propertyΒ2": "value2"
        }
    },
    "entityEnvelopeΧ": {
        "status": "OK",
        "data": {
            "propertyΧ1": "value1",
            "propertyΧ2": "value2"
        }
    }
    }

Если вызывающая сторона не имеет доступа к подресурсу X, ответ будет:

{
    "entityEnvelopeA": {
        "status": "OK",
        "data": {
            "propertyΑ1": "value1",
            "propertyΑ2": "value2"
        }
    },
    "entityEnvelopeΒ": {
        "status": "OK",
        "data": {
            "propertyΒ1": "value1",
            "propertyΒ2": "value2"
        }
    },
    "entityEnvelopeΧ": {
        "status": "FORBIDDEN",
        "data": {}
    }
}

Если этот подход задокументировано в ваших документах API, вызывающий может затем проверить поле status конверта перед анализом поля data.

...