Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring oauth:为什么资源服务器正在授权而不是授权服务器_Java_Spring_Spring Security_Oauth_Spring Security Oauth2 - Fatal编程技术网

Java Spring oauth:为什么资源服务器正在授权而不是授权服务器

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",

在使用SpringOAuth框架时,我发现资源服务器向授权服务器发出了
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类型)。完成此操作后,将给出一个令牌

当用户/客户端出现在资源服务器上,想要使用服务时,他们必须提供令牌。现在,资源服务器有一个令牌,需要验证该令牌是否由授权服务器生成。有两种选择:

  • 令牌本身不包含任何信息。资源服务器调用授权服务器并询问令牌是否有效。授权服务器将响应令牌是有效的,并提供一些附加信息(用户/客户端、角色/范围等)
  • 令牌确实包含必要的信息(例如jwttokes)。这使资源服务器能够提取所需的信息,而无需联系授权服务器。在这种情况下,授权服务器已经对令牌进行了签名,资源服务器可以验证签名,以确保是自动化服务器发布了令牌
  • 目前,您正在使用第一个场景。您编写的每个资源服务器都必须验证令牌并提取其他信息。验证的方式取决于授权服务器

    第2部分:

    你的问题我不清楚。我假设您正在使用OAuth2
    授权码
    方案与非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_令牌终结点而不是现有的终结点,以获取额外的查询参数。