RESTful身份验证意味着什么?它是如何工作的?我在谷歌上找不到好的概览。我唯一的理解是在URL中传递会话密钥(记住),但这可能是错误的。
当前回答
以我的理解来回答这个问题。。。
一种使用REST的身份验证系统,因此您不需要实际跟踪或管理系统中的用户。这是通过使用HTTP方法POST、GET、PUT、DELETE完成的。我们采用这4种方法,并将它们视为数据库交互的CREATE、READ、UPDATE、DELETE(但在web上,我们使用POST和GET,因为这是锚标记当前支持的)。因此,将POST和GET视为我们的CREATE/READ/UPDATE/DELETE(CRUD),然后我们就可以在web应用程序中设计路由,从而推断出我们正在实现的CRUD操作。
例如,在RubyonRails应用程序中,我们可以构建我们的web应用程序,以便如果登录的用户访问http://store.com/account/logout则该页面的GET可以被视为用户试图注销。在我们的rails控制器中,我们将在中构建一个操作,将用户注销并将其发送回主页。
登录页面上的GET将生成一个表单。登录页上的POST将被视为登录尝试,并获取POST数据并使用它进行登录。
对我来说,这是一种使用映射到其数据库含义的HTTP方法的实践,然后构建一个身份验证系统,您不需要传递任何会话id或跟踪会话。
我还在学习——如果你发现我说的任何错误,请纠正我,如果你了解更多,请将其张贴在这里。谢谢
其他回答
我怀疑那些热情高喊“HTTP认证”的人是否曾尝试过用REST制作基于浏览器的应用程序(而不是机器对机器的web服务)(无意冒犯-我只是认为他们从未面临过复杂的问题)。
我在RESTful服务上使用HTTP身份验证时发现的问题是:
用户通常会收到一个难看的浏览器制作的登录框,这对用户非常不友好。您不能添加密码检索、帮助框等。注销或以其他名称登录是一个问题-浏览器将一直向站点发送身份验证信息,直到您关闭窗口超时很困难
这里有一篇非常有见地的文章,逐点解决了这些问题,但这导致了许多特定于浏览器的javascript黑客、变通方法等。因此,它也不向前兼容,因此在发布新浏览器时需要不断维护。我不认为这是一个干净清晰的设计,而且我觉得这是一项额外的工作,很头疼,因为这样我才能热情地向朋友展示我的REST徽章。
我认为饼干是解决方案。但是等等,饼干是邪恶的,不是吗?不,他们不是,饼干经常被使用的方式是邪恶的。cookie本身只是一条客户端信息,就像您浏览时浏览器会跟踪的HTTP身份验证信息一样。这段客户端信息在每次请求时都会被发送到服务器,就像HTTP身份验证信息一样。从概念上讲,唯一的区别是,这段客户端状态的内容可以由服务器作为其响应的一部分来确定。
通过使用以下规则使会话成为RESTful资源:
会话将密钥映射到用户id(可能还有超时的最后一个操作时间戳)如果会话存在,则意味着密钥有效。登录意味着发布到/会话,新密钥设置为cookie注销意味着删除/会话/{key}(要记住,我们是一个浏览器,HTML5还有很长的路要走)通过在每次请求时将密钥作为cookie发送并检查会话是否存在和有效来完成身份验证
现在,与HTTP身份验证的唯一区别是,身份验证密钥由服务器生成,并发送给客户端,客户端继续发送该密钥,而不是客户端根据输入的凭据计算该密钥。
converter42补充道,当使用https(我们应该这样做)时,cookie必须设置其安全标志,这样身份验证信息就不会通过非安全连接发送。说得好,我自己都没看到。
我觉得这是一个足够好的解决方案,但我必须承认,我还不够安全专家来识别这个方案中的潜在漏洞-我所知道的是,数百个非RESTful web应用程序使用基本相同的登录协议(PHP中的$_SESSION,Java EE中的HttpSession等),就像接受语言可以用于访问翻译资源等。我觉得这是一样的,但也许其他人不是这样?你们觉得呢,伙计们?
以我的理解来回答这个问题。。。
一种使用REST的身份验证系统,因此您不需要实际跟踪或管理系统中的用户。这是通过使用HTTP方法POST、GET、PUT、DELETE完成的。我们采用这4种方法,并将它们视为数据库交互的CREATE、READ、UPDATE、DELETE(但在web上,我们使用POST和GET,因为这是锚标记当前支持的)。因此,将POST和GET视为我们的CREATE/READ/UPDATE/DELETE(CRUD),然后我们就可以在web应用程序中设计路由,从而推断出我们正在实现的CRUD操作。
例如,在RubyonRails应用程序中,我们可以构建我们的web应用程序,以便如果登录的用户访问http://store.com/account/logout则该页面的GET可以被视为用户试图注销。在我们的rails控制器中,我们将在中构建一个操作,将用户注销并将其发送回主页。
登录页面上的GET将生成一个表单。登录页上的POST将被视为登录尝试,并获取POST数据并使用它进行登录。
对我来说,这是一种使用映射到其数据库含义的HTTP方法的实践,然后构建一个身份验证系统,您不需要传递任何会话id或跟踪会话。
我还在学习——如果你发现我说的任何错误,请纠正我,如果你了解更多,请将其张贴在这里。谢谢
用于保护任何web应用程序的有效提示
如果你想保护你的应用程序,那么你应该首先使用HTTPS而不是HTTP,这样可以确保你和用户之间建立一个安全的通道,防止嗅探来回发送给用户的数据,并有助于对交换的数据保密。
您可以使用JWT(JSON Web令牌)来保护RESTful API,与服务器端会话相比,这有很多好处,好处主要是:
1-更具可扩展性,因为您的API服务器不必为每个用户维护会话(当您有多个会话时,这可能是一个很大的负担)
2-JWT是独立的,具有定义用户角色的声明,例如,他可以访问的内容,并在日期和到期日发布(之后JWT将无效)
3-更易于跨负载平衡器处理&如果您有多个API服务器,因为您不必共享会话数据,也不必配置服务器将会话路由到同一服务器,只要JWT请求命中任何服务器,就可以对其进行身份验证和授权
4-减少了数据库的压力,也不必为每个请求不断存储和检索会话id和数据
5-如果您使用强密钥签署JWT,JWT不会被篡改,因此您可以信任随请求发送的JWT中的声明,而无需检查用户会话&无论他是否获得授权,您只需检查JWT,然后您就可以知道该用户可以做什么。
许多库提供了在大多数编程语言中创建和验证JWT的简单方法,例如:在node.js中,最流行的是jsonwebtoken
由于REST API通常旨在使服务器保持无状态,因此JWT与这一概念更为兼容,因为每个请求都使用自包含的授权令牌(JWT)发送,而服务器无需跟踪用户会话,而会话使服务器保持有状态,从而记住用户及其角色,然而,会话也被广泛使用并有其优点,如果需要,可以搜索。
需要注意的一点是,您必须使用HTTPS将JWT安全地交付给客户机,并将其保存在安全的地方(例如,本地存储)。
您可以通过此链接了解有关JWT的更多信息
首先也是最重要的,RESTful web服务是无状态的(或者换句话说,无会话的)。因此,RESTful服务没有也不应该包含会话或cookie的概念。在RESTful服务中进行身份验证或授权的方法是使用RFC 2616 HTTP规范中定义的HTTP授权头。每个请求都应该包含HTTP授权头,并且请求应该通过HTTPs(SSL)连接发送。这是在HTTPRESTful web服务中进行身份验证和验证请求授权的正确方法。我已经为Cisco Systems的Cisco PRIME Performance Manager应用程序实现了RESTful web服务。作为web服务的一部分,我还实现了身份验证/授权。
老实说,我在这里看到了很好的答案,但让我有点困扰的是,当有人将整个无状态概念推向极端,使其变得教条化时。这让我想起了那些只想拥抱纯OO的Smalltalk老粉丝,如果某个东西不是对象,那么你就错了。放过我
RESTful方法应该让你的生活更轻松,减少会议的开销和成本,尽量遵循它,因为这是一件明智的事情,但一旦你遵循一个纪律(任何纪律/准则)到了极致,它不再提供其预期的好处,那么你就错了。当今一些最好的语言同时具备函数式编程和面向对象。
如果解决问题的最简单方法是将身份验证密钥存储在cookie中并通过HTTP标头发送,那么就这样做吧,不要滥用它。请记住,当会话变得沉重和庞大时,会话是不好的,如果所有会话都由一个包含密钥的短字符串组成,那么有什么大不了的?
我愿意接受评论中的更正,但我只是认为(到目前为止)避免在我们的服务器中保存一本大字典的哈希值,这没有什么意义。
推荐文章
- 如何POST表单数据与Spring RestTemplate?
- Restful API服务
- 在用nodejs和express创建的REST API中设置响应状态和JSON内容的正确方法
- 如何POST JSON数据与PHP卷曲?
- 为跨源请求设置cookie
- REST身份验证方案的安全性
- 如何在package.json中使用“main”参数?
- 如何在postgresql中创建数据库用户?
- 跨REST微服务的事务?
- “刷新令牌”的目的是什么?
- 调用webrequest, POST参数
- 摘要认证和基本认证的区别是什么?
- 如何在Spring RestTemplate请求上设置“接受:”头?
- 什么是端点?
- 配置系统初始化失败