当前位置: 首页 > 知识库问答 >
问题:

为什么资源服务器必须知道Spring OAuth2中的client_id?

左丘成天
2023-03-14

我正在使用Spring Boot实现OAuth2授权。我已经有了授权服务器和资源服务器,现在我想使用client_credentials授予类型从资源服务器访问资源。

我对此有点困惑,因为在资源服务器中,我必须添加client\u idclient\u secret。但为什么资源服务器真的需要它呢?

据我所知,客户端应该使用客户端凭据从授权服务器获取他的访问令牌。然后将此访问令牌发送到资源服务器,而不使用任何客户端凭据。

那么,为什么资源服务器还需要一些客户端凭据呢?资源服务器和客户端是两个独立的实体,我不明白为什么资源服务器必须知道client_idclient_secret

为什么访问令牌不足以进行身份验证check_-tokenendpoint可以返回可以使用此令牌访问的资源列表,如果客户端拥有此令牌,这意味着他已经使用客户端凭据进行了身份验证以获取此令牌。

如果我想从多个不同的客户端访问此资源服务器,该怎么办?

资源服务器配置:

@Configuration
@RestController
@EnableWebSecurity
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .and()
            .httpBasic().disable();
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources)  {
        resources
            .resourceId("translate-service");
    }
}

资源服务器属性:

security.oauth2.resource.user-info-uri=http://localhost:8090/user
security.oauth2.resource.token-info-uri=http://localhost:8090/oauth/check_token
security.oauth2.client.client-id=XXXX
security.oauth2.client.client-secret=XXXX

如果我不设置客户端属性,Spring将记录警告:

检测到空客户端ID或客户端机密。需要身份验证的endpoint将以401错误拒绝请求。

和认证将无法工作。

也许我做错了什么,有什么解决方案不在资源服务器中提供client\u id

共有1个答案

季城
2023-03-14

如果使用远程令牌服务,则资源服务器也是授权服务器的附加客户端,请参阅OAuth 2开发人员指南:

另一种选择是RemoteTokenServices,它是Spring OAuth的一个功能(不属于规范的一部分),允许资源服务器通过授权服务器上的HTTP资源对令牌进行解码(/OAuth/check_token)<如果资源服务器中没有大量通信量(每个请求都必须通过授权服务器进行验证),或者如果您可以缓存结果,则代码>RemoteTokenServices非常方便。要使用/oauth/check_令牌endpoint,您需要在AuthorizationServerSecurityConfigure中更改其访问规则(默认为“denyAll()”),例如。

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED_CLIENT')").checkTokenAccess(
        "hasAuthority('ROLE_TRUSTED_CLIENT')");
}

在本例中,我们配置了/oauth/check_token终结点和/oauth/token_key终结点(因此可信资源可以获得JWT验证的公钥)。这两个终结点受到使用客户端凭据的HTTP Basic身份验证的保护。

和OAuth2引导:

2.4如何配置令牌信息endpoint

令牌信息终结点,有时也称为内省终结点,可能需要某种客户端身份验证,基本身份验证或承载身份验证。一般来说,SecurityContext中的承载令牌是不够的,因为它与用户绑定在一起。相反,您需要指定代表此客户端的凭据,如下所示:

spring:
  security:
    oauth2:
      client:
        clientId: client-id
        clientSecret: client-secret
      resource:
        tokenInfoUri: https://issuer/oauth2/check_token

默认情况下,这将使用基本身份验证,使用配置的凭据,对令牌信息endpoint进行身份验证。

 类似资料:
  • 服务B可以从Eureka服务器通过服务发现获得服务A的url和portno。服务B注册尤里卡服务器有什么意义?

  • 服务器推送的工作原理是在响应请求后立即发送js、css、图像等,而不是等待客户端接收html、解析它并请求资源,从而节省往返。但是,将js、css、图像、字体等推送给,而这些相同的文件在一分钟前获取时已经被客户端下载,这完全是对带宽的浪费,因为客户端已经拥有这些文件。 为每个请求保留状态服务器端似乎很昂贵,而且不可能这样做,因为HTTP是无状态的。大概,客户端会在后续访问中重新请求html,以查看

  • REST API如何保护自己免受不是由允许的OAuth访问令牌URL生成的访问令牌的攻击? 由允许的OAuth访问令牌URL生成的令牌 “授权:Bear MTqvlvbdm73SIsN2PEhsetOwEHW439N2” 黑客生成的令牌 “授权:熊CAqvlvbdm73SIsN2PEhsetowEHW439N2”

  • 主要内容:一 前情回顾,二 正式开始,三 总结一 前情回顾 上篇文章《做了几年开发,你知道自己的系统为什么要用消息中间件吗?》,给大家讲了讲消息中间件引入系统架构的作用,主要是解决哪些问题的。 其比较常见的实践场景是: 复杂系统的解耦 复杂链路的异步调用 瞬时高峰的削峰处理 二 正式开始 这篇文章给大家讲讲,如果你在系统架构里引入了消息中间件之后,会有哪些缺点? 1 系统可用性降低 首先是你的系统整体可用性绝对会降低,给你举个例子,我们就拿之

  • 问题内容: 我是球衣和Web服务的新手,我尝试运行一个简单的RESTful Web服务。我遵循了http://www.mkyong.com/webservices/jax-rs/jersey-hello-world- example/, 但是我的项目未使用maven,因此我下载了jersey.1.17.1.jar并将其包含到我的项目路径。 当我想调用该服务时,出现此错误: 这是堆栈跟踪: 这是我的

  • 我需要了解在我的项目范围内使用autheorizaion服务器的便利性。 我们正在实现我们的服务并将其部署到客户环境中。 客户基础结构已经提供了一种身份验证机制,以便对用户进行身份验证。 此机制拦截所有通信并将用户重定向到“登录”表单。 之后,用户被重定向到我们的服务,我们必须处理和消化它,并使用JWT令牌进行响应。 这是我感到迷茫的地方: 我在想: 使用Spring oauth2 向授权服务器请