Срок действия токена истек - JSON REST API - Код ошибки

84

У меня есть JSON REST API. Рукопожатие даст вам токен, действительный в течение 15 минут. Все звонки, которые вы делаете в течение этих 15 минут, должны работать нормально. Через 15 минут я возвращаю объект ошибки (включая код, сообщение, success = false), но мне также было интересно, какой код ошибки HTTP я должен вернуть? И не испортит ли использование кода ошибки HTTP некоторых клиентов? (HTML5, iPhone, Android). Что считается лучшей практикой в ​​этом сценарии?

BuddyJoe
источник
9
+1, отличный вопрос. Вы когда-нибудь находили для этого хорошее решение? (Кстати, и netflix, и linkedin возвращают 401).
Лассе Кристиансен
@MichaelFreidgeim Этот вопрос уже старше
FindOutIslamNow
@FindOutIslamNow, «Возможный дубликат» - это способ очистки - закрыть похожие вопросы и оставить один с наилучшими ответами. Дата не важна. См. Meta.stackexchange.com/questions/147643/… Если вы согласны с тем, что это требует разъяснения, пожалуйста, проголосуйте на meta.stackexchange.com/questions/281980/…
Майкл

Ответы:

89

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

Подумайте, что происходит в веб-приложении. Вы заходите, скажем, на банковский сайт. Если не авторизован, он отправит вас на страницу входа в систему. Затем вы входите в систему и можете немного поработать. Затем он истекает, и цикл повторяется.

Просто мысль.

судиться
источник
39

согласно спецификации rfc6750 - «Структура авторизации OAuth 2.0: использование токена-носителя», https://tools.ietf.org/html/rfc6750 , стр.8, раздел 3.1, сервер ресурсов должен возвращать 401:>

invalid_token Предоставленный токен доступа просрочен, отозван, имеет неправильный формат или недействителен по другим причинам. Ресурсу СЛЕДУЕТ ответить кодом состояния HTTP 401 (Неавторизованный). Клиент МОЖЕТ запросить новый токен доступа и повторить запрос защищенного ресурса.

Луи
источник
2
Примечание ДОЛЖЕН или ОБЯЗАТЕЛЬНО . Как вызывающий, было бы неплохо иметь возможность полагаться на 401. Ну что ж.
dbreaux
12

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
  }
}
Рыноп
источник
29
Что-то подсказывает мне, что Facebook следует рассматривать как исключение, а не руководство для разработки. Просто говорю.
Виктор Ивенс
6
Это обращение к Facebook как к серверу авторизации или к провайдеру ресурсов? Сервер авторизации должен вернуть 400: tools.ietf.org/html/rfc6749#section-5.2 , но поставщик ресурсов должен вернуть 401
Майкл