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

Commit0dfc7e8

Browse files
author
th37rose
committed
Implemented the generic Auth feature.
1 parent2a096be commit0dfc7e8

File tree

13 files changed

+314
-17
lines changed

13 files changed

+314
-17
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
packageorg.lowcoder.sdk.auth;
2+
3+
importlombok.Getter;
4+
importlombok.experimental.SuperBuilder;
5+
importlombok.extern.jackson.Jacksonized;
6+
7+
/**
8+
* This class is for Generic Auth Provider
9+
*/
10+
@Getter
11+
@SuperBuilder
12+
@Jacksonized
13+
publicclassOauth2GenericAuthConfigextendsOauth2SimpleAuthConfig {
14+
privateStringissuerUri;
15+
privateStringauthorizationEndpoint;
16+
privateStringtokenEndpoint;
17+
privateStringuserInfoEndpoint;
18+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public String getAuthorizeUrl() {
3838
caseAuthTypeConstants.GITHUB ->replaceAuthUrlClientIdPlaceholder(Oauth2Constants.GITHUB_AUTHORIZE_URL);
3939
caseAuthTypeConstants.ORY ->replaceAuthUrlClientIdPlaceholder(Oauth2Constants.ORY_AUTHORIZE_URL);
4040
caseAuthTypeConstants.KEYCLOAK ->replaceAuthUrlClientIdPlaceholder(Oauth2Constants.KEYCLOAK_AUTHORIZE_URL);
41+
caseAuthTypeConstants.GENERIC ->replaceAuthUrlClientIdPlaceholder(((Oauth2GenericAuthConfig)this).getAuthorizationEndpoint());
4142
default ->null;
4243
};
4344
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ public class AuthTypeConstants {
1010
publicstaticfinalStringGITHUB ="GITHUB";
1111
publicstaticfinalStringORY ="ORY";
1212
publicstaticfinalStringKEYCLOAK ="KEYCLOAK";
13+
publicstaticfinalStringGENERIC ="GENERIC";
1314
}

‎server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/JsonUtils.java‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@
1313
importcom.fasterxml.jackson.module.paramnames.ParameterNamesModule;
1414
importjakarta.annotation.Nullable;
1515
importlombok.extern.slf4j.Slf4j;
16-
importorg.lowcoder.sdk.auth.EmailAuthConfig;
17-
importorg.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig;
18-
importorg.lowcoder.sdk.auth.Oauth2OryAuthConfig;
19-
importorg.lowcoder.sdk.auth.Oauth2SimpleAuthConfig;
16+
importorg.lowcoder.sdk.auth.*;
2017

2118
importjava.nio.charset.StandardCharsets;
2219
importjava.util.List;
@@ -41,6 +38,7 @@ public final class JsonUtils {
4138
OBJECT_MAPPER.registerSubtypes(newNamedType(Oauth2SimpleAuthConfig.class,GOOGLE));
4239
OBJECT_MAPPER.registerSubtypes(newNamedType(Oauth2OryAuthConfig.class,ORY));
4340
OBJECT_MAPPER.registerSubtypes(newNamedType(Oauth2KeycloakAuthConfig.class,KEYCLOAK));
41+
OBJECT_MAPPER.registerSubtypes(newNamedType(Oauth2GenericAuthConfig.class,GENERIC));
4442
}
4543

4644
publicstaticfinalJsonNodeEMPTY_JSON_NODE =createObjectNode();

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

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

33
importjava.util.List;
4+
importjava.util.Map;
45

56
importorg.lowcoder.api.authentication.dto.APIKeyRequest;
67
importorg.lowcoder.api.authentication.dto.AuthConfigRequest;
@@ -14,7 +15,9 @@
1415
importorg.lowcoder.domain.authentication.FindAuthConfig;
1516
importorg.lowcoder.domain.user.model.APIKey;
1617
importorg.lowcoder.sdk.auth.AbstractAuthConfig;
18+
importorg.lowcoder.sdk.auth.Oauth2GenericAuthConfig;
1719
importorg.lowcoder.sdk.util.CookieHelper;
20+
importorg.springframework.http.ResponseEntity;
1821
importorg.springframework.web.bind.annotation.PathVariable;
1922
importorg.springframework.web.bind.annotation.RequestBody;
2023
importorg.springframework.web.bind.annotation.RequestParam;
@@ -128,4 +131,23 @@ public Mono<ResponseView<List<APIKey>>> getAllAPIKeys() {
128131
.map(ResponseView::success);
129132
}
130133

134+
/**
135+
* This endpoint is to get IDP configuration
136+
* @param issuerUri String
137+
* @param source String
138+
* @param sourceName String
139+
* @param clientId String
140+
* @param clientSecret String
141+
* @return Oauth2GenericAuthConfig
142+
*/
143+
@Override
144+
publicMono<ResponseView<Oauth2GenericAuthConfig>>addOAuthProvider(StringissuerUri,
145+
Stringsource,
146+
StringsourceName,
147+
StringclientId,
148+
StringclientSecret) {
149+
returnauthenticationApiService.fetchAndParseConfiguration(issuerUri,source,sourceName,clientId,clientSecret)
150+
.map(ResponseView::success);
151+
}
152+
131153
}

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

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

33
importjava.util.List;
4+
importjava.util.Map;
45

56
importorg.lowcoder.api.authentication.dto.APIKeyRequest;
67
importorg.lowcoder.api.authentication.dto.AuthConfigRequest;
@@ -11,8 +12,10 @@
1112
importorg.lowcoder.domain.user.model.APIKey;
1213
importorg.lowcoder.infra.constant.NewUrl;
1314
importorg.lowcoder.sdk.auth.AbstractAuthConfig;
15+
importorg.lowcoder.sdk.auth.Oauth2GenericAuthConfig;
1416
importorg.lowcoder.sdk.config.SerializeConfig.JsonViews;
1517
importorg.lowcoder.sdk.constants.AuthSourceConstants;
18+
importorg.springframework.http.ResponseEntity;
1619
importorg.springframework.web.bind.annotation.DeleteMapping;
1720
importorg.springframework.web.bind.annotation.GetMapping;
1821
importorg.springframework.web.bind.annotation.PathVariable;
@@ -160,4 +163,19 @@ public Mono<ResponseView<Boolean>> linkAccountWithThirdParty(
160163
publicrecordFormLoginRequest(StringloginId,Stringpassword,booleanregister,Stringsource,StringauthId) {
161164
}
162165

166+
/**
167+
* This endpoint is to get IDP configuration
168+
* @param issuerUri String
169+
* @param source String
170+
* @param sourceName String
171+
* @param clientId String
172+
* @param clientSecret String
173+
* @return Oauth2GenericAuthConfig
174+
*/
175+
@GetMapping("/providers")
176+
publicMono<ResponseView<Oauth2GenericAuthConfig>>addOAuthProvider(@RequestParamStringissuerUri,
177+
@RequestParamStringsource,
178+
@RequestParamStringsourceName,
179+
@RequestParamStringclientId,
180+
@RequestParamStringclientSecret);
163181
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
packageorg.lowcoder.api.authentication.request.oauth2;
2+
3+
importorg.lowcoder.sdk.auth.Oauth2GenericAuthConfig;
4+
5+
/**
6+
* This class is the implementation of Oauth2Source and uses an instance of GenericOAuthProviderConfig
7+
* to return the appropriate URLs
8+
*/
9+
publicclassGenericOAuthProviderSourceimplementsOauth2Source {
10+
11+
privatefinalOauth2GenericAuthConfigconfig;
12+
13+
publicGenericOAuthProviderSource(Oauth2GenericAuthConfigconfig) {
14+
this.config =config;
15+
}
16+
17+
@Override
18+
publicStringaccessToken() {
19+
returnconfig.getTokenEndpoint();
20+
}
21+
22+
@Override
23+
publicStringuserInfo() {
24+
returnconfig.getUserInfoEndpoint();
25+
}
26+
27+
@Override
28+
publicStringrefresh() {
29+
returnconfig.getTokenEndpoint();
30+
}
31+
}

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@
44

55
importorg.lowcoder.api.authentication.request.AuthRequest;
66
importorg.lowcoder.api.authentication.request.AuthRequestFactory;
7-
importorg.lowcoder.api.authentication.request.oauth2.request.AbstractOauth2Request;
8-
importorg.lowcoder.api.authentication.request.oauth2.request.GithubRequest;
9-
importorg.lowcoder.api.authentication.request.oauth2.request.GoogleRequest;
10-
importorg.lowcoder.api.authentication.request.oauth2.request.KeycloakRequest;
11-
importorg.lowcoder.api.authentication.request.oauth2.request.OryRequest;
7+
importorg.lowcoder.api.authentication.request.oauth2.request.*;
8+
importorg.lowcoder.sdk.auth.Oauth2GenericAuthConfig;
129
importorg.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig;
1310
importorg.lowcoder.sdk.auth.Oauth2OryAuthConfig;
1411
importorg.lowcoder.sdk.auth.Oauth2SimpleAuthConfig;
@@ -32,6 +29,7 @@ private AbstractOauth2Request<? extends Oauth2SimpleAuthConfig> buildRequest(OAu
3229
caseGOOGLE ->newGoogleRequest((Oauth2SimpleAuthConfig)context.getAuthConfig());
3330
caseORY ->newOryRequest((Oauth2OryAuthConfig)context.getAuthConfig());
3431
caseKEYCLOAK ->newKeycloakRequest((Oauth2KeycloakAuthConfig)context.getAuthConfig());
32+
caseGENERIC ->newGenericAuthRequest((Oauth2GenericAuthConfig)context.getAuthConfig());
3533
default ->thrownewUnsupportedOperationException(context.getAuthConfig().getAuthType());
3634
};
3735
}
@@ -42,6 +40,7 @@ public Set<String> supportedAuthTypes() {
4240
GITHUB,
4341
GOOGLE,
4442
ORY,
45-
KEYCLOAK);
43+
KEYCLOAK,
44+
GENERIC);
4645
}
4746
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
packageorg.lowcoder.api.authentication.request.oauth2.request;
2+
3+
importorg.lowcoder.api.authentication.request.AuthException;
4+
importorg.lowcoder.api.authentication.request.oauth2.GenericOAuthProviderSource;
5+
importorg.lowcoder.api.authentication.request.oauth2.OAuth2RequestContext;
6+
importorg.lowcoder.domain.user.model.AuthToken;
7+
importorg.lowcoder.domain.user.model.AuthUser;
8+
importorg.lowcoder.sdk.auth.Oauth2GenericAuthConfig;
9+
importorg.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig;
10+
importorg.lowcoder.sdk.util.JsonUtils;
11+
importorg.lowcoder.sdk.webclient.WebClientBuildHelper;
12+
importorg.springframework.http.MediaType;
13+
importorg.springframework.web.reactive.function.BodyInserters;
14+
importreactor.core.publisher.Mono;
15+
16+
importjava.util.Map;
17+
18+
importstaticorg.lowcoder.api.authentication.util.AuthenticationUtils.mapToAuthToken;
19+
importstaticorg.lowcoder.api.authentication.util.AuthenticationUtils.mapToAuthUser;
20+
21+
/**
22+
* This class is for Generic Auth Request
23+
*/
24+
publicclassGenericAuthRequestextendsAbstractOauth2Request<Oauth2GenericAuthConfig>{
25+
26+
publicGenericAuthRequest(Oauth2GenericAuthConfigcontext) {
27+
super(context,newGenericOAuthProviderSource(context));
28+
}
29+
30+
@Override
31+
protectedMono<AuthToken>getAuthToken(OAuth2RequestContextcontext) {
32+
returnWebClientBuildHelper.builder()
33+
.systemProxy()
34+
.build()
35+
.post()
36+
.uri(config.getTokenEndpoint())
37+
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
38+
.body(BodyInserters.fromFormData("code",context.getCode())
39+
.with("client_id",config.getClientId())
40+
.with("client_secret",config.getClientSecret())
41+
.with("grant_type","authorization_code")
42+
.with("redirect_uri",context.getRedirectUrl()))
43+
.retrieve()
44+
.bodyToMono(Map.class)
45+
.flatMap(map -> {
46+
if (map.containsKey("error") ||map.containsKey("error_description")) {
47+
returnMono.error(newAuthException(JsonUtils.toJson(map)));
48+
}
49+
returnMono.just(mapToAuthToken(map));
50+
});
51+
}
52+
53+
@Override
54+
protectedMono<AuthToken>refreshAuthToken(StringrefreshToken) {
55+
returnWebClientBuildHelper.builder()
56+
.systemProxy()
57+
.build()
58+
.post()
59+
.uri(config.getTokenEndpoint())
60+
.body(BodyInserters.fromFormData("grant_type","refresh_token")
61+
.with("refresh_token",refreshToken)
62+
.with("client_id",config.getClientId())
63+
.with("client_secret",config.getClientSecret()))
64+
.retrieve()
65+
.bodyToMono(Map.class)
66+
.flatMap(map -> {
67+
if (map.containsKey("error") ||map.containsKey("error_description")) {
68+
returnMono.error(newAuthException(JsonUtils.toJson(map)));
69+
}
70+
returnMono.just(mapToAuthToken(map));
71+
});
72+
}
73+
74+
@Override
75+
protectedMono<AuthUser>getAuthUser(AuthTokenauthToken) {
76+
returnWebClientBuildHelper.builder()
77+
.systemProxy()
78+
.build()
79+
.get()
80+
.uri(config.getUserInfoEndpoint())
81+
.headers(headers ->headers.setBearerAuth(authToken.getAccessToken()))
82+
.retrieve()
83+
.bodyToMono(Map.class)
84+
.flatMap(map -> {
85+
if (map.containsKey("error") ||map.containsKey("error_description")) {
86+
returnMono.error(newAuthException(JsonUtils.toJson(map)));
87+
}
88+
returnMono.just(mapToAuthUser(map));
89+
});
90+
}
91+
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
importorg.lowcoder.domain.authentication.FindAuthConfig;
77
importorg.lowcoder.domain.user.model.APIKey;
88
importorg.lowcoder.domain.user.model.AuthUser;
9+
importorg.lowcoder.sdk.auth.Oauth2GenericAuthConfig;
910
importorg.springframework.web.server.ServerWebExchange;
1011
importreactor.core.publisher.Flux;
1112
importreactor.core.publisher.Mono;
@@ -29,4 +30,19 @@ public interface AuthenticationApiService {
2930
Mono<Void>deleteAPIKey(StringauthId);
3031

3132
Flux<APIKey>findAPIKeys();
33+
34+
/**
35+
* This method is to fetch and parse the OpenID configuration from the issuer URI.
36+
* @param issuerUri String
37+
* @param source String
38+
* @param sourceName String
39+
* @param clientId String
40+
* @param clientSecret String
41+
* @return Oauth2GenericAuthConfig
42+
*/
43+
Mono<Oauth2GenericAuthConfig>fetchAndParseConfiguration(StringissuerUri,
44+
Stringsource,
45+
StringsourceName,
46+
StringclientId,
47+
StringclientSecret);
3248
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp