2012-01-13 2 views
32

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

+4

+1, отличный вопрос. Вы когда-нибудь находили хорошее решение? (btw - оба [netflix] (http://developer.netflix.com/docs/read/HTTP_Status_Codes) и [linkedin] (https://developer.linkedin.com/documents/handling-errors-invalid-tokens) возвращает пункт 401). –

+0

Возможный дубликат [Какой код состояния следует использовать, если токен сеанса является недопустимым?] (Https://stackoverflow.com/questions/20613088/what-status-code-should-i-use-when-session-token-is -invalid) –

ответ

3

Я искал спецификацию OAuth 2, и все, что я мог найти, это то, что они возвращают «Недопустимую ошибку токена», когда она истекает. Нет никакого упоминания, что я могу найти, какого HTTP-кода они используют. Однако я бы сказал, что ваша самая безопасная ставка - просто использовать 400.

37

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

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

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

5

FWIW Facebook использует 400 с пользовательским ответом JSON. Я лично предпочел бы 401 с пользовательским ответом JSON.

Вот тело ответа ФБ:

{ 
    "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 
    } 
} 
+8

Что-то подсказывает, что Facebook следует рассматривать как исключение, а не руководство для разработки. Просто говорю. –

+0

Это вызов Facebook в отношении сервера авторизации или поставщика ресурсов? Сервер авторизации должен вернуть 400: https://tools.ietf.org/html/rfc6749#section-5.2, но поставщик ресурсов должен вернуть 401 –

7

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

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