Skip to content

Commit 24c285e

Browse files
committed
Adding better handling of service account token login
1 parent a3dbc96 commit 24c285e

File tree

2 files changed

+177
-121
lines changed

2 files changed

+177
-121
lines changed

src/main/java/org/computate/vertx/api/BaseApiServiceImpl.java

Lines changed: 175 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -172,115 +172,111 @@ public <T extends ComputateSiteRequest> T generateSiteRequest(User user, JsonObj
172172
return siteRequest;
173173
}
174174

175-
public <T extends ComputateSiteRequest> Future<T> user(ServiceRequest serviceRequest, Class<T> cSiteRequest, Class<?> cSiteUser, String vertxAddress, String postAction, String patchAction) {
176-
Promise<T> promise = Promise.promise();
175+
public <T extends ComputateSiteRequest> Future<JsonObject> getUserPrincipal(ServiceRequest serviceRequest, Class<T> cSiteRequest, Class<?> cSiteUser, String vertxAddress, String postAction, String patchAction) {
176+
Promise<JsonObject> promise = Promise.promise();
177177
try {
178178
JsonObject userPrincipal = serviceRequest.getUser();
179179
if(userPrincipal == null) {
180-
ComputateSiteRequest siteRequest = generateSiteRequest(null, null, serviceRequest, cSiteRequest);
181-
promise.complete((T)siteRequest);
180+
promise.complete();
182181
} else {
183-
User token = User.create(userPrincipal);
184-
oauth2AuthenticationProvider.authenticate(token.principal()).onSuccess(user -> {
185-
try {
186-
user.attributes().put("principal", user.principal());
187-
JsonObject userAttributes = user.attributes();
188-
JsonObject accessToken = userAttributes.getJsonObject("accessToken");
189-
String userId = accessToken.getString("sub");
190-
T siteRequest = generateSiteRequest(user, userPrincipal, serviceRequest, cSiteRequest);
191-
SearchList<ComputateSiteUser> searchList = new SearchList<ComputateSiteUser>();
192-
searchList.q("*:*");
193-
searchList.setStore(true);
194-
searchList.setC(cSiteUser);
195-
searchList.fq("userId_docvalues_string:" + SearchTool.escapeQueryChars(userId));
196-
searchList.promiseDeepSearchList(siteRequest).onSuccess(c -> {
197-
ComputateSiteUser siteUser1 = searchList.getList().stream().findFirst().orElse(null);
198-
199-
if(siteUser1 == null) {
200-
JsonObject jsonObject = new JsonObject();
201-
jsonObject.put("userName", accessToken.getString("preferred_username"));
202-
jsonObject.put("userFirstName", accessToken.getString("given_name"));
203-
jsonObject.put("userLastName", accessToken.getString("family_name"));
204-
jsonObject.put("userFullName", accessToken.getString("name"));
205-
jsonObject.put("userId", accessToken.getString("sub"));
206-
jsonObject.put("userEmail", accessToken.getString("email"));
207-
userDefine(siteRequest, jsonObject, false);
208-
209-
ComputateSiteRequest siteRequest2 = siteRequest.copy();
210-
siteRequest2.setJsonObject(jsonObject);
211-
siteRequest2.setSiteRequest_(siteRequest);
212-
siteRequest2.initDeepForClass();
213-
214-
ApiRequest apiRequest = new ApiRequest();
215-
apiRequest.setRows(1L);
216-
apiRequest.setNumFound(1L);
217-
apiRequest.setNumPATCH(0L);
218-
apiRequest.initDeepApiRequest(siteRequest2);
219-
siteRequest2.setApiRequest_(apiRequest);
220-
221-
JsonObject params = new JsonObject();
222-
params.put("body", jsonObject);
223-
params.put("path", new JsonObject());
224-
params.put("cookie", new JsonObject());
225-
params.put("header", new JsonObject());
226-
params.put("form", new JsonObject());
227-
JsonObject query = new JsonObject();
228-
Boolean softCommit = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getBoolean("softCommit")).orElse(null);
229-
Integer commitWithin = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getInteger("commitWithin")).orElse(null);
230-
if(softCommit == null && commitWithin == null)
231-
softCommit = true;
232-
if(softCommit)
233-
query.put("softCommit", softCommit);
234-
if(commitWithin != null)
235-
query.put("commitWithin", commitWithin);
236-
params.put("query", query);
237-
JsonObject context = new JsonObject().put("params", params).put("user", Optional.ofNullable(siteRequest.getUser()).map(u -> u.attributes().getJsonObject("tokenPrincipal")).orElse(null));
238-
JsonObject json = new JsonObject().put("context", context);
239-
eventBus.request(vertxAddress, json, new DeliveryOptions().addHeader("action", postAction)).onSuccess(a -> {
240-
JsonObject responseMessage = (JsonObject)a.body();
241-
JsonObject responseBody = new JsonObject(Buffer.buffer(JsonUtil.BASE64_DECODER.decode(responseMessage.getString("payload"))));
242-
Long pk = Long.parseLong(responseBody.getString("pk"));
243-
siteRequest.setUserName(accessToken.getString("preferred_username"));
244-
siteRequest.setUserFirstName(accessToken.getString("given_name"));
245-
siteRequest.setUserLastName(accessToken.getString("family_name"));
246-
siteRequest.setUserEmail(accessToken.getString("email"));
247-
siteRequest.setUserId(accessToken.getString("sub"));
248-
apiRequest.setPk(pk);
249-
siteRequest.setUserKey(pk);
250-
siteRequest.setApiRequest_(apiRequest);
251-
siteRequest.setUserPrincipal(userPrincipal);
252-
siteRequest.setSiteUser(siteUser1);
253-
promise.complete(siteRequest);
254-
}).onFailure(ex -> {
255-
LOG.error(String.format("postSiteUser failed. "), ex);
256-
promise.fail(ex);
257-
});
258-
} else {
259-
JsonObject jsonObject = new JsonObject();
260-
jsonObject.put("setUserName", accessToken.getString("preferred_username"));
261-
jsonObject.put("setUserFirstName", accessToken.getString("given_name"));
262-
jsonObject.put("setUserLastName", accessToken.getString("family_name"));
263-
jsonObject.put("setUserCompleteName", accessToken.getString("name"));
264-
jsonObject.put("setUserId", accessToken.getString("sub"));
265-
jsonObject.put("setUserEmail", accessToken.getString("email"));
266-
jsonObject.put("setSeeDeleted", siteUser1.getSeeDeleted());
267-
jsonObject.put("setSeeArchived", siteUser1.getSeeArchived());
268-
Boolean define = userDefine(siteRequest, jsonObject, true);
269-
if(define) {
182+
String accessToken = userPrincipal.getString("access_token");
183+
if(accessToken == null) {
184+
JsonObject result = new JsonObject();
185+
result.put("access_token", accessToken);
186+
promise.complete(result);
187+
} else {
188+
promise.complete(userPrincipal);
189+
}
190+
}
191+
} catch(Exception ex) {
192+
LOG.error(String.format("user failed. "), ex);
193+
promise.fail(ex);
194+
}
195+
return promise.future();
196+
}
270197

198+
public <T extends ComputateSiteRequest> Future<User> getTokenUser(ServiceRequest serviceRequest, Class<T> cSiteRequest, Class<?> cSiteUser, String vertxAddress, String postAction, String patchAction) {
199+
Promise<User> promise = Promise.promise();
200+
try {
201+
JsonObject userPrincipal = serviceRequest.getUser();
202+
if(userPrincipal == null) {
203+
promise.complete();
204+
} else {
205+
String accessToken = userPrincipal.getString("access_token");
206+
if(accessToken == null) {
207+
promise.complete(User.create(userPrincipal));
208+
} else {
209+
User token = User.create(userPrincipal);
210+
oauth2AuthenticationProvider.authenticate(token.principal()).onSuccess(user -> {
211+
promise.complete(user);
212+
}).onFailure(ex -> {
213+
oauth2AuthenticationProvider.refresh(token).onSuccess(user -> {
214+
serviceRequest.setUser(user.principal());
215+
getTokenUser(serviceRequest, cSiteRequest, cSiteUser, vertxAddress, postAction, patchAction).onSuccess(user2 -> {
216+
promise.complete(user2);
217+
}).onFailure(ex2 -> {
218+
promise.fail(ex2);
219+
});
220+
}).onFailure(ex2 -> {
221+
LOG.error(String.format("user failed. ", ex2));
222+
promise.fail(ex2);
223+
});
224+
});
225+
}
226+
}
227+
} catch(Exception ex) {
228+
LOG.error(String.format("user failed. "), ex);
229+
promise.fail(ex);
230+
}
231+
return promise.future();
232+
}
233+
234+
public <T extends ComputateSiteRequest> Future<T> user(ServiceRequest serviceRequest, Class<T> cSiteRequest, Class<?> cSiteUser, String vertxAddress, String postAction, String patchAction) {
235+
Promise<T> promise = Promise.promise();
236+
try {
237+
getUserPrincipal(serviceRequest, cSiteRequest, cSiteUser, vertxAddress, postAction, patchAction).onSuccess(userPrincipal -> {
238+
getTokenUser(serviceRequest, cSiteRequest, cSiteUser, vertxAddress, postAction, patchAction).onSuccess(user -> {
239+
try {
240+
if(user == null) {
241+
ComputateSiteRequest siteRequest = generateSiteRequest(null, null, serviceRequest, cSiteRequest);
242+
promise.complete((T)siteRequest);
243+
} else {
244+
user.attributes().put("principal", user.principal());
245+
JsonObject userAttributes = user.attributes();
246+
JsonObject accessToken = Optional.ofNullable(userAttributes.getJsonObject("accessToken")).orElse(user.principal());
247+
user.attributes().put("accessToken", accessToken);
248+
String userId = accessToken.getString("sub");
249+
T siteRequest = generateSiteRequest(user, userPrincipal, serviceRequest, cSiteRequest);
250+
SearchList<ComputateSiteUser> searchList = new SearchList<ComputateSiteUser>();
251+
searchList.q("*:*");
252+
searchList.setStore(true);
253+
searchList.setC(cSiteUser);
254+
searchList.fq("userId_docvalues_string:" + SearchTool.escapeQueryChars(userId));
255+
searchList.promiseDeepSearchList(siteRequest).onSuccess(c -> {
256+
ComputateSiteUser siteUser1 = searchList.getList().stream().findFirst().orElse(null);
257+
258+
if(siteUser1 == null) {
259+
JsonObject jsonObject = new JsonObject();
260+
jsonObject.put("userName", accessToken.getString("preferred_username"));
261+
jsonObject.put("userFirstName", accessToken.getString("given_name"));
262+
jsonObject.put("userLastName", accessToken.getString("family_name"));
263+
jsonObject.put("userFullName", accessToken.getString("name"));
264+
jsonObject.put("userId", accessToken.getString("sub"));
265+
jsonObject.put("userEmail", accessToken.getString("email"));
266+
userDefine(siteRequest, jsonObject, false);
267+
271268
ComputateSiteRequest siteRequest2 = siteRequest.copy();
272269
siteRequest2.setJsonObject(jsonObject);
273270
siteRequest2.setSiteRequest_(siteRequest);
274271
siteRequest2.initDeepForClass();
275-
siteUser1.setSiteRequest_(siteRequest2);
276-
272+
277273
ApiRequest apiRequest = new ApiRequest();
278274
apiRequest.setRows(1L);
279275
apiRequest.setNumFound(1L);
280276
apiRequest.setNumPATCH(0L);
281277
apiRequest.initDeepApiRequest(siteRequest2);
282278
siteRequest2.setApiRequest_(apiRequest);
283-
279+
284280
JsonObject params = new JsonObject();
285281
params.put("body", jsonObject);
286282
params.put("path", new JsonObject());
@@ -296,18 +292,20 @@ public <T extends ComputateSiteRequest> Future<T> user(ServiceRequest serviceReq
296292
query.put("softCommit", softCommit);
297293
if(commitWithin != null)
298294
query.put("commitWithin", commitWithin);
299-
query.put("q", "*:*").put("fq", new JsonArray().add("pk:" + siteUser1.getPk())).put("var", new JsonArray().add("refresh:false"));
300295
params.put("query", query);
301296
JsonObject context = new JsonObject().put("params", params).put("user", Optional.ofNullable(siteRequest.getUser()).map(u -> u.attributes().getJsonObject("tokenPrincipal")).orElse(null));
302297
JsonObject json = new JsonObject().put("context", context);
303298
eventBus.request(vertxAddress, json, new DeliveryOptions().addHeader("action", postAction)).onSuccess(a -> {
304-
JsonObject responseBody = (JsonObject)a.body();
299+
JsonObject responseMessage = (JsonObject)a.body();
300+
JsonObject responseBody = new JsonObject(Buffer.buffer(JsonUtil.BASE64_DECODER.decode(responseMessage.getString("payload"))));
301+
Long pk = Long.parseLong(responseBody.getString("pk"));
305302
siteRequest.setUserName(accessToken.getString("preferred_username"));
306303
siteRequest.setUserFirstName(accessToken.getString("given_name"));
307304
siteRequest.setUserLastName(accessToken.getString("family_name"));
308305
siteRequest.setUserEmail(accessToken.getString("email"));
309306
siteRequest.setUserId(accessToken.getString("sub"));
310-
siteRequest.setUserKey(siteUser1.getPk());
307+
apiRequest.setPk(pk);
308+
siteRequest.setUserKey(pk);
311309
siteRequest.setApiRequest_(apiRequest);
312310
siteRequest.setUserPrincipal(userPrincipal);
313311
siteRequest.setSiteUser(siteUser1);
@@ -317,37 +315,93 @@ public <T extends ComputateSiteRequest> Future<T> user(ServiceRequest serviceReq
317315
promise.fail(ex);
318316
});
319317
} else {
320-
siteRequest.setUserName(siteUser1.getUserName());
321-
siteRequest.setUserFirstName(siteUser1.getUserFirstName());
322-
siteRequest.setUserLastName(siteUser1.getUserLastName());
323-
siteRequest.setUserKey(siteUser1.getPk());
324-
siteRequest.setUserPrincipal(userPrincipal);
325-
siteRequest.setSiteUser(siteUser1);
326-
promise.complete((T)siteRequest);
318+
JsonObject jsonObject = new JsonObject();
319+
jsonObject.put("setUserName", accessToken.getString("preferred_username"));
320+
jsonObject.put("setUserFirstName", accessToken.getString("given_name"));
321+
jsonObject.put("setUserLastName", accessToken.getString("family_name"));
322+
jsonObject.put("setUserCompleteName", accessToken.getString("name"));
323+
jsonObject.put("setUserId", accessToken.getString("sub"));
324+
jsonObject.put("setUserEmail", accessToken.getString("email"));
325+
jsonObject.put("setSeeDeleted", siteUser1.getSeeDeleted());
326+
jsonObject.put("setSeeArchived", siteUser1.getSeeArchived());
327+
Boolean define = userDefine(siteRequest, jsonObject, true);
328+
if(define) {
329+
330+
ComputateSiteRequest siteRequest2 = siteRequest.copy();
331+
siteRequest2.setJsonObject(jsonObject);
332+
siteRequest2.setSiteRequest_(siteRequest);
333+
siteRequest2.initDeepForClass();
334+
siteUser1.setSiteRequest_(siteRequest2);
335+
336+
ApiRequest apiRequest = new ApiRequest();
337+
apiRequest.setRows(1L);
338+
apiRequest.setNumFound(1L);
339+
apiRequest.setNumPATCH(0L);
340+
apiRequest.initDeepApiRequest(siteRequest2);
341+
siteRequest2.setApiRequest_(apiRequest);
342+
343+
JsonObject params = new JsonObject();
344+
params.put("body", jsonObject);
345+
params.put("path", new JsonObject());
346+
params.put("cookie", new JsonObject());
347+
params.put("header", new JsonObject());
348+
params.put("form", new JsonObject());
349+
JsonObject query = new JsonObject();
350+
Boolean softCommit = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getBoolean("softCommit")).orElse(null);
351+
Integer commitWithin = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getInteger("commitWithin")).orElse(null);
352+
if(softCommit == null && commitWithin == null)
353+
softCommit = true;
354+
if(softCommit)
355+
query.put("softCommit", softCommit);
356+
if(commitWithin != null)
357+
query.put("commitWithin", commitWithin);
358+
query.put("q", "*:*").put("fq", new JsonArray().add("pk:" + siteUser1.getPk())).put("var", new JsonArray().add("refresh:false"));
359+
params.put("query", query);
360+
JsonObject context = new JsonObject().put("params", params).put("user", Optional.ofNullable(siteRequest.getUser()).map(u -> u.attributes().getJsonObject("tokenPrincipal")).orElse(null));
361+
JsonObject json = new JsonObject().put("context", context);
362+
eventBus.request(vertxAddress, json, new DeliveryOptions().addHeader("action", postAction)).onSuccess(a -> {
363+
JsonObject responseBody = (JsonObject)a.body();
364+
siteRequest.setUserName(accessToken.getString("preferred_username"));
365+
siteRequest.setUserFirstName(accessToken.getString("given_name"));
366+
siteRequest.setUserLastName(accessToken.getString("family_name"));
367+
siteRequest.setUserEmail(accessToken.getString("email"));
368+
siteRequest.setUserId(accessToken.getString("sub"));
369+
siteRequest.setUserKey(siteUser1.getPk());
370+
siteRequest.setApiRequest_(apiRequest);
371+
siteRequest.setUserPrincipal(userPrincipal);
372+
siteRequest.setSiteUser(siteUser1);
373+
promise.complete(siteRequest);
374+
}).onFailure(ex -> {
375+
LOG.error(String.format("postSiteUser failed. "), ex);
376+
promise.fail(ex);
377+
});
378+
} else {
379+
siteRequest.setUserName(siteUser1.getUserName());
380+
siteRequest.setUserFirstName(siteUser1.getUserFirstName());
381+
siteRequest.setUserLastName(siteUser1.getUserLastName());
382+
siteRequest.setUserKey(siteUser1.getPk());
383+
siteRequest.setUserPrincipal(userPrincipal);
384+
siteRequest.setSiteUser(siteUser1);
385+
promise.complete((T)siteRequest);
386+
}
327387
}
328-
}
329-
}).onFailure(ex -> {
330-
LOG.error(String.format("user failed. "), ex);
331-
promise.fail(ex);
332-
});
388+
}).onFailure(ex -> {
389+
LOG.error(String.format("user failed. "), ex);
390+
promise.fail(ex);
391+
});
392+
}
333393
} catch(Exception ex) {
334394
LOG.error(String.format("user failed. "), ex);
335395
promise.fail(ex);
336396
}
337397
}).onFailure(ex -> {
338-
oauth2AuthenticationProvider.refresh(token).onSuccess(user -> {
339-
serviceRequest.setUser(user.principal());
340-
user(serviceRequest, cSiteRequest, cSiteUser, vertxAddress, postAction, patchAction).onSuccess(siteRequest -> {
341-
promise.complete((T)siteRequest);
342-
}).onFailure(ex2 -> {
343-
promise.fail(ex2);
344-
});
345-
}).onFailure(ex2 -> {
346-
LOG.error(String.format("user failed. ", ex2));
347-
promise.fail(ex2);
348-
});
398+
LOG.error(String.format("user failed. "), ex);
399+
promise.fail(ex);
349400
});
350-
}
401+
}).onFailure(ex -> {
402+
LOG.error(String.format("user failed. "), ex);
403+
promise.fail(ex);
404+
});
351405
} catch(Exception ex) {
352406
LOG.error(String.format("user failed. "), ex);
353407
promise.fail(ex);

src/main/java/org/computate/vertx/config/ComputateConfigKeys.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,4 +708,6 @@ public class ComputateConfigKeys {
708708
* Facebook App ID
709709
**/
710710
public static final String FACEBOOK_APP_ID = "FACEBOOK_APP_ID";
711+
712+
public static final String OPEN_TELEMETRY_ENABLED = "OPEN_TELEMETRY_ENABLED";
711713
}

0 commit comments

Comments
 (0)