web-applications - Web 应用程序的 RESTful 身份验证

标签 web-applications rest restful-authentication

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

8年前关闭。




Improve this question




嗨,您已经在 this question 上写下了这个观察和问题。早些时候,但后来才注意到这是一个古老而“死”的问题。由于我真的很想从其他人那里获得一些见解,因此我将其重新发布为一个新问题。

对于如何以REST方式进行认证的问题,人们普遍热情地喊出“HTTP认证”。但是,我怀疑这些人是否曾经尝试过使用 REST 制作基于浏览器的应用程序(而不是机器对机器的 Web 服务)。 (无意冒犯 - 我只是认为他们从未遇到过这些并发症)

我在 RESTful 服务上使用 HTTP 身份验证发现的问题是:

  • 用户通常会得到一个丑陋的浏览器登录框,这对用户非常不友好。您不能添加密码检索、帮助框等。
  • 注销或以不同的名称登录是一个问题 - 浏览器将不断向站点发送身份验证信息,直到您关闭窗口
  • 超时很困难

  • 一篇非常有见地的文章逐点解决这些问题是here ,但这会导致许多特定于浏览器的 javascript 黑客、变通方法等。因此,它也不向前兼容,因此随着新浏览器的发布需要不断维护。我不认为那种简洁明了的设计,而且我觉得这是很多额外的工作和头痛,以便我可以热情地向我的 friend 展示我的 REST 徽章。

    我相信 cookies 是解决方案。但是等等, cookies 是邪恶的,不是吗?不,他们不是,经常使用cookies的方式是邪恶的。 cookie 本身只是一段客户端信息,就像浏览器在您浏览时跟踪的 HTTP 身份验证信息一样。这条客户端信息会在每次请求时发送到服务器,就像 HTTP 身份验证信息一样。从概念上讲,唯一的区别是这块客户端状态的内容可以由服务器确定作为其响应的一部分。

    通过仅使用以下规则使 session 成为 RESTful 资源:
  • session 将 key 映射到用户 ID(可能还有用于超时的最后操作时间戳)
  • 如果 session 存在,则表示 key 有效。
  • 登录意味着 POST 到/sessions,一个新的 key 被设置为 cookie
  • 注销意味着删除/sessions/{key}(POST 过载,请记住,我们是浏览器,HTML 5 还有很长的路要走)
  • 身份验证是通过在每次请求时将 key 作为 cookie 发送并检查 session 是否存在和有效来完成的

  • 现在,与 HTTP 身份验证的唯一区别是,身份验证 key 由服务器生成并发送给客户端,客户端不断将其发回,而不是客户端根据输入的凭据计算它。

    我觉得这是一个足够有效的解决方案,但我必须承认我不够安全专家来识别这个方案中的潜在漏洞 - 我所知道的是数百个非 RESTful Web 应用程序使用基本相同登录协议(protocol)(php 中的 $_SESSION、j2ee 中的 HttpSession 等)。 cookie header 内容仅用于寻址服务器端资源,就像可以使用接受语言访问翻译资源等一样。我觉得是一样的,但也许其他人不一样?你们觉得怎么样?

    最佳答案

    一个有趣的问题。我现在正在完成 REST API 实现 - 使用了 mod_rewrite 和 PHP。它使用跨 HTTPS 的 HTTP 基本身份验证。到目前为止,我们正在开发 Palm Pre 客户端。开发该客户端的人对必须跟踪每个请求提交的用户凭据感到有点犹豫。

    将 SESSION 作为资源公开的想法很有趣。包括它仍然会违反严格的 RESTful 原则。即使您将 SESSION 作为资源公开,您仍然会使用服务器来跟踪客户端状态。严格遵守 REST 可能需要使用 cookie,因为这是您可以从浏览器使用的客户端持久内存。问题是,如果您不希望用户与浏览器实现的 HTTP 凭据收集进行交互,那么您需要创建一个 JavaScript(或 FLash?)客户端来管理客户端的 HTTP 请求。

    我发现一个有用的工具是 REST Client for Firefox 工具......但即使我正在使用它,我仍然将我的凭据输入到标准浏览器弹出窗口中。

    我不得不承认在我的实现中包含了一些技巧。如果您所做的只是使用 session 来允许潜在开发人员测试/浏览 API,或者我认为使用基于 session 的身份验证并不是什么大问题。我敢肯定,纯粹主义者会不同意。真的这就是归结为......这本质上是一个学术论点。在现实生活中,你必须做有效的事情。

    ... 于 2012 年 10 月 23 日添加此内容 ...

    坚持让客户端跟踪其自身状态的 RESTful 方法不仅仅是学术性的。它对公开资源的可扩展性和可寻址性具有重要意义。当我这么说时,我假设根据客户端状态,我们谈论的是特定于请求用户的属性,这些属性会影响 RESTful 接口(interface)发出的响应。 REST 的优势之一是其可寻址性。当您以任何方式根据未在请求中传递的信息做出响应时,您就开始对此进行处理。只是事后的想法...... 3 年后,哈哈。

    关于web-applications - Web 应用程序的 RESTful 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1137977/

    相关文章:

    ASP.NET 自定义错误页面 - Server.GetLastError() 为 null

    database - 类似于 MS Access,但在云端

    php - 如何防止同时执行多个 REST API?

    java - 如何在 RESTful WS 中隐藏带有条件的字段?

    javascript - 使用 Javascript 插件作为客户端进行 Web API 的身份验证和授权

    web-applications - Websphere 类加载

    java - Web应用程序中的Spring SimpleThreadScope : part of container pool?

    java - 如何使用 Apache Shiro 对 Android 应用程序进行身份验证和授权

    rest - Twitter API *真的*是 RESTful 吗?

    spring - 如何在不维护jsessionid的情况下在Spring Boot中保护RESTful API