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 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