我正在使用Spring Boot实现OAuth2授权。我已经有了授权服务器和资源服务器,现在我想使用client_credentials
授予类型从资源服务器访问资源。
我对此有点困惑,因为在资源服务器中,我必须添加client\u id
和client\u secret
。但为什么资源服务器真的需要它呢?
据我所知,客户端应该使用客户端凭据从授权服务器获取他的访问令牌。然后将此访问令牌发送到资源服务器,而不使用任何客户端凭据。
那么,为什么资源服务器还需要一些客户端凭据呢?资源服务器和客户端是两个独立的实体,我不明白为什么资源服务器必须知道client_id
和client_secret
。
为什么访问令牌不足以进行身份验证check_-token
endpoint可以返回可以使用此令牌访问的资源列表,如果客户端拥有此令牌,这意味着他已经使用客户端凭据进行了身份验证以获取此令牌。
如果我想从多个不同的客户端访问此资源服务器,该怎么办?
资源服务器配置:
@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
?
如果使用远程令牌服务
,则资源服务器也是授权服务器的附加客户端,请参阅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 向授权服务器请