OIDC Google

https://github.com/spring-boot-tutorials/spring-oidc-google

Setup OIDC on Google

Register this application onto Google:

Set Redirect URI to:

  • http://localhost:8081/login/oauth2/code/google

Create Initial Code Base

  • Go to https://start.spring.io/

  • Add the following dependencies:

    • spring-boot-starter-oauth2-client

    • spring-boot-starter-web

  • Click Generate

Dependencies

Dependencies used in pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Properties

Add the following properties in src/main/resources/application.yaml:

server:
  port: 8081
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: 0987654321-somethinghere.apps.googleusercontent.com
            client-secret: GOCSPX-something-here

Configuration

Create new file src/main/java/com/example/OIDC/Google/DefaultConfiguration.java:

@Configuration
public class DefaultConfiguration {

    @Autowired
    private ClientRegistrationRepository clientRegistrationRepository;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        Set<String> googleScopes = new HashSet<>();
        googleScopes.add("https://www.googleapis.com/auth/userinfo.email");
        googleScopes.add("https://www.googleapis.com/auth/userinfo.profile");
        googleScopes.add("https://www.googleapis.com/auth/contacts.readonly");
        // additional scopes here: https://developers.google.com/identity/protocols/oauth2/scopes

        OidcUserService googleUserService = new OidcUserService();
        googleUserService.setAccessibleScopes(googleScopes);

        http
                .authorizeHttpRequests(authorizeRequests -> authorizeRequests
                        .requestMatchers("/home", "/").permitAll()
                        .anyRequest().authenticated())
                .oauth2Login(ol -> ol.userInfoEndpoint(config -> config.oidcUserService(googleUserService)))
                .logout(logout -> logout.logoutSuccessHandler(oidcLogoutSuccessHandler()));
        return http.build();
    }

    private LogoutSuccessHandler oidcLogoutSuccessHandler() {
        var oidcLogoutSuccessHandler = new OidcClientInitiatedLogoutSuccessHandler(this.clientRegistrationRepository);
        oidcLogoutSuccessHandler.setPostLogoutRedirectUri("http://localhost:8081/home");
        return oidcLogoutSuccessHandler;
    }
}

Controller

Create new file src/main/java/com/example/OIDC/Google/DefaultController.java:

@RestController
public class DefaultController {

    @GetMapping("/")
    public String home1() {
        return home();
    }

    @GetMapping("/home")
    public String home() {
        return "- http://localhost:8081/login\n" +
                "- http://localhost:8081/oidc-principal-1\n" +
                "- http://localhost:8081/logout";
    }

    /**
     * http://localhost:8081/oidc-principal-1
     * @param principal
     * @return
     */
    @GetMapping("/oidc-principal-1")
    public OidcUser getOidcUserPrincipal(@AuthenticationPrincipal OidcUser principal) {
        return principal;
    }

    /**
     * http://localhost:8081/oidc-principal-2
     * @return
     */
    @GetMapping("/oidc-principal-2")
    public OidcUser getOidcUserPrincipal2() {
        OidcUser principal = null;
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication.getPrincipal() instanceof OidcUser) {
             principal = ((OidcUser) authentication.getPrincipal());
        }
        return principal;
    }
}

Run Spring Application

Open terminal at project root and execute the following:

mvn spring-boot:run

Verify

Open the following links in a browser: