Spring授权服务器,RegistredClient和UserDetail有什么不同?

eoxn13cs  于 2022-09-21  发布在  Spring
关注(0)|答案(1)|浏览(273)

在他们的入门指南reference上,Spring授权服务器有一段代码,其中声明了两个Bean-UserDetailsService和RegistredClientRepository。我想玩玩从服务器取回一些代币。我试着用 Postman 。在授权选项卡中,我输入了指南中的值:

它的回答是:

于是,我尝试从RegistredClientRepository条目中输入客户端凭据:

而且它起作用了。

所以我的问题是:在这种情况下,UserDetail和RegistredClient都可用的目的是什么?

还有一个有点离题的问题:如果我为我的服务器之间的客户端凭据流动创建自己的授权服务器,那么每个服务器如何知道令牌属于合法服务器,而不是某个攻击者,如果有机会,攻击者只需使用所需的客户端ID进行注册?资源服务器如何实际验证令牌所有者是它信任的服务器?

ipakzgxi

ipakzgxi1#

一般来说,在OAuth2中,“客户端”是用户可以用来与某些服务交互的应用程序--例如,人们可以在手机上安装的应用程序或Web应用程序。

大多数OAuth2实现都有“作用域”(基本上定义了访问权限集)。客户端(客户端应用程序)注册了一些元数据(名称、作者等)、它们可能使用的一组作用域和一些提高安全性的细节--如“应用程序托管在哪里”(以“哪个重定向URI有效”的形式)、客户端ID和客户端机密。

根据选择的OAuth2流程,您的应用程序需要通过某种方式来证明该应用程序该应用程序--例如,通过拥有客户端ID和重定向URI的有效组合,或者在将“代码”交换为“令牌”时,使用其客户端ID作为用户名和客户端秘密作为密码来执行HTTP基本身份验证。

所有这一切都是关于客户的,现在是关于用户的:他们是你所期望的,服务的用户-就像你和我一样,也是stackoverflow网站的用户
还有一个有点离题的问题:如果我为我的服务器之间的客户端凭据流动创建自己的授权服务器,那么每个服务器如何知道令牌属于合法服务器,而不是某个攻击者,如果有机会,攻击者只需使用所需的客户端ID进行注册?资源服务器如何实际验证令牌所有者是它信任的服务器?

为此,您可以使用某种形式的签名令牌(例如JWT),或者将每个用户当前有效的令牌存储在所有服务器都可以访问的数据库中--两者都有正反两种属性,数据库中的令牌更容易撤销,而签名令牌不要求您在数据库中存储任何状态(这在大型分布式系统中可能很昂贵)

更新操作实际上想要进行服务器到服务器的身份验证,请参阅下面的评论

服务器到服务器的身份验证通常可以在没有任何额外的身份验证服务器的情况下很好地工作,在这种情况下,您的参与方不是很动态-就像当您始终拥有“这三个服务器”并且它们不经常来往时。

在这种情况下,使用简单的令牌可能比使用OAuth2堆栈更好、更容易。每个服务器在其配置文件中可能只有一个随机生成的字符串列表,让我们将其称为“有效令牌集”,并且还知道在与特定的其他服务器通信时发送哪个令牌。当请求进入时,服务器检查给定的令牌是否在其有效令牌集中-Done。

相关问题