我正在尝试实现我的REST api,这是OAuth2流中移动应用程序使用的资源服务器。我有其他人制作的外部授权服务器。目前,我已经实现了在移动应用程序中获取访问令牌(我假设是OAuth2流中的客户端?),现在当我从客户端向资源服务器(REST api)进行调用时,我需要资源服务器从以下位置验证令牌:授权服务器,然后再完成对客户端的请求。我尝试查找各种Spring-security-OAuth2教程,并设法继续进行一些操作。这是我目前想出的:
@Configuration
@EnableResourceServer
public class SecurityConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/**").authenticated();
}
@Primary
@Bean
public RemoteTokenServices tokenService() {
RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setCheckTokenEndpointUrl(
end_point_url);
return tokenService;
}
}
当前,当授权服务器end_point_url
在请求标头中以http 200
的形式给出有效令牌时,仅返回Authorization: Bearer VALID_TOKEN
。现在,我在REST api中的路径是“安全的”,但是在向我的REST api发出请求时,只需传递标头Authorization: Bearer
且不传递任何令牌,也不会传递任何令牌,它将其视为已认证。我显然已经错过或不了解某些东西。我认为它根本不验证来自授权服务器的令牌。我真的不知道。关于我需要做什么的任何想法?
更新:
正如我在下面评论的那样,我一直在关注我的外部授权服务器日志以及我的spring rest应用程序日志。我发现,在这里介绍的这种配置下,spring应用程序未提取/使用来自客户端(移动应用程序)的授权令牌作为Authorization: Bearer VALID_TOKEN
,而是调用了授权标头为Authorization: Basic SOME_RANDOM_TOKEN
的服务器。为什么它会忽略而不使用移动应用程序(客户端)中带有Bearer
标签的令牌?
答案 0 :(得分:0)
好的,所以我找到了一种完全可以满足我需要的方法。我不完全确定这是正确的方法,但它确实可以实现我想要的功能。因此,基本上我没有像这样使用RemoteTokenServices
来使用UserInfoTokenServices
:
@Override
public void configure(final HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests().anyRequest().authenticated();
}
@Primary
@Bean
public UserInfoTokenServices tokenService() {
final UserInfoTokenServices tokenService = new UserInfoTokenServices(USER_INFO_ENDPOINT, "");
return tokenService;
}
通过用上面的示例替换我以前的配置,我的API现在会在对API的每一次请求中,向我的授权服务器发送请求,以使用给定的访问令牌获取用户信息。如果它收到用户信息,我们就是gucci,否则我们是未经授权的。希望这对某人有帮助!