Skip to content

Commit e043ca6

Browse files
committed
Added HttpGatewayAuthenticator
1 parent e652c25 commit e043ca6

File tree

3 files changed

+56
-12
lines changed

3 files changed

+56
-12
lines changed

services-gateway/src/main/java/io/scalecube/services/gateway/http/HttpGateway.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class HttpGateway implements Gateway {
3535
private final int port;
3636
private final Function<ServiceCall, ServiceCall> callFactory;
3737
private final ServiceProviderErrorMapper errorMapper;
38+
private final HttpGatewayAuthenticator authenticator;
3839
private final boolean corsEnabled;
3940
private final CorsConfigBuilder corsConfigBuilder;
4041

@@ -46,6 +47,7 @@ private HttpGateway(Builder builder) {
4647
this.port = builder.port;
4748
this.callFactory = builder.callFactory;
4849
this.errorMapper = builder.errorMapper;
50+
this.authenticator = builder.authenticator;
4951
this.corsEnabled = builder.corsEnabled;
5052
this.corsConfigBuilder = builder.corsConfigBuilder;
5153
}
@@ -76,7 +78,8 @@ public Gateway start(ServiceCall call, ServiceRegistry serviceRegistry) {
7678
}
7779
})
7880
.handle(
79-
new HttpGatewayAcceptor(callFactory.apply(call), serviceRegistry, errorMapper))
81+
new HttpGatewayAcceptor(
82+
callFactory.apply(call), serviceRegistry, errorMapper, authenticator))
8083
.bind()
8184
.toFuture()
8285
.get();
@@ -117,6 +120,7 @@ public static class Builder {
117120
private int port;
118121
private Function<ServiceCall, ServiceCall> callFactory = call -> call;
119122
private ServiceProviderErrorMapper errorMapper = DefaultErrorMapper.INSTANCE;
123+
private HttpGatewayAuthenticator authenticator = HttpGatewayAuthenticator.DEFAULT_INSTANCE;
120124
private boolean corsEnabled = false;
121125
private CorsConfigBuilder corsConfigBuilder =
122126
CorsConfigBuilder.forAnyOrigin()
@@ -158,6 +162,15 @@ public Builder errorMapper(ServiceProviderErrorMapper errorMapper) {
158162
return this;
159163
}
160164

165+
public HttpGatewayAuthenticator authenticator() {
166+
return authenticator;
167+
}
168+
169+
public Builder authenticator(HttpGatewayAuthenticator authenticator) {
170+
this.authenticator = authenticator;
171+
return this;
172+
}
173+
161174
public boolean corsEnabled() {
162175
return corsEnabled;
163176
}

services-gateway/src/main/java/io/scalecube/services/gateway/http/HttpGatewayAcceptor.java

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.scalecube.services.transport.api.DataCodec;
3232
import java.io.IOException;
3333
import java.util.List;
34+
import java.util.Map;
3435
import java.util.function.BiFunction;
3536
import java.util.function.Consumer;
3637
import org.reactivestreams.Publisher;
@@ -53,14 +54,17 @@ public class HttpGatewayAcceptor
5354
private final ServiceCall serviceCall;
5455
private final ServiceRegistry serviceRegistry;
5556
private final ServiceProviderErrorMapper errorMapper;
57+
private final HttpGatewayAuthenticator authenticator;
5658

5759
public HttpGatewayAcceptor(
5860
ServiceCall serviceCall,
5961
ServiceRegistry serviceRegistry,
60-
ServiceProviderErrorMapper errorMapper) {
62+
ServiceProviderErrorMapper errorMapper,
63+
HttpGatewayAuthenticator authenticator) {
6164
this.serviceCall = serviceCall;
6265
this.serviceRegistry = serviceRegistry;
6366
this.errorMapper = errorMapper;
67+
this.authenticator = authenticator;
6468
}
6569

6670
@Override
@@ -77,15 +81,22 @@ public Publisher<Void> apply(HttpServerRequest httpRequest, HttpServerResponse h
7781
return methodNotAllowed(httpResponse);
7882
}
7983

80-
if (httpRequest.isMultipart()) {
81-
return handleFileUploadRequest(httpRequest, httpResponse);
82-
} else {
83-
return handleServiceRequest(httpRequest, httpResponse);
84-
}
84+
return authenticator
85+
.authenticate(httpRequest)
86+
.flatMap(
87+
principal -> {
88+
if (httpRequest.isMultipart()) {
89+
return handleFileUploadRequest(principal, httpRequest, httpResponse);
90+
} else {
91+
return handleServiceRequest(principal, httpRequest, httpResponse);
92+
}
93+
});
8594
}
8695

8796
private Mono<Void> handleFileUploadRequest(
88-
HttpServerRequest httpRequest, HttpServerResponse httpResponse) {
97+
Map<String, String> principal,
98+
HttpServerRequest httpRequest,
99+
HttpServerResponse httpResponse) {
89100
return httpRequest
90101
.receiveForm()
91102
.flatMap(
@@ -100,8 +111,10 @@ private Mono<Void> handleFileUploadRequest(
100111
builder -> {
101112
final var filename =
102113
((FileUpload) httpData).getFilename();
103-
builder.header(HEADER_UPLOAD_FILENAME, filename);
104-
builder.data(data);
114+
builder
115+
.headers(principal)
116+
.header(HEADER_UPLOAD_FILENAME, filename)
117+
.data(data);
105118
})))
106119
.last()
107120
.flatMap(
@@ -115,7 +128,9 @@ private Mono<Void> handleFileUploadRequest(
115128
}
116129

117130
private Mono<Void> handleServiceRequest(
118-
HttpServerRequest httpRequest, HttpServerResponse httpResponse) {
131+
Map<String, String> principal,
132+
HttpServerRequest httpRequest,
133+
HttpServerResponse httpResponse) {
119134
return httpRequest
120135
.receive()
121136
.reduceWith(
@@ -132,7 +147,8 @@ private Mono<Void> handleServiceRequest(
132147
.defaultIfEmpty(Unpooled.EMPTY_BUFFER)
133148
.flatMap(
134149
data -> {
135-
final var message = toMessage(httpRequest, builder -> builder.data(data));
150+
final var message =
151+
toMessage(httpRequest, builder -> builder.headers(principal).data(data));
136152

137153
// Match and handle file request
138154

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.scalecube.services.gateway.http;
2+
3+
import java.util.Collections;
4+
import java.util.Map;
5+
import reactor.core.publisher.Mono;
6+
import reactor.netty.http.server.HttpServerRequest;
7+
8+
public interface HttpGatewayAuthenticator {
9+
10+
HttpGatewayAuthenticator DEFAULT_INSTANCE = new HttpGatewayAuthenticator() {};
11+
12+
default Mono<Map<String, String>> authenticate(HttpServerRequest request) {
13+
return Mono.just(Collections.emptyMap());
14+
}
15+
}

0 commit comments

Comments
 (0)