Skip to content

Commit 6469516

Browse files
committed
Add handling for oauth(inherit from login) for rest api datasource
1 parent c3bca96 commit 6469516

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@
1616
import org.lowcoder.domain.query.service.LibraryQueryRecordService;
1717
import org.lowcoder.domain.query.service.LibraryQueryService;
1818
import org.lowcoder.domain.query.service.QueryExecutionService;
19+
import org.lowcoder.domain.user.model.Connection;
20+
import org.lowcoder.domain.user.model.User;
1921
import org.lowcoder.infra.util.TupleUtils;
2022
import org.lowcoder.sdk.config.CommonConfig;
2123
import org.lowcoder.sdk.exception.BizError;
2224
import org.lowcoder.sdk.models.Property;
2325
import org.lowcoder.sdk.models.QueryExecutionResult;
26+
import org.lowcoder.sdk.plugin.restapi.RestApiDatasourceConfig;
27+
import org.lowcoder.sdk.plugin.restapi.auth.OAuthInheritAuthConfig;
2428
import org.lowcoder.sdk.query.QueryVisitorContext;
2529
import org.lowcoder.sdk.util.ExceptionUtils;
2630
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,7 +37,9 @@
3337
import reactor.core.publisher.Timed;
3438

3539
import javax.annotation.Nullable;
40+
import java.util.Collections;
3641
import java.util.List;
42+
import java.util.Optional;
3743
import java.util.stream.Collectors;
3844

3945
import static org.lowcoder.domain.permission.model.ResourceAction.READ_APPLICATIONS;
@@ -91,12 +97,13 @@ public Mono<QueryExecutionResult> executeApplicationQuery(ServerWebExchange exch
9197
Mono<Datasource> datasourceMono = baseQueryMono.flatMap(query -> datasourceService.getById(query.getDatasourceId())
9298
.switchIfEmpty(deferredError(BizError.DATASOURCE_NOT_FOUND, "DATASOURCE_NOT_FOUND", query.getDatasourceId())))
9399
.cache();
94-
return sessionUserService.getVisitorId()
95-
.delayUntil(userId -> checkExecutePermission(userId, queryExecutionRequest.getPath(), appId,
100+
101+
return sessionUserService.getVisitor()
102+
.delayUntil(user -> checkExecutePermission(user.getId(), queryExecutionRequest.getPath(), appId,
96103
queryExecutionRequest.isViewMode()))
97104
.zipWhen(visitorId -> Mono.zip(appMono, appQueryMono, baseQueryMono, datasourceMono), TupleUtils::merge)
98105
.flatMap(tuple -> {
99-
String userId = tuple.getT1();
106+
String userId = tuple.getT1().getId();
100107
Application app = tuple.getT2();
101108
ApplicationQuery appQuery = tuple.getT3();
102109
BaseQuery baseQuery = tuple.getT4();
@@ -107,8 +114,19 @@ public Mono<QueryExecutionResult> executeApplicationQuery(ServerWebExchange exch
107114
}
108115

109116
MultiValueMap<String, HttpCookie> cookies = exchange.getRequest().getCookies();
110-
QueryVisitorContext queryVisitorContext = new QueryVisitorContext(userId, app.getOrganizationId(), port, cookies,
111-
getAuthParamsAndHeadersInheritFromLogin(userId, app.getOrganizationId()), commonConfig.getDisallowedHosts());
117+
118+
Mono<List<Property>> paramsAndHeadersInheritFromLogin = Mono.empty();
119+
120+
if (datasource.isRestApi()) {
121+
// then check if oauth inherited from login and save token
122+
if(datasource.getDetailConfig() instanceof RestApiDatasourceConfig restApiDatasourceConfig
123+
&& restApiDatasourceConfig.isOauth2InheritFromLogin()) {
124+
paramsAndHeadersInheritFromLogin = getAuthParamsAndHeadersInheritFromLogin(tuple.getT1(), ((OAuthInheritAuthConfig)restApiDatasourceConfig.getAuthConfig()).getAuthId());
125+
126+
}
127+
}
128+
129+
QueryVisitorContext queryVisitorContext = new QueryVisitorContext(userId, app.getOrganizationId(), port, cookies, paramsAndHeadersInheritFromLogin, commonConfig.getDisallowedHosts());
112130
return queryExecutionService.executeQuery(datasource, baseQuery.getQueryConfig(), queryExecutionRequest.paramMap(),
113131
appQuery.getTimeoutStr(), queryVisitorContext
114132
)
@@ -174,8 +192,18 @@ private Mono<BaseQuery> getBaseQueryFromLibraryQuery(ApplicationQuery query) {
174192
.map(LibraryQueryRecord::getQuery);
175193
}
176194

177-
protected Mono<List<Property>> getAuthParamsAndHeadersInheritFromLogin(String userId, String orgId) {
178-
return Mono.empty();
195+
protected Mono<List<Property>> getAuthParamsAndHeadersInheritFromLogin(User user, String authId) {
196+
if(authId == null) {
197+
return Mono.empty();
198+
}
199+
Optional<Connection> activeConnectionOptional = user.getConnections()
200+
.stream()
201+
.filter(connection -> connection.getAuthId().equals(authId))
202+
.findFirst();
203+
if(!activeConnectionOptional.isPresent() || activeConnectionOptional.get().getAuthConnectionAuthToken() == null) {
204+
return Mono.empty();
205+
}
206+
return Mono.just(Collections.singletonList(new Property("Authorization","Bearer " + activeConnectionOptional.get().getAuthConnectionAuthToken().getAccessToken(),"header")));
179207
}
180208

181209
protected void onNextOrError(QueryExecutionRequest queryExecutionRequest, QueryVisitorContext queryVisitorContext,

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryApiService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,9 @@ private Mono<BaseQuery> getBaseQuery(LibraryQueryCombineId libraryQueryCombineId
346346
}
347347

348348
protected Mono<List<Property>> getParamsAndHeadersInheritFromLogin(User user, String authId) {
349+
if(authId == null) {
350+
return Mono.empty();
351+
}
349352
Optional<Connection> activeConnectionOptional = user.getConnections()
350353
.stream()
351354
.filter(connection -> connection.getAuthId().equals(authId))

0 commit comments

Comments
 (0)