Client OAuth2 et flux du code d’autorisation
Configurez le client OAuth2 pour obtenir et actualiser des jetons via l’octroi de code d’autorisation.
Client OAuth2 et flux du code d’autorisation est une leçon Spring Boot 4 Complete Guide gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Spring Boot 4 Complete Guide, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Spring Boot 4 Complete Guide comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
Why an OAuth2 Client?
When your Spring Boot app needs to act on behalf of a user against an external provider (Google, GitHub, Keycloak, Okta), it becomes an OAuth2 Client.
The client never sees the user's password. Instead it redirects the browser to the provider's authorization endpoint, the user logs in there, and the provider hands back an access_token (and optionally a refresh_token) that the client uses to call protected APIs.
- Authorization Code grant is the recommended browser-based flow.
- Spring Security's
spring-boot-starter-oauth2-clientimplements the entire dance for you.
Adding the Starter
Bring in the OAuth2 client support. In Spring Boot 4 this lives in spring-boot-starter-oauth2-client, which transitively pulls in spring-security-oauth2-client and the JOSE/JWT libraries needed for OIDC.
This Maven dependency is all you need to enable login-with-provider and token acquisition.
<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>Registering a Client via Properties
The fastest way to register a provider is through application.yml. Spring auto-binds these into a ClientRegistration.
- client-id / client-secret — issued by the provider.
- scope —
openid, profile, emailfor OIDC login. - authorization-grant-type —
authorization_code. - redirect-uri — the callback Spring exposes, usually
{baseUrl}/login/oauth2/code/{registrationId}.
spring:
security:
oauth2:
client:
registration:
keycloak:
client-id: spring-app
client-secret: "${KEYCLOAK_SECRET}"
authorization-grant-type: authorization_code
scope: openid, profile, email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
keycloak:
issuer-uri: https://auth.example.com/realms/demoIssuer Discovery vs. Manual Endpoints
For OIDC providers, setting issuer-uri lets Spring fetch the /.well-known/openid-configuration document at startup and auto-discover the authorization, token, JWK set, and userinfo endpoints.
For plain OAuth2 providers without discovery (e.g. classic GitHub), you must specify the endpoints yourself.
spring:
security:
oauth2:
client:
provider:
github:
authorization-uri: https://github.com/login/oauth/authorize
token-uri: https://github.com/login/oauth/access_token
user-info-uri: https://api.github.com/user
user-name-attribute: idEnabling oauth2Login in SecurityFilterChain
Wire the flow into your SecurityFilterChain. Calling oauth2Login() activates the full Authorization Code flow: unauthenticated requests get redirected to the provider, and the callback is handled automatically.
This is framework configuration, not a standalone program.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/error").permitAll()
.anyRequest().authenticated())
.oauth2Login(Customizer.withDefaults());
return http.build();
}
}The Authorization Code Flow Step by Step
Once oauth2Login() is active, here is what happens behind the scenes:
- 1. User hits a protected URL; Spring redirects the browser to
/oauth2/authorization/{registrationId}. - 2. Spring sends the browser to the provider's authorization endpoint with
response_type=code,state, and a PKCEcode_challenge. - 3. The user authenticates and consents at the provider.
- 4. The provider redirects back to
/login/oauth2/code/{registrationId}carrying a one-time authorization code. - 5. Spring exchanges that code (server-to-server) at the token endpoint for tokens.
The browser never sees the access token in step 5 — it's a back-channel call.
Accessing the Authorized Client and Token
After login, the access token is stored in an OAuth2AuthorizedClient. Inject it with the @RegisteredOAuth2AuthorizedClient argument resolver to read the token your app obtained.
This token is what you attach when calling the downstream resource server.
@RestController
public class ApiController {
@GetMapping("/token")
public String token(
@RegisteredOAuth2AuthorizedClient("keycloak")
OAuth2AuthorizedClient client) {
OAuth2AccessToken accessToken = client.getAccessToken();
return "type=" + accessToken.getTokenType().getValue()
+ " expires=" + accessToken.getExpiresAt();
}
}Calling APIs with RestClient and the Token
Spring Boot 4 favors RestClient. Configure it with the OAuth2ClientHttpRequestInterceptor so it automatically attaches the bearer token from the authorized client (and refreshes it when needed).
- The interceptor reads the registration id from the request attributes.
- No manual
Authorizationheader building required.
@Bean
RestClient restClient(OAuth2AuthorizedClientManager manager) {
OAuth2ClientHttpRequestInterceptor interceptor =
new OAuth2ClientHttpRequestInterceptor(manager);
interceptor.setPrincipalResolver(
new SecurityContextHolderPrincipalResolver());
return RestClient.builder()
.requestInterceptor(interceptor)
.build();
}The Authorized Client Manager
The OAuth2AuthorizedClientManager is the engine that obtains, caches, and refreshes tokens. You configure a provider chain describing which grants it supports.
Enabling refreshToken() here is what makes silent token renewal possible when an access token expires.
@Bean
OAuth2AuthorizedClientManager authorizedClientManager(
ClientRegistrationRepository clients,
OAuth2AuthorizedClientRepository authorizedClients) {
OAuth2AuthorizedClientProvider provider =
OAuth2AuthorizedClientProviderBuilder.builder()
.authorizationCode()
.refreshToken()
.build();
DefaultOAuth2AuthorizedClientManager manager =
new DefaultOAuth2AuthorizedClientManager(clients, authorizedClients);
manager.setAuthorizedClientProvider(provider);
return manager;
}How Refresh Works
To refresh tokens, two things must be true:
- The provider issued a
refresh_token— this typically requires theoffline_accessscope (Keycloak) or an offline grant. - The access token is expired (or within the configured clock skew) when the manager is next asked for the client.
When you call the API through a token-aware RestClient, the RefreshTokenOAuth2AuthorizedClientProvider detects expiry, posts grant_type=refresh_token to the token endpoint, and transparently swaps in the new access token. No user redirect is needed.
spring:
security:
oauth2:
client:
registration:
keycloak:
scope: openid, profile, offline_access
authorization-grant-type: authorization_codeModeling Token Expiry in Plain Java
The refresh decision boils down to comparing an expiry Instant against now, allowing for a clock-skew buffer. Here is that core logic as a complete standalone program you can run to see when a refresh would trigger.
import java.time.Duration;
import java.time.Instant;
public class Main {
static boolean shouldRefresh(Instant expiresAt, Instant now, Duration skew) {
return expiresAt == null || now.isAfter(expiresAt.minus(skew));
}
public static void main(String[] args) {
Instant now = Instant.parse("2026-01-01T10:00:00Z");
Duration skew = Duration.ofSeconds(60);
Instant valid = now.plusSeconds(300); // 5 min left
Instant nearly = now.plusSeconds(30); // inside skew window
Instant expired = now.minusSeconds(10);
System.out.println("valid -> refresh? " + shouldRefresh(valid, now, skew));
System.out.println("nearly -> refresh? " + shouldRefresh(nearly, now, skew));
System.out.println("expired-> refresh? " + shouldRefresh(expired, now, skew));
}
}Quick Check
You configured oauth2Login() and call a downstream API through a token-aware RestClient. The access token expires after 5 minutes, but users stay on the page for 30 minutes without re-authenticating. What single change most directly enables silent token renewal without sending the user back to the login page?
Recap
You configured Spring Boot 4 as an OAuth2 client driving the Authorization Code flow:
- Starter:
spring-boot-starter-oauth2-clientenables the flow. - Registration: client-id/secret,
authorization_codegrant, scopes, and aredirect-uri; OIDC providers auto-discover endpoints viaissuer-uri. - Activation:
oauth2Login()performs the redirect, PKCE code exchange, and callback handling. - Using tokens: inject
@RegisteredOAuth2AuthorizedClientor call APIs via a token-awareRestClientbacked by anOAuth2AuthorizedClientManager. - Refresh: request a refresh-capable scope and build the manager with
.refreshToken()so expired access tokens renew silently viagrant_type=refresh_token.
Questions Fréquemment Posées
La leçon « Client OAuth2 et flux du code d’autorisation » est-elle gratuite ?
Oui — le texte complet de « Client OAuth2 et flux du code d’autorisation » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Spring Boot 4 Complete Guide, passe à CoddyKit PRO. Le cours Spring Boot 4 Complete Guide comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Client OAuth2 et flux du code d’autorisation » ?
Configurez le client OAuth2 pour obtenir et actualiser des jetons via l’octroi de code d’autorisation. Tu pratiques Spring Boot 4 Complete Guide avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Spring Boot 4 Complete Guide ?
Aucune expérience préalable n'est requise. Spring Boot 4 Complete Guide sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Client OAuth2 et flux du code d’autorisation » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Spring Boot 4 Complete Guide ?
Oui. Chaque leçon Spring Boot 4 Complete Guide inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Validation des JWT du serveur de ressources et revendications
- Client OAuth2 et flux du code d’autorisation
- Sécurité des méthodes avec SpEL et votants personnalisés
- Introspection des jetons opaques et échange de jetons