我正在编写一个 REST-ish API 服务,它提供了通过 OAuth 与其他第 3 方服务(它们本身是 REST API)中的最终用户数据进行交互的能力。一个常见的例子可能是将数据从我的服务发布到第三方服务,例如 Facebook 或 Twitter。
例如,假设我与最终用户和 Facebook 执行 OAuth 舞蹈,产生了一些短期访问 token ,我的服务可以使用该 token 与用户的 Facebook 帐户进行交互。如果该访问 token 过期并且用户尝试使用我的服务发布到 Facebook,我会向用户返回什么样的错误?
401 对我来说似乎不太合适;似乎 401 将通过我的服务应用于用户的身份验证状态。 403 似乎更合适,但也很通用。
最佳答案
401 是要走的路。定义 HTTP 协议(protocol)的 RFC2616 的两个摘录:
第 10.4.2 节(约 401):
If the request already included Authorization credentials, then the 401 response indicates that authorization has been refused for those credentials.
这似乎适用于过期的 token 。存在身份验证凭据,但它们被拒绝,因此用户代理必须重新进行身份验证。
第 10.4.4 节(约 403):
The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated.
当尽管有用户凭据仍无法访问资源时,应使用此方法。可能是仅适用于美国的网站/API 被亚洲 IP 攻击或已被宣布为有害且已停用的网页(因此内容已找到,但服务器拒绝为其提供服务)。
在 OAuth2 上,推荐的工作流程取决于 token 的传递方式。如果通过 Authorization header 传递,服务器可能会返回 401。当通过查询字符串参数传递时,最合适的响应是 400 Bad Request(不幸的是,HTTP 拥有的最通用的请求)。这是由 OAuth2 规范的第 5.2 节定义的 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-26
关于api - 如果第 3 方 API 身份验证失败,我的 API 应该返回哪些 HTTP 错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705884/