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

116

我有一个JSON REST API。在握手期间你会得到一个15分钟有效的令牌,这个期间内所有的调用都应该正常工作。15分钟后,我会返回一个错误对象(包括代码、消息、success=false),但我也想知道应该返回哪个HTTP错误码?是否使用HTTP错误码会影响某些客户端(如HTML5、iPhone、Android)?在这种情况下,什么是最佳实践?


9
+1,很好的问题。你有没有找到一个好的解决方案?(顺便说一句 - netflixlinkedin 都返回401错误代码)。 - Lasse Christiansen
可能是当会话令牌无效时应使用哪个状态码?的重复问题。 - Michael Freidgeim
@MichaelFreidgeim 这个问题已经比较老了。 - FindOutIslamNow
@FindOutIslamNow,“可能重复”是一种清理方式 - 关闭类似的问题并保留一个具有最佳答案。日期不是必要的。请参见http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha 如果您同意需要澄清,请在http://meta.stackexchange.com/questions/281980/add-clarification-link-to-possible-duplicate-automated-comment上投票。 - Michael Freidgeim
3个回答

118
你应该返回一个401 未授权状态码。你还可以提供超媒体来重新建立令牌。
想象一下在 Web 应用程序中会发生什么。你访问银行网站,如果没有经过身份验证,它将会把你发送到登录页面。然后你登录,就可以使用一段时间了。之后令牌过期,这个循环就重复了。
只是一个思路。

54
根据规范RFC6750 - "OAuth 2.0授权框架:持票据令牌的使用",https://www.rfc-editor.org/rfc/rfc6750,第8页第3.1节,资源服务器应返回401:
无效令牌 提供的访问令牌已过期、被吊销、格式错误或由于其他原因无效。资源服务器应该用HTTP 401(未经授权)状态码响应。客户端可以请求一个新的访问令牌并重试受保护的资源请求。

3
注意“SHOULD”和“MUST”的区别。作为呼叫者,能够依赖401代码会是很好的事情。哦,算了。 - dbreaux

15

就我所知,Facebook使用400错误代码和自定义JSON响应。个人而言,我更喜欢使用401错误代码和自定义JSON响应。

以下是Facebook的响应正文:

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

43
有些东西告诉我,Facebook应该被视为一个例外而不是发展的指南。仅此而已。 - Victor Ivens
7
这句话的意思是:这个请求是要求 Facebook 作为认证服务器还是资源提供者?如果它作为认证服务器,应该返回状态码400:https://tools.ietf.org/html/rfc6749#section-5.2 ,但如果作为资源提供者,应该返回401。 - Michael Freidgeim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接