У меня есть API JSON REST. Существует рукопожатие, которое даст вам токен, который действителен в течение 15 минут. Все вызовы, которые вы выполняете в течение этих 15 минут, должны работать нормально. Через 15 минут я возвращаю объект ошибки (включая код, сообщение, success = false), но мне также интересно, какой код ошибки HTTP я должен вернуть? И будет ли использование кода ошибки HTTP испортить определенные клиенты? (HTML5, iPhone, Android). Что считается лучшей практикой в этом сценарии?
Token Expired - API JSON REST - код ошибки
Ответ 1
Вы должны вернуть код состояния 401 Unauthorized
. Вы можете дополнительно предоставить гипермедиа, чтобы снова установить токен.
Подумайте, что происходит в веб-приложении. Вы отправляетесь на банковский сайт. Если не auth'd, он отправит вас на страницу входа в систему. Затем вы входите в систему, и вам хорошо пойти на какое-то время. Затем он истекает и цикл повторяется.
Просто мысль.
Ответ 2
в соответствии со спецификацией rfc6750 - "Рамка авторизации OAuth 2.0: использование токена носителя", https://tools.ietf.org/html/rfc6750, стр .8, раздел 3.1, сервер ресурсов должен вернуть 401: >
invalid_token Предоставляемый токен доступа истек, отозван, искажен или недействительным по другим причинам. Ресурс СЛЕДУЕТ ответить код статуса HTTP 401 (неавторизованный). Клиент МОЖЕТ запросить новый токен доступа и повторить попытку использования защищенного ресурса запрос.
Ответ 3
FWIW Facebook использует 400 с пользовательским ответом JSON. Я лично предпочел бы 401 с пользовательским ответом JSON.
Вот тело ответа FB:
{
"error": {
"message": "Error validating access token: Session has expired on Jul 17, 2014 9:00am. The current time is Jul 17, 2014 9:07am.",
"type": "OAuthException",
"code": 190,
"error_subcode": 463
}
}
Ответ 4
Я искал спецификацию OAuth 2, и все, что я мог найти, это то, что они возвращают "Недопустимую ошибку токена", когда она истекает. Нет никакого упоминания, что я могу найти, какого HTTP-кода они используют. Тем не менее, я бы сказал, что ваша самая безопасная ставка - это просто использовать 400.