OAuth 2.0 specification очень ясно, на ошибках, возвращаемых сервером авторизации в Section 5.2. Error Response:OAuth 2.0 ресурс сервера пользовательский формат ошибки
- ошибка: ТРЕБУЕТСЯ.
- error_description: ДОПОЛНИТЕЛЬНОЕ
- error_uri: ДОПОЛНИТЕЛЬНОЕ
[...]
параметры включены в тело объекта ответа HTTP с помощью «приложения/json ", как определено в [RFC4627].
Образец ответа HTTP даже при условии:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error":"invalid_request"
}
Когда дело доходит до сервера ресурсов (защищенные HTTP ресурсы), то RFC расплывчато об этой части в Section 7.2:
Если запрос доступа к ресурсу выходит из строя, сервер ресурсов ДОЛЖЕН сообщить клиенту ошибки.
Хотя специфика таких ответов ошибок выходит за рамки данной спецификации, этот документ устанавливает общий реестр в разделе ...
Можно уже иметь свою «структуру данных» пользовательских ответ ошибки в месте , Реализации, такие как spring-security-oauth2, используют одинаковый формат ошибок для сервера авторизации и сервера ресурсов по умолчанию.
Это поведение по умолчанию приведет клиентов API к обработке двух разных структур данных для ошибок авторизации и бизнес-ошибок, что очень неудобно.
С другой стороны, мне очень сложно форматировать ошибки HTTP API на основе структуры авторизации: особенно, когда мы используем несколько типов авторизации/аутентификации для тех же ресурсов.
На данный момент я считаю более привлекательным иметь такую же определенную пользователем структуру ошибок для всех ошибок сервера ресурсов, включая ошибки авторизации, связанные с OAuth, такие как «invalid_token».
например:
{
"error": {
"code":"1001"
"type":"invalid_token"
"message":"Expired access token"
}
...
}
Вопрос: это «плохой»/редкость практика, чтобы определить свой собственный формат ответа ошибки сервера ресурсов? Любые элементы, которые я могу забыть рассмотреть?
Идея должна быть максимально удобной.
Спасибо за объяснение, звучит очень логично. 'Но если вы будете управлять как сервером ресурсов, так и клиентом': вы имеете в виду сервер ресурсов и сервер авторизации? –
нет; Я хотел сказать, что взаимодействие между сервером ресурсов и клиентом очень специфично, и вам легче контролировать и модифицировать это по своему вкусу, если вы контролируете оба объекта; интерфейс на сервере авторизации в любом случае стандартизирован и не нуждается в настройке, даже если вы управляете обоими –
Получил его. Ключевым аргументом здесь является то, что, поскольку клиентам все равно нужно будет входить в детали нашего API, имеет смысл сохранить собственный формат ошибок - и установите ошибки авторизации OAuth там, как и в случае с базой данных HTTP. –