Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf4e0103

Browse files
Add oAuth Providers Integration (#305)
* Add oAuth Providers Integration- Add/Rework CRUD APIs for AuthConfigs to support org wide auth providers management.- Add auth token and refresh token handling if access token about to expire in next 5 minutes- Add support to allow same user to add multiple oAuth providers
1 parent417c528 commitf4e0103

File tree

25 files changed

+277
-111
lines changed

25 files changed

+277
-111
lines changed

‎server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/AuthenticationService.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ public interface AuthenticationService {
1010

1111
EmailAuthConfigDEFAULT_AUTH_CONFIG =newEmailAuthConfig(AuthSourceConstants.EMAIL,true,true);
1212

13-
Mono<FindAuthConfig>findAuthConfigByAuthId(StringauthId);
13+
Mono<FindAuthConfig>findAuthConfigByAuthId(StringorgId,StringauthId);
1414

15-
Mono<FindAuthConfig>findAuthConfigBySource(Stringsource);
15+
Mono<FindAuthConfig>findAuthConfigBySource(StringorgId,Stringsource);
1616

17-
Flux<FindAuthConfig>findAllAuthConfigs(booleanenableOnly);
17+
Flux<FindAuthConfig>findAllAuthConfigs(StringorgId,booleanenableOnly);
1818
}

‎server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/AuthenticationServiceImpl.java‎

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
11
packageorg.lowcoder.domain.authentication;
22

3-
importstaticorg.lowcoder.sdk.exception.BizError.LOG_IN_SOURCE_NOT_SUPPORTED;
4-
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
5-
6-
importjava.util.Objects;
7-
importjava.util.function.Function;
8-
importjava.util.stream.Collectors;
9-
3+
importlombok.extern.slf4j.Slf4j;
104
importorg.lowcoder.domain.organization.service.OrganizationService;
115
importorg.lowcoder.sdk.auth.AbstractAuthConfig;
126
importorg.lowcoder.sdk.config.AuthProperties;
137
importorg.lowcoder.sdk.config.CommonConfig;
148
importorg.lowcoder.sdk.constants.WorkspaceMode;
159
importorg.springframework.beans.factory.annotation.Autowired;
1610
importorg.springframework.stereotype.Service;
17-
18-
importlombok.extern.slf4j.Slf4j;
1911
importreactor.core.publisher.Flux;
2012
importreactor.core.publisher.Mono;
2113

14+
importjava.util.Objects;
15+
importjava.util.function.Function;
16+
importjava.util.stream.Collectors;
17+
18+
importstaticorg.lowcoder.sdk.exception.BizError.LOG_IN_SOURCE_NOT_SUPPORTED;
19+
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
20+
2221
@Slf4j
2322
@Service
2423
publicclassAuthenticationServiceImplimplementsAuthenticationService {
@@ -31,35 +30,35 @@ public class AuthenticationServiceImpl implements AuthenticationService {
3130
privateAuthPropertiesauthProperties;
3231

3332
@Override
34-
publicMono<FindAuthConfig>findAuthConfigByAuthId(StringauthId) {
35-
returnfindAuthConfig(abstractAuthConfig ->Objects.equals(authId,abstractAuthConfig.getId()));
33+
publicMono<FindAuthConfig>findAuthConfigByAuthId(StringorgId,StringauthId) {
34+
returnfindAuthConfig(orgId,abstractAuthConfig ->Objects.equals(authId,abstractAuthConfig.getId()));
3635
}
3736

3837
@Override
3938
@Deprecated
40-
publicMono<FindAuthConfig>findAuthConfigBySource(Stringsource) {
41-
returnfindAuthConfig(abstractAuthConfig ->Objects.equals(source,abstractAuthConfig.getSource()));
39+
publicMono<FindAuthConfig>findAuthConfigBySource(StringorgId,Stringsource) {
40+
returnfindAuthConfig(orgId,abstractAuthConfig ->Objects.equals(source,abstractAuthConfig.getSource()));
4241
}
4342

44-
privateMono<FindAuthConfig>findAuthConfig(Function<AbstractAuthConfig,Boolean>condition) {
45-
returnfindAllAuthConfigs(true)
43+
privateMono<FindAuthConfig>findAuthConfig(StringorgId,Function<AbstractAuthConfig,Boolean>condition) {
44+
returnfindAllAuthConfigs(orgId,true)
4645
.filter(findAuthConfig ->condition.apply(findAuthConfig.authConfig()))
4746
.next()
4847
.switchIfEmpty(ofError(LOG_IN_SOURCE_NOT_SUPPORTED,"LOG_IN_SOURCE_NOT_SUPPORTED"));
4948
}
5049

5150
@Override
52-
publicFlux<FindAuthConfig>findAllAuthConfigs(booleanenableOnly) {
51+
publicFlux<FindAuthConfig>findAllAuthConfigs(StringorgId,booleanenableOnly) {
5352
returnfindAllAuthConfigsByDomain()
5453
.switchIfEmpty(findAllAuthConfigsForEnterpriseMode())
55-
.switchIfEmpty(findAllAuthConfigsForSaasMode())
54+
.switchIfEmpty(findAllAuthConfigsForSaasMode(orgId))
5655
.filter(findAuthConfig -> {
5756
if (enableOnly) {
5857
returnfindAuthConfig.authConfig().isEnable();
5958
}
6059
returntrue;
6160
})
62-
.defaultIfEmpty(newFindAuthConfig(DEFAULT_AUTH_CONFIG,null));
61+
.concatWithValues(newFindAuthConfig(DEFAULT_AUTH_CONFIG,null));
6362
}
6463

6564
privateFlux<FindAuthConfig>findAllAuthConfigsByDomain() {
@@ -85,10 +84,20 @@ protected Flux<FindAuthConfig> findAllAuthConfigsForEnterpriseMode() {
8584
);
8685
}
8786

88-
privateFlux<FindAuthConfig>findAllAuthConfigsForSaasMode() {
87+
privateFlux<FindAuthConfig>findAllAuthConfigsForSaasMode(StringorgId) {
8988
if (commonConfig.getWorkspace().getMode() ==WorkspaceMode.SAAS) {
90-
returnFlux.fromIterable(authProperties.getAuthConfigs())
91-
.map(abstractAuthConfig ->newFindAuthConfig(abstractAuthConfig,null));
89+
90+
// Get the auth configs for the current org
91+
if(orgId !=null) {
92+
returnorganizationService.getById(orgId)
93+
.flatMapIterable(organization ->
94+
organization.getAuthConfigs()
95+
.stream()
96+
.map(abstractAuthConfig ->newFindAuthConfig(abstractAuthConfig,organization))
97+
.collect(Collectors.toList())
98+
);
99+
}
100+
92101
}
93102
returnFlux.empty();
94103
}

‎server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/auth/Oauth2SimpleAuthConfig.java‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
importlombok.Getter;
1616

17+
importstaticorg.lowcoder.sdk.auth.constants.Oauth2Constants.CLIENT_ID_PLACEHOLDER;
18+
1719
/**
1820
* simple oauth2 auth config.
1921
*/
@@ -48,8 +50,8 @@ public Oauth2SimpleAuthConfig(
4850
@JsonView(JsonViews.Public.class)
4951
publicStringgetAuthorizeUrl() {
5052
returnswitch (authType) {
51-
caseAuthTypeConstants.GOOGLE ->Oauth2Constants.GOOGLE_AUTHORIZE_URL;
52-
caseAuthTypeConstants.GITHUB ->Oauth2Constants.GITHUB_AUTHORIZE_URL;
53+
caseAuthTypeConstants.GOOGLE ->replaceAuthUrlClientIdPlaceholder(Oauth2Constants.GOOGLE_AUTHORIZE_URL);
54+
caseAuthTypeConstants.GITHUB ->replaceAuthUrlClientIdPlaceholder(Oauth2Constants.GITHUB_AUTHORIZE_URL);
5355
default ->null;
5456
};
5557
}
@@ -70,4 +72,8 @@ public void merge(AbstractAuthConfig oldConfig) {
7072
this.clientSecret =oldSimpleConfig.getClientSecret();
7173
}
7274
}
75+
76+
privateStringreplaceAuthUrlClientIdPlaceholder(Stringurl) {
77+
returnurl.replace(CLIENT_ID_PLACEHOLDER,clientId);
78+
}
7379
}

‎server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizError.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public enum BizError {
101101
USER_NOT_EXIST(400,5618),
102102
JWT_NOT_FIND(400,5619),
103103
ID_NOT_EXIST(500,5620),
104+
DUPLICATE_AUTH_CONFIG_ADDITION(400,5621),
104105

105106

106107
// asset related, code range 5700 - 5799

‎server/api-service/lowcoder-sdk/src/main/resources/locale_en.properties‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,4 @@ CERTIFICATE_EMPTY=Certificate is empty.
277277
ORG_DELETED_FOR_ENTERPRISE_MODE=Provided enterpriseOrgId workspace has been deleted, please contact Lowcoder team.
278278
DISABLE_AUTH_CONFIG_FORBIDDEN=Can not disable current administrator''s last identity provider.
279279
USER_NOT_EXIST=User not exist.
280+
DUPLICATE_AUTH_CONFIG_ADDITION=Provider auth type already added to organization

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

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
packageorg.lowcoder.api.authentication;
22

3-
importjava.util.List;
4-
3+
importcom.fasterxml.jackson.annotation.JsonView;
4+
importlombok.extern.slf4j.Slf4j;
55
importorg.lowcoder.api.authentication.dto.AuthConfigRequest;
66
importorg.lowcoder.api.authentication.service.AuthenticationApiService;
77
importorg.lowcoder.api.framework.view.ResponseView;
@@ -17,21 +17,12 @@
1717
importorg.lowcoder.sdk.constants.AuthSourceConstants;
1818
importorg.lowcoder.sdk.util.CookieHelper;
1919
importorg.springframework.beans.factory.annotation.Autowired;
20-
importorg.springframework.web.bind.annotation.DeleteMapping;
21-
importorg.springframework.web.bind.annotation.GetMapping;
22-
importorg.springframework.web.bind.annotation.PathVariable;
23-
importorg.springframework.web.bind.annotation.PostMapping;
24-
importorg.springframework.web.bind.annotation.RequestBody;
25-
importorg.springframework.web.bind.annotation.RequestMapping;
26-
importorg.springframework.web.bind.annotation.RequestParam;
27-
importorg.springframework.web.bind.annotation.RestController;
20+
importorg.springframework.web.bind.annotation.*;
2821
importorg.springframework.web.server.ServerWebExchange;
29-
30-
importcom.fasterxml.jackson.annotation.JsonView;
31-
32-
importlombok.extern.slf4j.Slf4j;
3322
importreactor.core.publisher.Mono;
3423

24+
importjava.util.List;
25+
3526
@Slf4j
3627
@RestController
3728
@RequestMapping(value = {NewUrl.CUSTOM_AUTH})
@@ -72,9 +63,10 @@ public Mono<ResponseView<Boolean>> loginWithThirdParty(
7263
@RequestParam(required =false)Stringsource,
7364
@RequestParamStringcode,
7465
@RequestParam(required =false)StringinvitationId,
75-
@RequestParam(required =false)StringredirectUrl,
66+
@RequestParamStringredirectUrl,
67+
@RequestParamStringorgId,
7668
ServerWebExchangeexchange) {
77-
returnauthenticationApiService.authenticateByOauth2(authId,source,code,redirectUrl)
69+
returnauthenticationApiService.authenticateByOauth2(authId,source,code,redirectUrl,orgId)
7870
.flatMap(authUser ->authenticationApiService.loginOrRegister(authUser,exchange,invitationId))
7971
.thenReturn(ResponseView.success(true));
8072
}
@@ -99,10 +91,10 @@ public Mono<ResponseView<Void>> disableAuthConfig(@PathVariable("id") String id)
9991
.thenReturn(ResponseView.success(null));
10092
}
10193

102-
@JsonView(JsonViews.Public.class)
94+
@JsonView(JsonViews.Internal.class)
10395
@GetMapping("/configs")
10496
publicMono<ResponseView<List<AbstractAuthConfig>>>getAllConfigs() {
105-
returnauthenticationService.findAllAuthConfigs(false)
97+
returnauthenticationApiService.findAuthConfigs(false)
10698
.map(FindAuthConfig::authConfig)
10799
.collectList()
108100
.map(ResponseView::success);
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
packageorg.lowcoder.api.authentication.request;
22

33
importorg.lowcoder.domain.authentication.context.AuthRequestContext;
4-
importorg.lowcoder.domain.user.model.AuthToken;
54
importorg.lowcoder.domain.user.model.AuthUser;
6-
75
importreactor.core.publisher.Mono;
86

97
/**
@@ -13,7 +11,5 @@ public interface AuthRequest {
1311

1412
Mono<AuthUser>auth(AuthRequestContextauthRequestContext);
1513

16-
defaultMono<AuthToken>refresh(StringrefreshToken) {
17-
returnMono.error(newUnsupportedOperationException());
18-
}
14+
Mono<AuthUser>refresh(StringrefreshToken);
1915
}

‎server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/form/FormAuthRequest.java‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
packageorg.lowcoder.api.authentication.request.form;
22

3-
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
4-
53
importorg.lowcoder.api.authentication.request.AuthRequest;
64
importorg.lowcoder.domain.authentication.context.AuthRequestContext;
75
importorg.lowcoder.domain.authentication.context.FormAuthRequestContext;
@@ -15,9 +13,10 @@
1513
importorg.lowcoder.sdk.exception.BizException;
1614
importorg.springframework.beans.factory.annotation.Autowired;
1715
importorg.springframework.stereotype.Component;
18-
1916
importreactor.core.publisher.Mono;
2017

18+
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
19+
2120
@Component
2221
publicclassFormAuthRequestimplementsAuthRequest {
2322

@@ -58,4 +57,9 @@ public Mono<AuthUser> auth(AuthRequestContext authRequestContext) {
5857
})
5958
.thenReturn(AuthUser.builder().uid(context.getLoginId()).username(context.getLoginId()).build());
6059
}
60+
61+
@Override
62+
publicMono<AuthUser>refresh(StringrefreshToken) {
63+
returnMono.error(newUnsupportedOperationException());
64+
}
6165
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ public final class OAuth2RequestContext extends AuthRequestContext {
99
privatefinalStringcode;
1010
privatefinalStringredirectUrl;
1111

12-
publicOAuth2RequestContext(Stringcode,StringredirectUrl) {
12+
publicOAuth2RequestContext(StringorgId,Stringcode,StringredirectUrl) {
13+
this.setOrgId(orgId);
1314
this.code =code;
1415
this.redirectUrl =redirectUrl;
1516
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ public String userInfo() {
1313
return"https://api.github.com/user";
1414
}
1515

16+
@Override
17+
publicStringrefresh() {
18+
return"https://www.googleapis.com/oauth2/v4/token";
19+
}
20+
1621
},
1722
GOOGLE {
1823
@Override
@@ -25,5 +30,10 @@ public String userInfo() {
2530
return"https://www.googleapis.com/oauth2/v3/userinfo";
2631
}
2732

33+
@Override
34+
publicStringrefresh() {
35+
return"https://www.googleapis.com/oauth2/v4/token";
36+
}
37+
2838
}
2939
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp