Skip to content

Commit ed6e176

Browse files
authored
Merge pull request #56 from vinscom/refactoring
Refactoring
2 parents 557ccec + c770e94 commit ed6e176

File tree

11 files changed

+140
-48
lines changed

11 files changed

+140
-48
lines changed

config-layers/common/in/erail/route/LoadUserFromAccessTokenRouteBuilder.properties

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@ $class=in.erail.route.LoadUserFromAccessTokenRouteBuillder
33

44
vertx=/io/vertx/core/Vertx
55
log=true
6-
oAuth2Auth=/io/vertx/ext/auth/oauth2/OAuth2Auth
7-
enable^=/in/erail/common/FrameworkConfiguration.oAuth2AuthEnable
6+
userProvider=/in/erail/user/UserProvider
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#/in/erail/user/UserProvider
2+
$class=in.erail.user.oauth2.OAuth2AuthUserProvider
3+
4+
oAuth2Auth=/io/vertx/ext/auth/oauth2/OAuth2Auth

src/main/java/in/erail/model/RequestEvent.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.annotation.JsonInclude.Include;
55
import com.google.common.io.BaseEncoding;
66
import io.vertx.core.http.HttpMethod;
7+
import io.vertx.core.json.JsonObject;
78
import java.util.Map;
89

910
/**
@@ -23,9 +24,10 @@ public class RequestEvent {
2324
private Map<String, String> mPathParameters;
2425
private Map<String, String> mStageVariables;
2526
@SuppressWarnings("rawtypes")
26-
private Map mRequestContext;
27+
private Map mRequestContext;
2728
private byte[] mBody = new byte[0];
2829
private boolean mIsBase64Encoded = false;
30+
private Map<String, Object> mPrincipal;
2931

3032
public String getResource() {
3133
return mResource;
@@ -100,12 +102,12 @@ public void setStageVariables(Map<String, String> pStageVariables) {
100102
}
101103

102104
@SuppressWarnings("rawtypes")
103-
public Map getRequestContext() {
105+
public Map getRequestContext() {
104106
return mRequestContext;
105107
}
106108

107109
@SuppressWarnings("rawtypes")
108-
public void setRequestContext(Map pRequestContext) {
110+
public void setRequestContext(Map pRequestContext) {
109111
this.mRequestContext = pRequestContext;
110112
}
111113

@@ -124,11 +126,25 @@ public byte[] getBody() {
124126
public void setBody(byte[] pBody) {
125127
this.mBody = pBody;
126128
}
127-
128-
public String bodyAsString(){
129-
if(isIsBase64Encoded()){
129+
130+
public String bodyAsString() {
131+
if (isIsBase64Encoded()) {
130132
return new String(BaseEncoding.base64().decode(new String(getBody())));
131133
}
132134
return new String(getBody());
133135
}
136+
137+
public Map<String, Object> getPrincipal() {
138+
return mPrincipal;
139+
}
140+
141+
public void setPrincipal(Map<String, Object> pPrincipal) {
142+
this.mPrincipal = pPrincipal;
143+
}
144+
145+
@Override
146+
public String toString() {
147+
return JsonObject.mapFrom(this).toString();
148+
}
149+
134150
}

src/main/java/in/erail/model/ResponseEvent.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.common.base.Preconditions;
44
import com.google.common.net.HttpHeaders;
55
import com.google.common.net.MediaType;
6+
import io.vertx.core.json.JsonObject;
67
import io.vertx.reactivex.core.MultiMap;
78
import java.util.Arrays;
89
import java.util.Collections;
@@ -166,17 +167,18 @@ public ResponseEvent setContentType(MediaType pMediaType) {
166167
return this;
167168
}
168169

169-
public ResponseEvent addHeader(String pHeaderName, String pMediaType) {
170-
mMultiValueHeaders.add(HttpHeaders.CONTENT_TYPE, pMediaType);
171-
return this;
172-
}
173-
174-
public ResponseEvent addHeader(String pHeaderName, MediaType pMediaType) {
175-
addHeader(HttpHeaders.CONTENT_TYPE, pMediaType.toString());
170+
public ResponseEvent addHeader(String pHeaderName, String pValue) {
171+
mMultiValueHeaders.add(pHeaderName, pValue);
176172
return this;
177173
}
178174

179175
public String headerValue(String pHeaderName) {
180176
return mMultiValueHeaders.get(pHeaderName);
181177
}
178+
179+
@Override
180+
public String toString() {
181+
return JsonObject.mapFrom(this).toString();
182+
}
183+
182184
}

src/main/java/in/erail/route/LoadUserFromAccessTokenRouteBuillder.java

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,60 @@
22

33
import com.google.common.base.Strings;
44
import com.google.common.net.HttpHeaders;
5+
import in.erail.user.UserProvider;
56
import io.vertx.core.json.JsonObject;
6-
import io.vertx.ext.auth.oauth2.impl.OAuth2AuthProviderImpl;
7-
import io.vertx.ext.auth.oauth2.impl.OAuth2TokenImpl;
8-
import io.vertx.reactivex.ext.auth.oauth2.AccessToken;
9-
import io.vertx.reactivex.ext.auth.oauth2.OAuth2Auth;
107
import io.vertx.reactivex.ext.web.Router;
118
import io.vertx.reactivex.ext.web.RoutingContext;
9+
import java.util.regex.Matcher;
10+
import java.util.regex.Pattern;
1211

1312
/**
1413
*
1514
* @author vinay
1615
*/
1716
public class LoadUserFromAccessTokenRouteBuillder extends AbstractRouterBuilderImpl {
1817

19-
private OAuth2Auth mOAuth2Auth;
20-
21-
public OAuth2Auth getOAuth2Auth() {
22-
return mOAuth2Auth;
23-
}
24-
25-
public void setOAuth2Auth(OAuth2Auth pOAuth2Auth) {
26-
this.mOAuth2Auth = pOAuth2Auth;
27-
}
18+
private Pattern AUTH_TOKEN = Pattern.compile("^Bearer\\s(?<token>.*)");
19+
private UserProvider mUserProvider;
2820

2921
@Override
3022
public Router getRouter(Router pRouter) {
3123
pRouter.route().handler(this::handle);
3224
return pRouter;
33-
3425
}
3526

3627
public void handle(RoutingContext pRoutingContext) {
37-
28+
3829
if (pRoutingContext.user() == null) {
3930
String access_token = pRoutingContext.request().getHeader(HttpHeaders.AUTHORIZATION);
4031
if (!Strings.isNullOrEmpty(access_token)) {
41-
OAuth2AuthProviderImpl provider = (OAuth2AuthProviderImpl) getOAuth2Auth().getDelegate();
42-
JsonObject accessToken = new JsonObject().put("access_token", access_token.split(" ")[1]);
43-
try {
44-
OAuth2TokenImpl token = new OAuth2TokenImpl(provider, accessToken);
45-
pRoutingContext.setUser(new AccessToken(token));
46-
} catch (RuntimeException e) {
47-
getLog().error(e);
48-
pRoutingContext.fail(401);
49-
return;
32+
Matcher token = AUTH_TOKEN.matcher(access_token);
33+
if (token.find()) {
34+
JsonObject accessToken = new JsonObject().put("access_token", token.group("token"));
35+
try {
36+
pRoutingContext
37+
.setUser(getUserProvider()
38+
.getUser(accessToken)
39+
.blockingGet());
40+
} catch (RuntimeException e) {
41+
getLog().error(e);
42+
pRoutingContext.fail(401);
43+
return;
44+
}
45+
} else {
46+
getLog().warn(() -> "Invalid Auth Header:" + access_token);
5047
}
5148
}
5249
}
5350
pRoutingContext.next();
5451
}
5552

53+
public UserProvider getUserProvider() {
54+
return mUserProvider;
55+
}
56+
57+
public void setUserProvider(UserProvider pUserProvider) {
58+
this.mUserProvider = pUserProvider;
59+
}
60+
5661
}

src/main/java/in/erail/route/OpenAPI3RouteBuilder.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ public JsonObject serialiseRoutingContext(RoutingContext pContext) {
126126
request.setQueryStringParameters(convertMultiMapIntoMap(pContext.queryParams()));
127127
request.setPathParameters(convertMultiMapIntoMap(pContext.request().params()));
128128

129+
JsonObject principal = Optional
130+
.ofNullable(pContext.user())
131+
.flatMap((t) -> Optional.ofNullable(t.principal()))
132+
.orElse(new JsonObject());
133+
134+
request.setPrincipal(principal.getMap());
135+
129136
JsonObject result = JsonObject.mapFrom(request);
130137

131138
getLog().debug(() -> "Context to JSON:" + result.toString());
@@ -147,8 +154,8 @@ public HttpServerResponse buildResponseFromReply(JsonObject pReplyResponse, Rout
147154

148155
Optional<String> contentType = Optional.ofNullable(response.headerValue(HttpHeaders.CONTENT_TYPE));
149156

150-
if (contentType.isPresent()) {
151-
response.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.OCTET_STREAM);
157+
if (!contentType.isPresent()) {
158+
response.setContentType(MediaType.OCTET_STREAM);
152159
}
153160

154161
response

src/main/java/in/erail/service/RESTServiceImpl.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package in.erail.service;
22

3+
import com.google.common.net.MediaType;
34
import io.reactivex.schedulers.Schedulers;
45
import io.vertx.core.json.JsonObject;
56
import io.vertx.reactivex.core.Vertx;
67
import org.apache.logging.log4j.Logger;
78
import in.erail.glue.annotation.StartService;
89
import in.erail.model.RequestEvent;
910
import in.erail.model.ResponseEvent;
11+
import io.netty.handler.codec.http.HttpResponseStatus;
1012
import io.reactivex.Scheduler;
1113
import io.reactivex.Single;
1214
import io.vertx.reactivex.core.eventbus.Message;
@@ -50,7 +52,14 @@ public Single<JsonObject> handleRequest(Message<JsonObject> pMessage) {
5052
.flatMapMaybe(req -> process(req))
5153
.toSingle(new ResponseEvent())
5254
.map(resp -> JsonObject.mapFrom(resp))
53-
.doOnSuccess(resp -> pMessage.reply(resp));
55+
.doOnSuccess(resp -> pMessage.reply(resp))
56+
.doOnError(err -> {
57+
ResponseEvent resp = new ResponseEvent()
58+
.setStatusCode(HttpResponseStatus.BAD_REQUEST.code())
59+
.setContentType(MediaType.PLAIN_TEXT_UTF_8)
60+
.setBody(ExceptionUtils.getMessage(err).getBytes());
61+
pMessage.reply(JsonObject.mapFrom(resp));
62+
});
5463
}
5564

5665
@Override
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package in.erail.user;
2+
3+
import io.reactivex.Maybe;
4+
import io.vertx.core.json.JsonObject;
5+
import io.vertx.reactivex.ext.auth.User;
6+
7+
/**
8+
*
9+
* @author vinay
10+
*/
11+
public interface UserProvider {
12+
13+
default Maybe<User> getUser(JsonObject pPrincipal) {
14+
return Maybe.empty();
15+
}
16+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package in.erail.user.oauth2;
2+
3+
import in.erail.user.UserProvider;
4+
import io.reactivex.Maybe;
5+
import io.vertx.core.json.JsonObject;
6+
import io.vertx.ext.auth.oauth2.impl.OAuth2AuthProviderImpl;
7+
import io.vertx.ext.auth.oauth2.impl.OAuth2TokenImpl;
8+
import io.vertx.reactivex.ext.auth.User;
9+
import io.vertx.reactivex.ext.auth.oauth2.AccessToken;
10+
import io.vertx.reactivex.ext.auth.oauth2.OAuth2Auth;
11+
12+
/**
13+
*
14+
* @author vinay
15+
*/
16+
public class OAuth2AuthUserProvider implements UserProvider {
17+
18+
private OAuth2Auth mOAuth2Auth;
19+
20+
@Override
21+
public Maybe<User> getUser(JsonObject pPrincipal) {
22+
OAuth2AuthProviderImpl provider = (OAuth2AuthProviderImpl) getOAuth2Auth().getDelegate();
23+
OAuth2TokenImpl token = new OAuth2TokenImpl(provider, pPrincipal);
24+
return Maybe.just(new AccessToken(token));
25+
}
26+
27+
public OAuth2Auth getOAuth2Auth() {
28+
return mOAuth2Auth;
29+
}
30+
31+
public void setOAuth2Auth(OAuth2Auth pOAuth2Auth) {
32+
this.mOAuth2Auth = pOAuth2Auth;
33+
}
34+
35+
}

src/test/java/in/erail/service/BinaryBodyService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package in.erail.service;
22

33
import com.google.common.base.Strings;
4-
import com.google.common.net.HttpHeaders;
54
import com.google.common.net.MediaType;
65

76
import in.erail.model.RequestEvent;
@@ -28,7 +27,7 @@ public Maybe<ResponseEvent> process(RequestEvent pRequest) {
2827
}
2928

3029
ResponseEvent response = new ResponseEvent();
31-
response.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.PLAIN_TEXT_UTF_8);
30+
response.setContentType(MediaType.PLAIN_TEXT_UTF_8);
3231

3332
JsonObject jsonBody = new JsonObject(Buffer.buffer(pRequest.getBody()));
3433

0 commit comments

Comments
 (0)