【问题标题】:Spring REST api OAuth2 validating token from external authorization serverSpring REST api OAuth2 验证来自外部授权服务器的令牌
【发布时间】:2019-10-08 20:17:42
【问题描述】:

我正在尝试实现我的 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 仅在其在请求标头中给定一个有效令牌为Authorization: Bearer VALID_TOKEN 时返回http 200。现在,我在 REST api 中的路径是“安全的”,但只需要传递标头 Authorization: Bearer 并且在向我的 REST api 发出请求时根本没有令牌或任何令牌,它会将其视为经过身份验证。我显然错过了或不明白一些事情。我认为它根本没有从授权服务器验证令牌,或者..?老实说,我不知道..我需要做什么有什么想法吗?

更新:

正如我在下面评论的那样,我一直在关注我的外部授权服务器日志以及我的 Spring Rest 应用程序日志。我发现,通过我在这里展示的这种配置,spring 应用程序不会提取/使用来自客户端(移动应用程序)的授权令牌作为Authorization: Bearer VALID_TOKEN,而是使用以下方式调用授权服务器像Authorization: Basic SOME_RANDOM_TOKEN 这样的标题。为什么它忽略而不使用来自移动应用(客户端)的带有Bearer 标签的令牌?

【问题讨论】:

  • 您错过了几件事。我建议你在他们的参考指南中阅读更多关于 spring 安全工作的信息。本教程也可以为您提供更多信息。 baeldung.com/spring-security-oauth-jwt
  • 我一直在阅读该教程,但我只是不明白我真正需要的部分。基本上,我可以通过解析标头中的令牌并使用包含令牌并调用授权服务器并在响应不是 200 时抛出异常来实现我自己的从外部身份验证服务器验证令牌的版本。但是是否有正确的使用 spring-security-oauth2 功能“自动”执行此操作的方法是什么?
  • 这取决于,如果您只是使用基于令牌的身份验证(不是 jwt),您可以在 application.properties 中定义身份验证服务器为 docs.spring.io/spring-boot/docs/current/reference/htmlsingle/… 的另一个提示是定义 logging.level .org.springframework.security=DEBUG 在您的 application.properties 中,您可以在日志中准确了解 Spring Security 在做什么。
  • 我现在一直在关注我的授权服务器日志以及我的 Spring 应用程序日志。我注意到 spring 向授权服务器发出授权请求,但它现在没有正确使用标头。当它应该从标头设置为Authorization: Bearer $Valid_access_token 的客户端请求(移动应用程序)中获取访问令牌时,它会放置类似Authorization: basic $some_random_token 的内容。但由于某种原因,它没有从移动应用程序(客户端)中提取和使用它......

标签: java spring-boot spring-security-oauth2


【解决方案1】:

好的,所以我找到了一种方法来完全满足我的需要。我不完全确定这是正确的方法,但它完全符合我的要求。所以基本上我没有使用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,否则我们是未经授权的。希望这对某人有帮助!

【讨论】:

    猜你喜欢
    • 2022-08-21
    • 2020-02-22
    • 2020-06-30
    • 2014-07-02
    • 2019-05-27
    • 2020-04-08
    • 2017-07-30
    • 2015-03-31
    • 2022-10-23
    相关资源
    最近更新 更多