diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/UserDetail.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/UserDetail.java index 157b913f7..4347e6bf9 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/UserDetail.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/UserDetail.java @@ -31,4 +31,5 @@ public class UserDetail { private String ip; private List> groups; private Map extra; + private Map userAuth; } 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 981000caf..5e2f4fbb0 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 @@ -8,6 +8,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.lowcoder.domain.asset.model.Asset; import org.lowcoder.domain.asset.service.AssetService; import org.lowcoder.domain.authentication.AuthenticationService; @@ -197,8 +198,10 @@ public Mono bindEmail(User user, String email) { .source(AuthSourceConstants.EMAIL) .name(email) .rawId(email) + .email(email) .build(); user.getConnections().add(connection); + user.setEmail(email); return repository.save(user) .then(Mono.just(true)) .onErrorResume(throwable -> { @@ -215,6 +218,7 @@ public Mono addNewConnectionAndReturnUser(String userId, AuthUser authUser return findById(userId) .doOnNext(user -> { user.getConnections().add(connection); + if(StringUtils.isEmpty(user.getEmail())) user.setEmail(connection.getEmail()); user.setActiveAuthId(connection.getAuthId()); if (AuthSourceConstants.EMAIL.equals(authUser.getSource()) @@ -360,20 +364,41 @@ public Mono buildUserDetail(User user, boolean withoutDynamicGroups) .map(tuple2 -> { OrgMember orgMember = tuple2.getT1(); List> groups = tuple2.getT2(); + String activeAuthId = user.getActiveAuthId(); + Optional connection = user.getConnections().stream().filter(con -> con.getAuthId().equals(activeAuthId)).findFirst(); + HashMap userAuth = connectionToUserAuthDetail(connection); return UserDetail.builder() .id(user.getId()) .name(StringUtils.isEmpty(user.getName())?user.getId():user.getName()) .avatarUrl(user.getAvatarUrl()) .uiLanguage(user.getUiLanguage()) - .email(convertEmail(user.getConnections())) + .email(user.getEmail()) .ip(ip) .groups(groups) .extra(getUserDetailExtra(user, orgMember.getOrgId())) + .userAuth(userAuth) .build(); }); }); } + private static @NotNull HashMap connectionToUserAuthDetail(Optional connection) { + HashMap userAuth = new HashMap(); + if(connection.isPresent()) { + if(connection.get().getSource().equals(AuthSourceConstants.EMAIL)) { + userAuth.put("jwt", ""); + userAuth.put("provider", AuthSourceConstants.EMAIL); + } else if(connection.get().getAuthConnectionAuthToken() != null) { + userAuth.put("jwt", connection.get().getAuthConnectionAuthToken().getAccessToken()); + userAuth.put("provider", connection.get().getSource()); + } else { + userAuth.put("jwt", ""); + userAuth.put("provider", connection.get().getSource()); + } + } + return userAuth; + } + /** * In enterprise mode, user can be deleted and then related connections should be released here by appending a timestamp after the source field. */ diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationController.java index b66fe752a..36815b323 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationController.java @@ -1,8 +1,6 @@ package org.lowcoder.api.authentication; -import java.util.List; -import java.util.Map; - +import lombok.RequiredArgsConstructor; import org.lowcoder.api.authentication.dto.APIKeyRequest; import org.lowcoder.api.authentication.dto.AuthConfigRequest; import org.lowcoder.api.authentication.service.AuthenticationApiService; @@ -14,19 +12,18 @@ import org.lowcoder.api.util.BusinessEventPublisher; import org.lowcoder.domain.authentication.FindAuthConfig; import org.lowcoder.domain.user.model.APIKey; +import org.lowcoder.domain.user.service.UserService; import org.lowcoder.sdk.auth.AbstractAuthConfig; -import org.lowcoder.sdk.auth.Oauth2GenericAuthConfig; import org.lowcoder.sdk.util.CookieHelper; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ServerWebExchange; - -import lombok.RequiredArgsConstructor; import reactor.core.publisher.Mono; +import java.util.List; + @RequiredArgsConstructor @RestController public class AuthenticationController implements AuthenticationEndpoints @@ -36,6 +33,7 @@ public class AuthenticationController implements AuthenticationEndpoints private final SessionUserService sessionUserService; private final CookieHelper cookieHelper; private final BusinessEventPublisher businessEventPublisher; + private final UserService userService; /** * login by email or phone with password; or register by email for now. @@ -130,4 +128,10 @@ public Mono>> getAllAPIKeys() { .collectList() .map(ResponseView::success); } + + @Override + public Mono> bindEmail(@RequestParam String email) { + return sessionUserService.getVisitor().flatMap(user -> userService.bindEmail(user, email)) + .map(ResponseView::success); + } } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationEndpoints.java index 7ab28ba20..27baf9674 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/AuthenticationEndpoints.java @@ -143,6 +143,15 @@ public Mono> linkAccountWithThirdParty( @GetMapping("/api-keys") public Mono>> getAllAPIKeys(); + @Operation( + tags = TAG_AUTHENTICATION, + operationId = "bindEmail", + summary = "Bind current User to email", + description = "Bind current user to email" + ) + @PostMapping("/email/bind") + public Mono> bindEmail(@RequestParam String email); + /** * @param loginId phone number or email for now. * @param register register or login