我对用户如何在Web API上执行授权/身份验证的操作特别感兴趣。

身份验证cookie是否与REST原理兼容,为什么?

评论

静态身份验证的完全相同

REST Web服务的身份验证/访问控制的软件体系结构的可能副本

@JarrodRoberson我的理解是,在其他站点上回答,将使该问题不符合此处的重复条件

@JarrodRoberson基于每个站点的常见问题解答,我认为这个问题属于该站点,而不是Stack Overflow。我对有关RESTful体系结构这方面的设计方法论/理念和取舍感兴趣。堆栈溢出旨在解决实施问题,该站点更多有关设计方法和权衡问题。

我在这里同意@BrandonLinton,这个问题对于Stackoverflow来说太广泛了,它是关于体系结构和设计方法的问题。 OP需要最佳实践和模式,建议和技巧-不是特定的答案-因此未指定语言。因此,它属于这里。

#1 楼

理想的ReSTful服务允许客户端(可能不是浏览器中的客户端)在一个请求中执行任何所需的任务。因为这样做所需的完整状态由客户端而不是服务器保留。由于客户端可以完全控制状态,因此客户端可以自行创建状态(如果合法),并且只需与API对话即可“完成”。

要求cookie可以使这变得困难。对于除浏览器以外的客户端,与查询参数,简单的请求标头或请求主体相比,管理cookie是一个很大的麻烦。另一方面,在浏览器中,使用Cookie可以使很多事情变得简单。

因此,API可能首先在Authorization标头中查找所需的身份验证数据,因为这可能是非浏览器客户端更喜欢放置的地方,但是它是简化和简化基于浏览器的客户端,它也可能会检查服务器端登录的会话cookie,但前提是缺少常规的Authorization标头。

另一个示例可能是一个复杂的请求,通常需要设置许多参数。非交互式客户端将所有数据塞入一个请求不会有麻烦,但是基于HTML表单的界面可能更喜欢将请求分成多个页面(类似于一组“向导”页面),这样就不会向用户显示带有基于先前选择不适用的选项。所有中间页面都可以将值存储在客户端Cookie中,因此只有用户实际提交请求的最后一页才对服务器有任何影响。该API可以在请求正文中查找所需的属性,如果所需的参数不存在,则可以回过头来查看cookie。 >

比较而言,令牌更难实现,尤其是因为如果不将令牌存储在某个地方就无法轻易使令牌无效。嗯...您正在验证服务器端的cookie,对吗?仅仅因为您告诉浏览器在24小时后丢弃cookie并不意味着会。该cookie可由技术含量高的用户保存,并在其“过期”后很长一段时间内可以重复使用。 (Cookie或其他)。自包含的身份验证令牌有时称为Macaroon。在客户端和服务器之间传递此消息的方式(无论是通过cookie,作为额外的标头还是在请求实体本身中)完全独立于身份验证机制本身。

评论


+1,我绝对喜欢使用Authorization标头的实用性,但根据对客户最有效的方式“退回” cookie。

–布兰登·林顿
2012年3月26日14:17

我不同意“对于除了浏览器之外的客户,管理cookie会带来很大的不便...”。大多数HTTP客户端库都支持cookie,例如,.NET中的HttpClient可以使用cookie,而不会出现任何问题,您实际上不需要考虑它。相比之下,令牌更难实现,尤其是因为如果不将令牌存储在某处,就无法轻易使令牌无效。

–康拉德
18年8月31日在12:26



@Konrad只是因为在某些非浏览器客户中很容易,并不意味着在所有客户中都很容易。如果您只需要支持碰巧使用的特定客户端,那很好,但是我将问题解释为与面向公众的API有关。无论是curl还是wget,管理cookie都是很不方便的,您确实必须一堆考虑。我通过编辑答案回答了您的另一点。

–SingleNegationElimination
'18 Sep 1'在15:10

注意仅接受cookie会打开CSRF漏洞。另请参阅security.stackexchange.com/a/166798

– Michael Osl
18-10-18在12:37

#2 楼

是和否-取决于您的使用方式。

如果使用Cookie维护客户端,客户端,客户端以及客户端的客户端状态,它们就会变得宁静。

如果要将服务器状态存储到cookie中,则基本上只是将负载转移到客户端上-这并不麻烦。 />注意:


身份验证详细信息或“已登录”之类的东西
上次查看的页面或应用程序中的位置等。

不安:


存储会话信息

可靠性源于服务器的无状态性。客户端可以维护应用程序状态,并将其发送到服务器以说明它们的位置,以便服务器可以确定从那里去的位置。基本上,会话/状态需要历史数据并且取决于过去的请求,可以这么说,理想的情况下,宁静的应用程序不是(如果要拥有登录屏幕,则拥有100%纯净的宁静应用程序是不可行的)

评论


如果在客户端上存储“ isLoggedIn”标志,则可能完全不使用身份验证。

– tdammers
2012年3月23日在6:54



这绝对是有道理的-在客户端存储应用程序状态与REST不一致,但是用来表示自身的客户端信息似乎很好。

–布兰登·林顿
2012年3月26日14:15

我想补充一点,将身份验证信息放入Cookie可以消除跨站点请求伪造攻击的可能性。有更好的方法,我建议复制Amazon:docs.aws.amazon.com/AmazonS3/latest/API / ...

– Dobes Vandermeer
14年6月16日在18:11

@tdammers如果“ isLoggedIn”标志在JWT中怎么办?然后,只要JWT的发布和验证正确,那应该是安全的。

– Aaron J Spetner
17年8月26日在18:34

@AaronJSpetner:不要将JWT用于会话。

– tdammers
17年9月1日在17:59

#3 楼

一个可以使用cookie。 REST允许它们。

REST要求任何会话信息都存储在客户端,但是在进行身份验证时,出于安全原因,某些信息必须保留在服务器端。

从我的一篇博客文章中,人们普遍同意将身份验证数据视为与REST无关。因此,服务器可以将某些会话数据保留在自己的身边。