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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy