【发布时间】:2016-09-02 00:00:02
【问题描述】:
我正在开发一个包含第三方集成的 RESTful API。我们将 OAuth 与授权代码流一起使用来针对第三方进行身份验证。用户必须先登录我们的服务,然后再登录第三方,这样我们的应用才能访问第三方。
我们的一些资源需要与第三方交互才能完成(例如GET /third-party-userpic)。如果用户已经登录到该服务,我们将从我们的数据存储中检索访问令牌并使用它来检索用户的图片,很简单!
但是,如果我们不持有该用户对该服务的有效凭据,我们就无法获取该用户的照片。这将在首次使用时发生,并且在凭证过期或被撤销时也可能发生。在这种情况下,我们希望向客户端传达他们需要访问授权 URI 并开始 OAuth 流程。
我和我设计这个的同事讨论了几种可能性,包括:
- 返回
200 OK成功,并指示在响应正文中需要或允许身份验证。这是不优雅的,并且不能很好地扩展到不同内容类型的资源,并且要求客户端知道它何时访问可能需要此身份验证方案的资源。 - 返回
403 Forbidden以及链接以在标头或正文中进行身份验证。问题是这需要与由于权限问题而生成的403 Forbidden区分开来,并且感觉与我们希望403的含义不符。 - 返回
401 Unauthorized。这有同样的问题,要求客户端在用户未登录时将其与我们平台生成的401分开。还有一个问题是401 Unauthorized是 HTTP 质询-响应身份验证方案的一部分,但我们没有在这里实施挑战-响应流程。客户端从不接触凭据。 - 创建一个新的
4XX状态代码以允许客户端轻松地将这种情况与其他可能的故障区分开来。从技术角度来看,这似乎是最干净的,但我们可能不需要制作新的状态代码!
【问题讨论】:
标签: rest http oauth restful-authentication api-design