前文 【Spring Security OAuth2】客户端授权模式(client credentials)~资源服务配置 我们设定 授权服务 和 资源服务 是两个单独的应用,在 资源服务 中使用RemoteTokenServices
对Token
进行校验。
从图中可以看出,ResourceServerTokenServices
接口有两个实现类(DefaultTokenServices
、RemoteTokenServices
),而DefaultTokenServices
类同时实现了AuthorizationServerTokenServices
、ResourceServerTokenServices
接口。
当 授权服务 和 资源服务 是两个单独的应用时,资源服务端使用RemoteTokenServices
校验Token
,而授权服务端使用DefaultTokenServices
校验Token
当 授权服务 和 资源服务 是同一个应用时,使用DefaultTokenServices
校验Token
ResourceServerTokenServices
接口定义了两个方法,一个是根据指定的Token
获取认证信息,另一个是根据指定的Token
获取完整的Token
详情。
在请求头中设置Authorization
参数
将客户端ID和客户端密钥以 : 间隔进行拼接,然后将拼接后的字符串使用 BASE64 编码与Basic
拼接,便可生成 Authorization 参数的值
设置完参数后像授权服务发送Token校验请求
通过AccessTokenConverter
接口的extractAuthentication
方法从请求结果中提取认证信息
AccessTokenConverter
接口有多个实现类,由于我们在配置资源服务时并未指定AccessTokenConverter
接口的实现类,故系统使用默认的实现类DefaultAccessTokenConverter
如果资源服务设置了resourceId且客户端详情中也设置了可访问的资源ID,则校验客户端详情中设置的可访问资源ID集合中是否包含当前资源ID
若资源服务端设置了clientDetailsService
则校验认证信息中可访问的范围是否包含客户端可访问范围
在 【Spring Security OAuth2】客户端授权模式(client credentials)~资源服务配置 一文中,我们曾在application.properties文件中设置两个属性
security.oauth2.client.clientid=app
security.oauth2.client.clientSecret=app
这两个值与 我们获取Token
时设置的值无关
调整application.properties文件中这两个属性为
security.oauth2.client.clientid=secret
security.oauth2.client.clientSecret=secret
当我们使用app
获取访问令牌并访问资源resourceA时,可以正常访问
当我们使用secret
获取访问令牌并访问资源resourceA时,无法访问
但属性文件中设置的那两个属性,必须在oauth_client_details表中存在