Java Spring oauth:为什么资源服务器正在授权而不是授权服务器
在使用SpringOAuth框架时,我发现资源服务器向授权服务器发出了Java Spring oauth:为什么资源服务器正在授权而不是授权服务器,java,spring,spring-security,oauth,spring-security-oauth2,Java,Spring,Spring Security,Oauth,Spring Security Oauth2,在使用SpringOAuth框架时,我发现资源服务器向授权服务器发出了check_-token?token=T_-O_-K_-E_-N请求,而授权服务器只是返回具有如下权限的checkTokenEndpointMap { "exp": 1511471427, "user_name": "idvelu", "authorities": [ "FUNCTION_GET_USERS", "FUNCTION_AUTHORITY_1",
check_-token?token=T_-O_-K_-E_-N
请求,而授权服务器只是返回具有如下权限的checkTokenEndpointMap
{
"exp": 1511471427,
"user_name": "idvelu",
"authorities": [
"FUNCTION_GET_USERS",
"FUNCTION_AUTHORITY_1",
"FUNCTION_AUTHORITY_2",
"FUNCTION_AUTHORITY_3",
"FUNCTION_AUTHORITY_4",
"FUNCTION_AUTHORITY_5",
"FUNCTION_AUTHORITY_6",
"FUNCTION_AUTHORITY_7",
],
"client_id": "c1",
"scope": [
"read",
"write"
]
}
只需使用oauth服务和资源服务在两台不同的机器/jvm中运行,就可以看到这一点
我认为现在资源服务器必须根据ResourceServerConfiguration::configure(HttpSecurity)
中配置的有效权限对请求进行授权
@Override
public void configure(HttpSecurity http) throws Exception {
http.anonymous().disable().requestMatchers().antMatchers("/**").and().authorizeRequests()
.antMatchers(HttpMethod.GET, "/myproject/users").hasAnyAuthority("FUNCTION_GET_USERS")
.antMatchers(HttpMethod.POST, "/myproject/users").hasAnyAuthority("FUNCTION_POST_NEW_USER")
.anyRequest().denyAll()
.and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
}
在这种情况下,授权服务器可以将所有数百个用户权限返回给资源服务器。相反,为什么授权服务器本身不能将授权所需的少数权限作为查询参数检查令牌?令牌=T\u O\u K\u E\u N&authorities=FUNCTION\u GET\u USERS,FUNCTION\u AUTHORITY\u 2,…
从资源服务器获取,并通过数据库根据用户的功能进行验证 最后,我的问题是;我有不同的服务,比如java、node.js、NGINX。。。所有这些都必须针对一个spring授权服务器验证其身份验证和授权。由于上述问题,我的所有服务都必须实现授权(资源服务器)部分。指将用户的所有权限与API访问权限进行比较
Java方面这一比较适用于spring资源服务器实现。但所有其他非java(资源)服务都需要授权/resourceServer实现。相反,如果我的spring授权服务器接受授权并进行验证,那么我的问题将作为单点授权/比较实现得到解决。我只需要将其作为支票代币的一部分传递。
如何在接受授权的同时实现这个新的check_令牌端点?授权服务器负责验证用户/客户端(取决于您使用的oauth类型)。完成此操作后,将给出一个令牌 当用户/客户端出现在资源服务器上,想要使用服务时,他们必须提供令牌。现在,资源服务器有一个令牌,需要验证该令牌是否由授权服务器生成。有两种选择:
授权码
方案与非JWT令牌
在这种情况下,您有一个仅负责身份验证的授权服务器、一个公开某些服务的资源服务器和一个使用资源服务器的客户机
如果我没有弄错的话,您有不同的资源服务器(api)
您没有共享授权服务器配置,但通常使用@EnableAuthorizationServer
。这将创建一个端点/oauth/check\u标记。默认情况下,此端点不可访问。您需要这样做:
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
oauthServer.checkTokenAccess("permitAll()"); // authenticated is better
}
您可以使用此端点验证令牌
所有这些都在本文中描述
第三部分:
在授权服务器上,您可以创建如下端点:
@RequestMapping("/user")
public Principal user(Principal principal) {
if(principal instanceof OAuth2Authentication) {
return (OAuth2Authentication) principal;
} else {
return principal;
}
}
您可以根据需要修改它。问题有点不清楚。请您进一步澄清确切的问题好吗?@AtaurRahmanMunna为什么在资源服务器上进行请求授权?在这里,授权服务器只是返回权限列表,而不是执行授权?您希望访问受保护的资源,在提供该资源之前,资源服务器必须验证您的身份,即您拥有有效的令牌。在这里,授权服务器只授权您的用户名和密码,然后再给您一个令牌。@AtaurRahmanMunna谢谢!那么它不是授权服务器;它应该是身份验证服务器。。由于提供令牌不需要授权,只需进行身份验证(验证凭据…),但在提供令牌之前,您的用户名和密码也会经过验证,如果用户名和密码匹配,则生成访问令牌。这也是身份验证的一部分。谢谢!plusOne,但我知道oauth是如何工作的。我想要不同的方式。我已更新我的问题。请更新/添加答案,不要删除现有答案。它也很有用。谢谢!!我使用的是SpringOuath和资源服务器,基于简单访问令牌(非jwt)。只希望资源服务器上的角色/函数比较部分位于auth服务器本身。这可能不在oauth范围内。是的,我支持带有标准/oauth/check_令牌的@EnableAuthorizationServer;但是期望一个新的check_令牌终结点而不是现有的终结点,以获取额外的查询参数。