使用Spring Boot应用程序作为资源服务器,并使用google oauth2作为授权服务器

时间:2018-11-14 06:34:22

标签: angular spring-boot google-oauth

我有一个Web应用程序,使用angular6进行前端操作,并使用spring boot进行其余的api。

我的角度应用程序正在localhost:4200上运行,并且能够通过Google成功进行身份验证,并且可以看到authToken和idToken。 (我使用了angularx-social-login插件在angular中)

现在,我想使用此身份验证令牌来保护运行在localhost:8080的spring boot api服务器的安全。

我正在尝试类似于(image sourcepicture 这里的客户端是我的角度应用程序,资源服务器是spring boot应用程序,授权服务器是google

我尝试使用EnableResourceServer批注和许多其他方法,但是似乎没有任何效果。它总是通过签入内存令牌存储库来给我无效的令牌,甚至不尝试与Google验证正确的令牌。

我在spring app和angular app中对oauth2配置使用相同的client-id和secret。

如何让Spring Boot应用程序针对每个请求通过Google验证令牌?

我的application.properties

server.servlet.context-path=/api

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:file:~/h2/testdb

logging.level.org.springframework.web=TRACE
logging.level.org.springframework.security=TRACE
logging.level.org.hibernate=TRACE

security.oauth2.resource.filter-order = 3
spring.security.oauth2.client.registration.google.client-id=#google-client-id
spring.security.oauth2.client.registration.google.client-secret=#google-client-secret    
security.oauth2.resource.user-info-uri= https://www.googleapis.com/oauth2/v3/userinfo # URI of the user endpoint.

这是我的资源服务器配置类

@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {

    private static final String RESOURCE_ID = "rest_api";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID).stateless(false);
    }
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .requestMatcher(new RequestHeaderRequestMatcher("Authorization"))
                .authorizeRequests().anyRequest().fullyAuthenticated();
    }

    @EnableGlobalMethodSecurity(prePostEnabled = true)
    protected static class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration {
        @Override
        protected MethodSecurityExpressionHandler createExpressionHandler() {
            return new OAuth2MethodSecurityExpressionHandler();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

希望您已经找到了解决方案。否则,请看看此article

附带说明:您正在声明资源为有状态

resources.resourceId(RESOURCE_ID).stateless(false);

您是否尝试过无状态使用它?

resources.resourceId(RESOURCE_ID).stateless(true);