Skip to content

Commit 53afb73

Browse files
authored
Merge pull request #566 from lowcoder-org/fix-oauth-issues
Link User Accounts Based on Common/Matching Auth-Id(email)
2 parents 02327cf + 5cc8acd commit 53afb73

File tree

5 files changed

+48
-9
lines changed

5 files changed

+48
-9
lines changed

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ public interface UserRepository extends ReactiveMongoRepository<User, String> {
1818

1919
Flux<User> findByConnections_SourceAndConnections_RawIdIn(String source, Collection<String> rawIds);
2020

21+
Mono<User> findByName(String rawUuid);
2122
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,18 @@ public interface UserService {
3232

3333
Mono<Boolean> bindEmail(User user, String email);
3434

35-
Mono<User> findByAuthUser(AuthUser authUser);
35+
Mono<User> findByAuthUserSourceAndRawId(AuthUser authUser);
36+
37+
Mono<User> findByAuthUserRawId(AuthUser authUser);
3638

3739
Mono<User> createNewUserByAuthUser(AuthUser authUser);
3840

3941
Mono<Void> getUserAvatar(ServerWebExchange exchange, String userId);
4042

4143
Mono<Boolean> addNewConnection(String userId, Connection connection);
4244

45+
Mono<User> addNewConnectionAndReturnUser(String userId, Connection connection);
46+
4347
Mono<Void> deleteProfilePhoto(User visitor);
4448

4549
Mono<Boolean> updatePassword(String userId, String oldPassword, String newPassword);

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ public Mono<User> findBySourceAndId(String source, String sourceUuid) {
111111
return repository.findByConnections_SourceAndConnections_RawId(source, sourceUuid);
112112
}
113113

114+
public Mono<User> findByName(String rawUuid) {
115+
return repository.findByName(rawUuid);
116+
}
117+
114118
@Override
115119
public Mono<Boolean> saveProfilePhoto(Part filePart, User user) {
116120
String prevAvatar = ObjectUtils.defaultIfNull(user.getAvatar(), "");
@@ -143,10 +147,15 @@ public Mono<User> update(String id, User updatedUser) {
143147
}
144148

145149
@Override
146-
public Mono<User> findByAuthUser(AuthUser authUser) {
150+
public Mono<User> findByAuthUserSourceAndRawId(AuthUser authUser) {
147151
return findBySourceAndId(authUser.getSource(), authUser.getUid());
148152
}
149153

154+
@Override
155+
public Mono<User> findByAuthUserRawId(AuthUser authUser) {
156+
return findByName(authUser.getUsername());
157+
}
158+
150159
@Override
151160
public Mono<User> createNewUserByAuthUser(AuthUser authUser) {
152161
User newUser = new User();
@@ -198,6 +207,13 @@ public Mono<Boolean> addNewConnection(String userId, Connection connection) {
198207
.then(Mono.just(true));
199208
}
200209

210+
@Override
211+
public Mono<User> addNewConnectionAndReturnUser(String userId, Connection connection) {
212+
return findById(userId)
213+
.doOnNext(user -> user.getConnections().add(connection))
214+
.flatMap(repository::save);
215+
}
216+
201217
@Override
202218
public Mono<Void> deleteProfilePhoto(User visitor) {
203219
String userAvatar = visitor.getAvatar();

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ protected Mono<AuthUser> getAuthUser(AuthToken authToken) {
116116
}
117117
AuthUser authUser = AuthUser.builder()
118118
.uid(MapUtils.getString(map, "sub"))
119-
.username(MapUtils.getString(map, "name"))
119+
.username(MapUtils.getString(map, "email"))
120120
.rawUserInfo(map)
121121
.build();
122122
return Mono.just(authUser);

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,26 @@ public Mono<Void> loginOrRegister(AuthUser authUser, ServerWebExchange exchange,
161161
}
162162

163163
private Mono<User> updateOrCreateUser(AuthUser authUser) {
164-
return findByAuthUser(authUser)
165-
.flatMap(findByAuthUser -> {
166-
if (findByAuthUser.userExist()) {
167-
User user = findByAuthUser.user();
164+
return findByAuthUserSourceAndRawId(authUser).zipWith(findByAuthUserRawId(authUser))
165+
.flatMap(tuple -> {
166+
167+
FindByAuthUser findByAuthUserFirst = tuple.getT1();
168+
FindByAuthUser findByAuthUserSecond = tuple.getT2();
169+
170+
// If the user is found for the same auth source and id, just update the connection
171+
if (findByAuthUserFirst.userExist()) {
172+
User user = findByAuthUserFirst.user();
168173
updateConnection(authUser, user);
169174
return userService.update(user.getId(), user);
170175
}
171176

177+
//If the user connection is not found with login id, but the user is
178+
// found for the same id in some different connection, then just add a new connection to the user
179+
if(findByAuthUserSecond.userExist()) {
180+
User user = findByAuthUserSecond.user();
181+
return userService.addNewConnectionAndReturnUser(user.getId(), authUser.toAuthConnection());
182+
}
183+
172184
// if the user is logging/registering via OAuth provider for the first time,
173185
// but is not anonymous, then just add a new connection
174186

@@ -189,8 +201,14 @@ private Mono<User> updateOrCreateUser(AuthUser authUser) {
189201
});
190202
}
191203

192-
protected Mono<FindByAuthUser> findByAuthUser(AuthUser authUser) {
193-
return userService.findByAuthUser(authUser)
204+
protected Mono<FindByAuthUser> findByAuthUserSourceAndRawId(AuthUser authUser) {
205+
return userService.findByAuthUserSourceAndRawId(authUser)
206+
.map(user -> new FindByAuthUser(true, user))
207+
.defaultIfEmpty(new FindByAuthUser(false, null));
208+
}
209+
210+
protected Mono<FindByAuthUser> findByAuthUserRawId(AuthUser authUser) {
211+
return userService.findByAuthUserRawId(authUser)
194212
.map(user -> new FindByAuthUser(true, user))
195213
.defaultIfEmpty(new FindByAuthUser(false, null));
196214
}

0 commit comments

Comments
 (0)