gpt4 book ai didi

java - Spring oauth : Why resource server is authorising instead of authorisation server

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:03 24 4
gpt4 key购买 nike

我在使用 spring oauth 框架时发现的是资源服务器向授权服务器发出 check_token?token=T_O_K_E_N 请求,而授权服务器只是返回 CheckTokenEndPoint 映射,其权限如下所示。

{
"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());
}

在这种情况下,授权服务器可能会将数百个用户权限全部返回给资源服务器。相反,为什么授权服务器本身不能将授权所需的少量权限作为查询参数
check_token?token=T_O_K_E_N&authorities=FUNCTION_GET_USERS,FUNCTION_AUTHORITY_2,..
来自资源服务器并通过数据库根据用户的功能对其进行验证?

最后我的问题是;我有不同的服务,如 java、node.js、NGINX……所有这些都必须针对一个 spring 授权服务器验证其身份验证和授权。由于上述问题,我的所有服务都必须实现授权(资源服务器)部分。意味着将用户的所有权限与 API 访问权限进行比较。
Java 方面这个比较与 spring 资源服务器实现很好。但是所有其他非 Java(资源)服务都需要授权/资源服务器实现。相反,如果我的 spring 授权服务器接受权限并进行验证,那么我的问题将作为单点授权/比较实现得到解决。我只需要将它作为 check_token 的一部分传递。

如何实现这个新的 check_token 端点并接受授权?

最佳答案

授权服务器负责对用户/客户端进行身份验证(取决于您使用的 oauth 类型)。完成后,将给出一个 token 。

当用户/客户端向资源服务器展示自己并希望使用服务时,他们必须提供 token 。现在资源服务器有了一个 token ,需要验证这个 token 是由授权服务器生成的。有两种选择:

  1. token 本身不包含任何信息。资源服务器调用授权服务器并询问 token 是否有效。授权服务器将响应 token 有效并提供一些附加信息(用户/客户端、角色/范围等)。
  2. token 确实包含必要的信息(例如 JWT token )。这使资源服务器能够在不联系授权服务器的情况下提取所需的信息。在这种情况下,授权服务器已签署 token ,资源服务器可以验证签名以确保是授权服务器发布了 token 。

目前,您正在使用第一个场景。您编写的每个资源服务器都必须验证 token 并提取其他信息。如何进行验证取决于授权服务器。

第二部分:

你的问题我不是很清楚。我假设您使用的是带有非 JWT token 的 OAuth2 authorization code 方案?

在这种情况下,您有一个仅负责身份验证的授权服务器、一个公开某些服务的资源服务器和一个使用资源服务器的客户端。

如果我没记错的话,你们有不同的资源服务器 (api)?

您没有共享您的授权服务器配置,但通常您使用 @EnableAuthorizationServer。这将创建一个端点 /oauth/check_token。默认情况下,此端点不可访问。你需要做这样的事情:

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
oauthServer.checkTokenAccess("permitAll()"); // authenticated is better
}

您可以使用此端点来验证 token 。

所有这些都在 oauth2 developer guide 中进行了描述.

第三部分:

在授权服务器上,您可以像这样创建一个端点:

@RequestMapping("/user")
public Principal user(Principal principal) {

if(principal instanceof OAuth2Authentication) {
return (OAuth2Authentication) principal;
} else {
return principal;
}
}

您可以根据需要修改它。

关于java - Spring oauth : Why resource server is authorising instead of authorisation server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47463476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com