From 1fcf17b48dd7f90acd1acce7dc72c61b4909700f Mon Sep 17 00:00:00 2001 From: Thomasr Date: Tue, 28 Jan 2025 10:19:18 -0500 Subject: [PATCH 1/2] #1322: Added API: /email/bind --- .../AuthenticationController.java | 18 +++++++++++------- .../AuthenticationEndpoints.java | 9 +++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) 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 From 6b368d053fa49a800b5acbf9eee8727a3f680363 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Thu, 30 Jan 2025 11:37:56 -0500 Subject: [PATCH 2/2] #1322: Expose email in currentUser endpoint. Add userAuth(jwt, provider) to the currentUser endpoint. --- .../domain/user/model/UserDetail.java | 1 + .../domain/user/service/UserServiceImpl.java | 27 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) 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. */ 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