diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java index 757453909..e3dfd72f9 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java @@ -18,4 +18,5 @@ public interface UserRepository extends ReactiveMongoRepository { Flux findByConnections_SourceAndConnections_RawIdIn(String source, Collection rawIds); + Mono findByName(String rawUuid); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java index b93e37594..aebed82ef 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java @@ -32,7 +32,9 @@ public interface UserService { Mono bindEmail(User user, String email); - Mono findByAuthUser(AuthUser authUser); + Mono findByAuthUserSourceAndRawId(AuthUser authUser); + + Mono findByAuthUserRawId(AuthUser authUser); Mono createNewUserByAuthUser(AuthUser authUser); @@ -40,6 +42,8 @@ public interface UserService { Mono addNewConnection(String userId, Connection connection); + Mono addNewConnectionAndReturnUser(String userId, Connection connection); + Mono deleteProfilePhoto(User visitor); Mono updatePassword(String userId, String oldPassword, String newPassword); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java index 1ea542e30..49fc9f478 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java @@ -111,6 +111,10 @@ public Mono findBySourceAndId(String source, String sourceUuid) { return repository.findByConnections_SourceAndConnections_RawId(source, sourceUuid); } + public Mono findByName(String rawUuid) { + return repository.findByName(rawUuid); + } + @Override public Mono saveProfilePhoto(Part filePart, User user) { String prevAvatar = ObjectUtils.defaultIfNull(user.getAvatar(), ""); @@ -143,10 +147,15 @@ public Mono update(String id, User updatedUser) { } @Override - public Mono findByAuthUser(AuthUser authUser) { + public Mono findByAuthUserSourceAndRawId(AuthUser authUser) { return findBySourceAndId(authUser.getSource(), authUser.getUid()); } + @Override + public Mono findByAuthUserRawId(AuthUser authUser) { + return findByName(authUser.getUsername()); + } + @Override public Mono createNewUserByAuthUser(AuthUser authUser) { User newUser = new User(); @@ -198,6 +207,13 @@ public Mono addNewConnection(String userId, Connection connection) { .then(Mono.just(true)); } + @Override + public Mono addNewConnectionAndReturnUser(String userId, Connection connection) { + return findById(userId) + .doOnNext(user -> user.getConnections().add(connection)) + .flatMap(repository::save); + } + @Override public Mono deleteProfilePhoto(User visitor) { String userAvatar = visitor.getAvatar(); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java index 31dcd650d..7aeecd073 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java @@ -116,7 +116,7 @@ protected Mono getAuthUser(AuthToken authToken) { } AuthUser authUser = AuthUser.builder() .uid(MapUtils.getString(map, "sub")) - .username(MapUtils.getString(map, "name")) + .username(MapUtils.getString(map, "email")) .rawUserInfo(map) .build(); return Mono.just(authUser); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java index d4b934b7a..966b86bb7 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java @@ -161,14 +161,26 @@ public Mono loginOrRegister(AuthUser authUser, ServerWebExchange exchange, } private Mono updateOrCreateUser(AuthUser authUser) { - return findByAuthUser(authUser) - .flatMap(findByAuthUser -> { - if (findByAuthUser.userExist()) { - User user = findByAuthUser.user(); + return findByAuthUserSourceAndRawId(authUser).zipWith(findByAuthUserRawId(authUser)) + .flatMap(tuple -> { + + FindByAuthUser findByAuthUserFirst = tuple.getT1(); + FindByAuthUser findByAuthUserSecond = tuple.getT2(); + + // If the user is found for the same auth source and id, just update the connection + if (findByAuthUserFirst.userExist()) { + User user = findByAuthUserFirst.user(); updateConnection(authUser, user); return userService.update(user.getId(), user); } + //If the user connection is not found with login id, but the user is + // found for the same id in some different connection, then just add a new connection to the user + if(findByAuthUserSecond.userExist()) { + User user = findByAuthUserSecond.user(); + return userService.addNewConnectionAndReturnUser(user.getId(), authUser.toAuthConnection()); + } + // if the user is logging/registering via OAuth provider for the first time, // but is not anonymous, then just add a new connection @@ -189,8 +201,14 @@ private Mono updateOrCreateUser(AuthUser authUser) { }); } - protected Mono findByAuthUser(AuthUser authUser) { - return userService.findByAuthUser(authUser) + protected Mono findByAuthUserSourceAndRawId(AuthUser authUser) { + return userService.findByAuthUserSourceAndRawId(authUser) + .map(user -> new FindByAuthUser(true, user)) + .defaultIfEmpty(new FindByAuthUser(false, null)); + } + + protected Mono findByAuthUserRawId(AuthUser authUser) { + return userService.findByAuthUserRawId(authUser) .map(user -> new FindByAuthUser(true, user)) .defaultIfEmpty(new FindByAuthUser(false, null)); }