RESTful HTTP API 中的授权,401 WWW-Authenticate
Posted
技术标签:
【中文标题】RESTful HTTP API 中的授权,401 WWW-Authenticate【英文标题】:Authorization in RESTful HTTP API, 401 WWW-Authenticate 【发布时间】:2013-07-15 07:16:15 【问题描述】:我正在创建一个 RESTful 服务来向 Web 应用程序提供数据。我对此有两个相关的问题。
1。如何处理未经授权的请求?
我打算使用以下代码响应请求:
资源是否打开并找到? 200 正常 您是否需要通过身份验证才能访问资源? 401 未经授权 您无权访问某类资源吗? 403 禁止 您是否有权访问某一类别的资源,但不能访问该特定资源? 404 Not Found 以防止人们知道他们无权访问的资源的存在。 资源不存在吗? 404 未找到这是 RESTful 服务的推荐行为方式吗?
2。 401 响应应该提供什么 WWW-Authenticate
标头?
我在Wikipedia 上读到(可能不是最准确的资源,但它对我有用)401 响应必须包含WWW-Authenticate
标头,但是在进一步搜索后我不能真的找到任何说明这个值的含义和应该是什么的资源。
我发现了几个关于这个标题的 SO 问题和论坛主题,它们似乎都是关于 OAuth,建议不要使用 401 状态代码,或者说你可以编造一些东西。
此标头应包含的正确值是什么?
【问题讨论】:
【参考方案1】:回答您的问题:
如何处理未经授权的请求?
您描述的方式几乎是 RESTful 服务的推荐方式。据我所知,这绝对没有错。
401 响应应该提供什么 WWW-Authenticate 标头?
通常WWW-Authenticate
标头告诉客户端服务器将接受哪种身份验证。如果客户端发出未经授权的请求,这意味着他正在发送一个缺少或无效的Authorization
标头的请求,服务器将使用WWW-Authenticate
告诉客户端他将接受哪种身份验证方案(即Basic、Digest 或OAuth)以及在什么领域。
把它想象成服务器端的某种识别问题或挑战,例如“你是谁?”或“通过以下方式提供凭据来证明您的身份!”。
例如:WWW-Authenticate: Basic realm="My App"
这里服务器告诉客户端他使用了一个名为 Basic 的身份验证方案。领域只不过是一些标识服务器上受保护空间的字符串。
【讨论】:
那么在我有一个为 Web 应用程序提供数据的 Web 服务的场景中,标题是什么样的?Forms realm="http://my.domain.com/"
方面的东西?
是的,它可能看起来像这样。领域不需要是域名。它可以是任何字符串。该值仅标识一组共享凭据的资源。这样,您可以将服务器上的受保护资源分组到多个保护空间中,每个保护空间都有自己的身份验证方案和/或授权数据库。【参考方案2】:
根据我的研究(谷歌搜索),我决定发送:Newauth realm="use login token"。
http://greenbytes.de/tech/tc/httpauth/#unknown 网站有针对不同身份验证方法的测试用例,我没有找到任何描述“获取身份验证令牌”的内容,因此我认为它是“新身份验证”。
对我来说也很重要:这不会在客户端创建登录提示。
【讨论】:
新方案应该注册了。 @JulianReschke 你有什么信息吗?或者你在哪里找到这些信息(可能是一些 rfc 页面?)?您将如何在 REST API 上执行此操作? 这一切都在 RFC 7235 中描述。 考虑到微软只是编造了他们自己的虚假状态码,我们编造自己的 WWW-Authenticate 方案对我们来说是相对轻微的犯罪。基于表单的登录可能没有在 HTTP 中定义,但据我所知,它是 Web 上最常见的登录类型。 HTTP 人员可以通过指定明智的做法来节省一些麻烦。以上是关于RESTful HTTP API 中的授权,401 WWW-Authenticate的主要内容,如果未能解决你的问题,请参考以下文章
C#使用WebHttpRequest调用Restful带token接口500 返回401 未授权错误
使用 API 路由时,在未授权时返回 Http Response 401 而不是重定向到登录页面