我是 Spring Boot和Oauth 的新手,我正在我的系统上实现Oauth Security,我怀疑 JdbcTokenStore查询。
我在 JdbcTokenStore 代码中看到DEFAULT_ACCESS_TOKEN_SELECT_STATEMENT = "select token_id, token from oauth_access_token where token_id =?"
。
我尝试使用client_id1从oauth / token获取令牌,然后使用client_id2检查了令牌,最后我收到了成功的响应,因为它只是过滤了token_id。
我期待一个像“未找到令牌”或类似的错误。
此查询是否有此行为?
更新
我的授权服务器和 ResourceServer 已分隔,在我的 AuthorizationServer 上我从数据库获取ClientDetails并且我有两个条目:< / p>
在我的Web应用程序中,我使用第一个ClientDetails获取有效令牌:
$ curl seiafiscalizacao:seiafiscalizacao123@localhost:8080/seia-auth-server/oauth/token -d grant_type=password -d username=username -d password=pwd
在oauth_access_token上我得到了一个新的条目,将token_id与client_id相关联:
在我的 ResourceServer 上,我有一个带有这些配置的RemoteTokenServices(第二个ClientDetails):
@Bean
@Primary
public RemoteTokenServices tokenService() {
RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setCheckTokenEndpointUrl("http://localhost:8080/seia-auth-server/oauth/check_token");
tokenService.setClientId("seiafiscalizacao2");
tokenService.setClientSecret("seiafiscalizacao123");
return tokenService;
}
最后,当我尝试从 ResourceServer 获取任何资源时,即使使用不同的client_id,我也会获得成功响应:
当我从org.springframework.security.oauth2.provider.token.store
打开 JdbcTokenStore 代码时,我看到了private static final String DEFAULT_ACCESS_TOKEN_SELECT_STATEMENT = "select token_id, token from oauth_access_token where token_id = ?";
,并找出了为什么我取得了成功。
我没有收到任何错误或异常,但我想知道用不同的client_id检查我的令牌并获得成功。
就像我之前说过的那样,我是Oauth的新人,我不知道这是否是预期的。
要访问ResourceServer,我正在使用Firefox中的RESTClient
我的SpringBoot版本是1.5.10.RELEASE
我的应用服务器是Wildfly 10.1
到目前为止,我的项目分享起来非常复杂,但是如果你需要我可以用后面的东西做一些新的东西。
答案 0 :(得分:0)
OAuth2规范没有定义,请参阅RFC 6749:
<强> 10.3。访问令牌
[...]
此规范未提供资源服务器的任何方法,以确保授权服务器向给定客户端发出访问令牌。
因此,Spring Security OAuth2不会检查它。
此外,RemoteTokenServices
是一个Spring Security OAuth2功能,完全不受OAuth2规范的约束,请参阅OAuth 2 Developers Guide
另一种选择是
RemoteTokenServices
,它是Spring OAuth功能(不是规范的一部分),允许资源服务器通过授权服务器(/oauth/check_token
)上的HTTP资源解码令牌。