Spring Boot: autentificare OpenID Connect cu Spring Security

Aveți nevoie de trei valori din consola pentru dezvoltatori: ID-ul de client, secretul de client (doar pentru aplicațiile cu server web) și URI-ul de redirecționare înregistrat. Restul se află în documentul de discovery de la https://identity.dazr.eu/.well-known/openid-configuration.

Spring Boot (Spring Security)

Autentificarea OAuth 2.0 din Spring Security (Spring Boot 3, spring-boot-starter-oauth2-client) citește documentul de discovery. Două adăugiri: Spring așteaptă implicit tokenuri ID RS256, deci dați-i o decoder factory pentru ES256, iar PKCE este trimis doar pentru clienții publici, deci activați PKCE pentru aplicația de server web. Înregistrați URI-ul de redirecționare https://app.example.eu/login/oauth2/code/dazr.

# application.yml
spring:
  security:
    oauth2:
      client:
        registration:
          dazr:
            provider: dazr
            client-id: ${DAZR_CLIENT_ID}
            client-secret: ${DAZR_CLIENT_SECRET}
            client-authentication-method: client_secret_basic
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope: openid,profile,email
        provider:
          dazr:
            issuer-uri: https://identity.dazr.eu
            user-name-attribute: sub
// SecurityConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.client.oidc.authentication.OidcIdTokenDecoderFactory;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestCustomizers;
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
import org.springframework.security.oauth2.jwt.JwtDecoderFactory;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

  @Bean
  SecurityFilterChain security(HttpSecurity http, ClientRegistrationRepository clients) throws Exception {
    var resolver = new DefaultOAuth2AuthorizationRequestResolver(clients, "/oauth2/authorization");
    resolver.setAuthorizationRequestCustomizer(OAuth2AuthorizationRequestCustomizers.withPkce());
    http
      .authorizeHttpRequests(a -> a.requestMatchers("/", "/error").permitAll().anyRequest().authenticated())
      .oauth2Login(o -> o.authorizationEndpoint(e -> e.authorizationRequestResolver(resolver)));
    return http.build();
  }

  // Dazr Identity signs ID tokens with ES256.
  @Bean
  JwtDecoderFactory<ClientRegistration> idTokenDecoderFactory() {
    var factory = new OidcIdTokenDecoderFactory();
    factory.setJwsAlgorithmResolver(registration -> SignatureAlgorithm.ES256);
    return factory;
  }
}

Porniți autentificarea la /oauth2/authorization/dazr. Într-un controller, @AuthenticationPrincipal OidcUser user oferă user.getSubject(), adică sub de la Dazr. Pentru a accepta tokenuri de acces Dazr într-un resource server, setați spring.security.oauth2.resourceserver.jwt.issuer-uri la https://identity.dazr.eu și jws-algorithms la ES256 și verificați că aud este client ID-ul dumneavoastră.

Mai mult pentru dezvoltatori