RESTful身份验证意味着什么?它是如何工作的?我在谷歌上找不到好的概览。我唯一的理解是在URL中传递会话密钥(记住),但这可能是错误的。
当前回答
关于这个话题,这里的好心人已经说得够多了。但这是我的2美分。
有两种交互模式:
人对机器(HTM)机器对机器(MTM)
机器是共同的分母,表示为RESTAPI,参与者/客户端要么是人,要么是机器。
现在,在真正的RESTful架构中,无状态的概念意味着所有相关的应用程序状态(意味着客户端状态)都必须随每个请求一起提供。通过相关,这意味着RESTAPI处理请求和提供适当响应所需的一切。
当我们在人对机器应用程序的上下文中考虑这一点时,正如Skrebel在上面指出的那样,“基于浏览器”,这意味着在浏览器中运行的(web)应用程序将需要将其状态和相关信息及其向后端REST API发出的每个请求一起发送。
考虑一下:您有一个数据/信息平台公开的RESTAPI资产。也许您有一个自助BI平台来处理所有数据立方体。但您希望您的(人类)客户通过(1)web应用程序、(2)移动应用程序和(3)某些第三方应用程序访问此应用程序。最后,即使是MTM链也会导致HTM-right。因此,人类用户仍然处于信息链的顶端。
在前两个案例中,您有一个人机交互的案例,信息实际上是由人类用户使用的。在最后一种情况下,您有一个使用RESTAPI的机器程序。
身份验证的概念适用于所有领域。您将如何设计它,以便以统一、安全的方式访问REST API?在我看来,有两种方式:
途径1:
首先,没有登录。每个请求都执行登录客户端发送其标识参数+特定请求每个请求的参数REST API接收它们,转身,ping用户存储(无论是什么)并确认授权如果建立了身份验证,则为请求提供服务;否则,拒绝具有适当的HTTP状态代码对所有REST API中的每个请求重复上述步骤目录
路线-2:
客户端以身份验证请求开始登录REST API将处理所有此类请求它接受auth参数(API密钥、uid/pwd或任何您select),并根据用户存储(LDAP、AD或MySQL DB等)验证身份验证如果已验证,则创建一个身份验证令牌并将其交还给客户/呼叫方然后,调用者将此身份验证令牌+请求特定参数与对其他业务REST API的每个后续请求,直到注销或租约到期
显然,在Way-2中,RESTAPI需要一种方法来识别和信任令牌的有效性。Login API执行了身份验证,因此,目录中的其他REST API需要信任“代客密钥”。
当然,这意味着需要在RESTAPI之间存储和共享身份验证密钥/令牌。这个共享的、可信的令牌存储库可以是本地/联合的,允许其他组织的REST API相互信任。
但我跑题了。
关键是,需要维护和共享一个“状态”(关于客户端的身份验证状态),以便所有RESTAPI都能创建一个信任圈。如果我们不这样做,即Way-1,我们必须接受必须对任何/所有传入的请求执行身份验证。
执行身份验证是一个资源密集型过程。想象一下,针对每个传入的请求,对用户存储执行SQL查询,以检查uid/pwd匹配。或者,加密并执行哈希匹配(AWS风格)。在架构上,我怀疑每个RESTAPI都需要使用一个通用的后端登录服务来执行此操作。因为,如果你不这样做,那么你就会到处乱扔授权码。一团糟。
所以层数越多,延迟就越大。
现在,选择Way-1并向HTM申请。您的(人类)用户真的关心您是否必须在每个请求中发送uid/pwd/hash或其他内容吗?不,只要你不打扰她,每秒都会抛出auth/login页面。如果你这样做的话,祝你有客户。所以,你要做的是将登录信息存储在客户端的某个位置,在浏览器中,一开始就存储,并随每个请求一起发送。对于(人类)用户,她已经登录,并且“会话”可用。但事实上,她的每一个请求都经过了认证。
与路线2相同。你的(人类)用户永远不会注意到。所以没有造成伤害。
如果我们将Way-1应用于MTM怎么办?在这种情况下,由于它是一台机器,我们可以要求它在每次请求时都提交身份验证信息,从而让这个家伙见鬼去。没人在乎!在MTM上执行Way-2不会引起任何特殊反应;这是一台该死的机器。它可以不在乎!
所以,问题是什么适合你的需要。无国籍需要付出代价。付出代价,继续前进。如果你想成为一个纯粹主义者,那么也要为此付出代价,然后继续前进。
最终,哲学无关紧要。真正重要的是信息发现、展示和消费体验。如果人们喜欢你的API,你就做好了自己的工作。
其他回答
这当然不是关于“会话密钥”,因为它通常用于指在REST的所有约束条件下执行的无会话身份验证。每个请求都是自我描述的,携带足够的信息,可以在没有任何服务器端应用程序状态的情况下自行授权请求。
最简单的方法是从RFC 2617中的HTTP内置认证机制开始。
以我的理解来回答这个问题。。。
一种使用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或跟踪会话。
我还在学习——如果你发现我说的任何错误,请纠正我,如果你了解更多,请将其张贴在这里。谢谢
关于这个话题,这里的好心人已经说得够多了。但这是我的2美分。
有两种交互模式:
人对机器(HTM)机器对机器(MTM)
机器是共同的分母,表示为RESTAPI,参与者/客户端要么是人,要么是机器。
现在,在真正的RESTful架构中,无状态的概念意味着所有相关的应用程序状态(意味着客户端状态)都必须随每个请求一起提供。通过相关,这意味着RESTAPI处理请求和提供适当响应所需的一切。
当我们在人对机器应用程序的上下文中考虑这一点时,正如Skrebel在上面指出的那样,“基于浏览器”,这意味着在浏览器中运行的(web)应用程序将需要将其状态和相关信息及其向后端REST API发出的每个请求一起发送。
考虑一下:您有一个数据/信息平台公开的RESTAPI资产。也许您有一个自助BI平台来处理所有数据立方体。但您希望您的(人类)客户通过(1)web应用程序、(2)移动应用程序和(3)某些第三方应用程序访问此应用程序。最后,即使是MTM链也会导致HTM-right。因此,人类用户仍然处于信息链的顶端。
在前两个案例中,您有一个人机交互的案例,信息实际上是由人类用户使用的。在最后一种情况下,您有一个使用RESTAPI的机器程序。
身份验证的概念适用于所有领域。您将如何设计它,以便以统一、安全的方式访问REST API?在我看来,有两种方式:
途径1:
首先,没有登录。每个请求都执行登录客户端发送其标识参数+特定请求每个请求的参数REST API接收它们,转身,ping用户存储(无论是什么)并确认授权如果建立了身份验证,则为请求提供服务;否则,拒绝具有适当的HTTP状态代码对所有REST API中的每个请求重复上述步骤目录
路线-2:
客户端以身份验证请求开始登录REST API将处理所有此类请求它接受auth参数(API密钥、uid/pwd或任何您select),并根据用户存储(LDAP、AD或MySQL DB等)验证身份验证如果已验证,则创建一个身份验证令牌并将其交还给客户/呼叫方然后,调用者将此身份验证令牌+请求特定参数与对其他业务REST API的每个后续请求,直到注销或租约到期
显然,在Way-2中,RESTAPI需要一种方法来识别和信任令牌的有效性。Login API执行了身份验证,因此,目录中的其他REST API需要信任“代客密钥”。
当然,这意味着需要在RESTAPI之间存储和共享身份验证密钥/令牌。这个共享的、可信的令牌存储库可以是本地/联合的,允许其他组织的REST API相互信任。
但我跑题了。
关键是,需要维护和共享一个“状态”(关于客户端的身份验证状态),以便所有RESTAPI都能创建一个信任圈。如果我们不这样做,即Way-1,我们必须接受必须对任何/所有传入的请求执行身份验证。
执行身份验证是一个资源密集型过程。想象一下,针对每个传入的请求,对用户存储执行SQL查询,以检查uid/pwd匹配。或者,加密并执行哈希匹配(AWS风格)。在架构上,我怀疑每个RESTAPI都需要使用一个通用的后端登录服务来执行此操作。因为,如果你不这样做,那么你就会到处乱扔授权码。一团糟。
所以层数越多,延迟就越大。
现在,选择Way-1并向HTM申请。您的(人类)用户真的关心您是否必须在每个请求中发送uid/pwd/hash或其他内容吗?不,只要你不打扰她,每秒都会抛出auth/login页面。如果你这样做的话,祝你有客户。所以,你要做的是将登录信息存储在客户端的某个位置,在浏览器中,一开始就存储,并随每个请求一起发送。对于(人类)用户,她已经登录,并且“会话”可用。但事实上,她的每一个请求都经过了认证。
与路线2相同。你的(人类)用户永远不会注意到。所以没有造成伤害。
如果我们将Way-1应用于MTM怎么办?在这种情况下,由于它是一台机器,我们可以要求它在每次请求时都提交身份验证信息,从而让这个家伙见鬼去。没人在乎!在MTM上执行Way-2不会引起任何特殊反应;这是一台该死的机器。它可以不在乎!
所以,问题是什么适合你的需要。无国籍需要付出代价。付出代价,继续前进。如果你想成为一个纯粹主义者,那么也要为此付出代价,然后继续前进。
最终,哲学无关紧要。真正重要的是信息发现、展示和消费体验。如果人们喜欢你的API,你就做好了自己的工作。
老实说,我在这里看到了很好的答案,但让我有点困扰的是,当有人将整个无状态概念推向极端,使其变得教条化时。这让我想起了那些只想拥抱纯OO的Smalltalk老粉丝,如果某个东西不是对象,那么你就错了。放过我
RESTful方法应该让你的生活更轻松,减少会议的开销和成本,尽量遵循它,因为这是一件明智的事情,但一旦你遵循一个纪律(任何纪律/准则)到了极致,它不再提供其预期的好处,那么你就错了。当今一些最好的语言同时具备函数式编程和面向对象。
如果解决问题的最简单方法是将身份验证密钥存储在cookie中并通过HTTP标头发送,那么就这样做吧,不要滥用它。请记住,当会话变得沉重和庞大时,会话是不好的,如果所有会话都由一个包含密钥的短字符串组成,那么有什么大不了的?
我愿意接受评论中的更正,但我只是认为(到目前为止)避免在我们的服务器中保存一本大字典的哈希值,这没有什么意义。
我认为restful身份验证涉及将身份验证令牌作为请求中的参数传递。示例是api对apikey的使用。我认为使用cookie或http身份验证不合格。
推荐文章
- 跨REST微服务的事务?
- “刷新令牌”的目的是什么?
- 调用webrequest, POST参数
- 摘要认证和基本认证的区别是什么?
- 如何在Spring RestTemplate请求上设置“接受:”头?
- 什么是端点?
- 配置系统初始化失败
- REST API最佳实践:查询字符串中的参数vs请求体中的参数
- Java中SOAP和rest式web服务的主要区别
- 如何为Java创建REST客户端?
- file_get_contents(): SSL operation failed with code 1, failed to enable crypto
- 在Subversion中,我可以是我的登录名以外的用户吗?
- 在HttpClient和WebClient之间进行选择
- 执行没有实体主体的HTTP POST被认为是不好的做法吗?
- JavaScript/jQuery下载文件通过POST与JSON数据