Skip to content

Commit 65d38c4

Browse files
committed
add login for mobile
1 parent 739ccbd commit 65d38c4

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

micro-digiservices/authorizationserver/src/main/java/io/digiservices/authorizationserver/security/AuthorizationServerConfig.java

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@
2222
import org.springframework.security.core.Authentication;
2323
import org.springframework.security.core.AuthenticationException;
2424
import org.springframework.security.core.GrantedAuthority;
25+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
26+
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
2527
import org.springframework.security.oauth2.core.OAuth2RefreshToken;
2628
import org.springframework.security.oauth2.core.OAuth2Token;
29+
import org.springframework.security.oauth2.core.oidc.OidcScopes;
2730
import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;
2831
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;
32+
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
2933
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
3034
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
3135
import 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;
3238
import org.springframework.security.oauth2.server.authorization.token.*;
3339
import org.springframework.security.web.SecurityFilterChain;
3440
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
@@ -47,9 +53,8 @@
4753
import jakarta.servlet.http.HttpServletRequest;
4854
import jakarta.servlet.http.HttpServletResponse;
4955
import 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.*;
5358
import java.util.stream.Collectors;
5459

5560
import 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,
Binary file not shown.

0 commit comments

Comments
 (0)