我想在不同的服务器上配置春季启动的授权和资源服务器,每个。 The tutorial不会没有解释究竟如何不同服务器上配置资源和授权服务器。
如果你的资源服务器是一个独立的应用程序,那么你必须确保你匹配认证服务器的功能,并提供ResourceServerTokenServices知道如何令牌正确解码。[这是什么意思,如何做到这一点?]
由于与DefaultTokenServices和选择通过TokenStore(后端存储或本地编码)大多表示。另一种方法是,其是一个Spring OAuth的功能,允许资源服务器以令牌通过授权服务器(/ OAuth的/ check_token)上的HTTP资源进行解码(不是规范的一部分)的RemoteTokenServices。 RemoteTokenServices很方便,如果没有流量的资源服务器体积巨大(每个请求必须与认证服务器进行验证),或者如果你能负担得起缓存结果。要使用你需要改变它的访问规则,揭露它的/的OAuth / check_token端点(默认为“denyAll()”)与授权服务器的AuthorizationServerSecurityConfigureAs,你可以经常使用。
正如我understad有一个建议的解决方案,资源服务器呼叫授权服务端点但上面引述的,这是可以做到仅如果没有在资源服务器的流量的体积庞大,但对于是否真正存在?
比方说,你有一个验证服务器,资源服务器和客户端应用。您可以设置一个公共JWT键以验证传入令牌。那是什么意思是你的用户给他的用户名和密码通过客户端应用到auth服务器获得有效令牌和此令牌是由身份验证服务器的公钥签名。然后,每一个客户端应用调用资源服务器需要提供签名令牌,你的资源服务器应用程序使用公钥来验证传入令牌,而不是调用Auth服务器每次的。
这个bean添加到您的资源服务器,你可以确保与单授权服务器多个资源API:
@Primary
@Bean
public RemoteTokenServices tokenService() {
RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setCheckTokenEndpointUrl(
"http://localhost:8080/spring-security-oauth-server/oauth/check_token");
tokenService.setClientId("fooClientIdPassword");
tokenService.setClientSecret("secret");
return tokenService;
}