令牌已过期-JSON REST API-错误代码


83

我有一个JSON REST API。握手会给您一个有效期为15分钟的令牌。您在这15分钟内拨打的所有电话都可以正常运行。15分钟后,我返回一个错误对象(包括代码,消息,成功= false),但我也想知道应该返回什么HTTP错误代码?并且使用HTTP错误代码会使某些客户端混乱吗?(HTML5,iPhone,Android)。在这种情况下,什么是最佳实践?


9
+1,好问题。您是否找到了一个很好的解决方案?(顺便说一句-netflixlinkedin均返回401)。
Lasse Christiansen


@MichaelFreidgeim这个问题已经很老了
FindOutIslamNow

@FindOutIslamNow,“可能重复”是清理的一种方法-关闭相似的问题,并为他们提供最佳答案。日期不是必需的。参见meta.stackexchange.com/questions/147643/…如果您同意需要澄清,请对meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Answers:


88

您应该返回401 Unauthorized状态码。您可能还需要提供超媒体来再次建立令牌

考虑一下网络应用程序中发生的情况。你去说一个银行网站。如果未通过身份验证,则会将您发送到登录页面。然后,您登录即可,好一段时间了。然后到期,循环重复进行。

只是一个想法。


39

根据规范rfc6750-“ OAuth 2.0授权框架:承载令牌使用”,https://tools.ietf.org/html/rfc6750 ,第8页,第3.1节,资源服务器应返回401:>

invalid_token提供的访问令牌已过期,已吊销,格式错误或由于其他原因无效。资源应以HTTP 401(未授权)状态代码响应。客户端可以请求一个新的访问令牌并重试受保护的资源请求。


2
注意应该必须。作为呼叫者,能够依靠401会很好。
dbreaux

13

FWIW Facebook使用带有自定义JSON响应的400。我个人更喜欢带有自定义JSON响应的401。

这是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
  }
}

28
有人告诉我,应该将Facebook视为例外,而不是发展指南。只是说。
维克多·艾文斯

6
它是向Facebook询问授权服务器还是资源提供者?授权服务器应返回400:tools.ietf.org/html/rfc6749#section-5.2,但是资源提供者应返回401
Michael Freidgeim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.