2222import org .springframework .security .core .Authentication ;
2323import org .springframework .security .core .AuthenticationException ;
2424import org .springframework .security .core .GrantedAuthority ;
25+ import org .springframework .security .oauth2 .core .AuthorizationGrantType ;
26+ import org .springframework .security .oauth2 .core .ClientAuthenticationMethod ;
2527import org .springframework .security .oauth2 .core .OAuth2RefreshToken ;
2628import org .springframework .security .oauth2 .core .OAuth2Token ;
29+ import org .springframework .security .oauth2 .core .oidc .OidcScopes ;
2730import org .springframework .security .oauth2 .jwt .NimbusJwtEncoder ;
2831import org .springframework .security .oauth2 .server .authorization .client .JdbcRegisteredClientRepository ;
32+ import org .springframework .security .oauth2 .server .authorization .client .RegisteredClient ;
2933import org .springframework .security .oauth2 .server .authorization .client .RegisteredClientRepository ;
3034import org .springframework .security .oauth2 .server .authorization .config .annotation .web .configurers .OAuth2AuthorizationServerConfigurer ;
3135import org .springframework .security .oauth2 .server .authorization .settings .AuthorizationServerSettings ;
36+ import org .springframework .security .oauth2 .server .authorization .settings .ClientSettings ;
37+ import org .springframework .security .oauth2 .server .authorization .settings .TokenSettings ;
3238import org .springframework .security .oauth2 .server .authorization .token .*;
3339import org .springframework .security .web .SecurityFilterChain ;
3440import org .springframework .security .web .authentication .AuthenticationSuccessHandler ;
4753import jakarta .servlet .http .HttpServletRequest ;
4854import jakarta .servlet .http .HttpServletResponse ;
4955import java .io .IOException ;
50- import java .util .Arrays ;
51- import java .util .List ;
52- import java .util .Map ;
56+ import java .time .Duration ;
57+ import java .util .*;
5358import java .util .stream .Collectors ;
5459
5560import static com .google .common .net .HttpHeaders .X_REQUESTED_WITH ;
@@ -256,7 +261,48 @@ public OAuth2TokenCustomizer<JwtEncodingContext> customizer() {
256261
257262 @ Bean
258263 public RegisteredClientRepository registeredClientRepository (JdbcTemplate jdbcTemplate ) {
259- return new JdbcRegisteredClientRepository (jdbcTemplate );
264+ JdbcRegisteredClientRepository repository = new JdbcRegisteredClientRepository (jdbcTemplate );
265+
266+ // Check if mobile client exists, if not create it
267+ try {
268+ RegisteredClient existingClient = repository .findByClientId ("mobile-app-client" );
269+ if (existingClient == null ) {
270+ RegisteredClient mobileClient = RegisteredClient .withId (UUID .randomUUID ().toString ())
271+ .clientId ("mobile-app-client" )
272+ .clientName ("DIGI CRG Mobile App" )
273+ // No client secret for public mobile clients
274+ .clientAuthenticationMethod (ClientAuthenticationMethod .NONE )
275+ // Authorization code flow with refresh token
276+ .authorizationGrantType (AuthorizationGrantType .AUTHORIZATION_CODE )
277+ .authorizationGrantType (AuthorizationGrantType .REFRESH_TOKEN )
278+ // Mobile app redirect URI
279+ .redirectUri ("com.digiservices.digicrg://oauth2redirect" )
280+ .postLogoutRedirectUri ("com.digiservices.digicrg://oauth2redirect" )
281+ // Required scopes
282+ .scope (OidcScopes .OPENID )
283+ .scope (OidcScopes .PROFILE )
284+ .scope (OidcScopes .EMAIL )
285+ // Client settings - REQUIRE PKCE for mobile apps
286+ .clientSettings (ClientSettings .builder ()
287+ .requireProofKey (true ) // CRITICAL: Require PKCE for security
288+ .requireAuthorizationConsent (false )
289+ .build ())
290+ // Token settings
291+ .tokenSettings (TokenSettings .builder ()
292+ .accessTokenTimeToLive (Duration .ofHours (1 ))
293+ .refreshTokenTimeToLive (Duration .ofDays (30 ))
294+ .reuseRefreshTokens (false )
295+ .build ())
296+ .build ();
297+
298+ repository .save (mobileClient );
299+ log .info ("Mobile client registered successfully" );
300+ }
301+ } catch (Exception e ) {
302+ log .error ("Error checking/creating mobile client: {}" , e .getMessage ());
303+ }
304+
305+ return repository ;
260306 }
261307
262308 @ Bean
@@ -269,7 +315,10 @@ public CorsConfigurationSource corsConfigurationSource() {
269315 "http://digi-creditrural-io.com" ,
270316 "https://digi-creditrural-io.com" ,
271317 "http://www.digi-creditrural-io.com" ,
272- "https://www.digi-creditrural-io.com"
318+ "https://www.digi-creditrural-io.com" ,
319+ // Add mobile origins
320+ "http://localhost" , // For local mobile testing
321+ "capacitor://localhost" // If using Capacitor
273322 ));
274323 corsConfiguration .setAllowedHeaders (Arrays .asList (
275324 ORIGIN , ACCESS_CONTROL_ALLOW_ORIGIN , CONTENT_TYPE ,
0 commit comments