Skip to content

Commit 5dee6d4

Browse files
Merge pull request #1471 from virtualcell/vcell-reconnection-failure
VCell Connection Failure Fix
2 parents e0d2ffa + 030fad4 commit 5dee6d4

22 files changed

Lines changed: 110 additions & 353 deletions

docker/build/build.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,10 @@ build_rest() {
112112

113113
build_webapp_common() {
114114
config=$1
115+
export BUILD_COMMAND="build_$1"
115116
echo "building $repo/vcell-webapp-${config}:$tag"
116-
echo "$SUDO_CMD docker buildx build --platform=linux/amd64 -f ../../webapp-ng/Dockerfile-webapp-${config} --tag $repo/vcell-webapp-${config}:$tag ../../webapp-ng"
117-
$SUDO_CMD docker buildx build --platform=linux/amd64 -f ../../webapp-ng/Dockerfile-webapp-${config} --tag $repo/vcell-webapp-${config}:$tag ../../webapp-ng
117+
echo "$SUDO_CMD docker buildx build --build-arg BUILD_COMMAND=build_$1 --platform=linux/amd64 -f ../../webapp-ng/Dockerfile-webapp --tag $repo/vcell-webapp-${config}:$tag ../../webapp-ng"
118+
$SUDO_CMD docker buildx build --build-arg BUILD_COMMAND=build_$1 --platform=linux/amd64 -f ../../webapp-ng/Dockerfile-webapp --tag $repo/vcell-webapp-${config}:$tag ../../webapp-ng
118119
if [[ $? -ne 0 ]]; then echo "docker buildx build --platform=linux/amd64 failed"; exit 1; fi
119120
if [ "$skip_push" == "false" ]; then
120121
$SUDO_CMD docker push $repo/vcell-webapp-${config}:$tag

vcell-apiclient/src/main/java/org/vcell/api/client/VCellApiClient.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ public class VCellApiClient implements AutoCloseable {
7575
private final static String DEFAULT_CLIENTID = "85133f8d-26f7-4247-8356-d175399fc2e6";
7676
private final URL quarkusURL;
7777
private ApiClient apiClient = null;
78-
private final static String authClientID = "cjoWhd7W8A8znf7Z7vizyvKJCiqTgRtf";
79-
private final static String authDomain = "https://dev-dzhx7i2db3x3kkvq.us.auth0.com";
8078

8179
// Create a custom response handler
8280
public static class VCellStringResponseHandler implements ResponseHandler<String> {
@@ -482,7 +480,7 @@ public void createDefaultQuarkusClient(boolean bIgnoreCertProblems){
482480
}
483481

484482
public void authenticate(boolean ignoreSSLCertProblems) throws URISyntaxException, IOException, ParseException, ApiException {
485-
apiClient = InteractiveLogin.login(authClientID, new URI(authDomain + "/authorize"),
483+
apiClient = InteractiveLogin.login(new URI(InteractiveLogin.authDomain + "/authorize"),
486484
this.quarkusURL.toURI(), ignoreSSLCertProblems);
487485
apiClient.setScheme(this.quarkusURL.getProtocol());
488486
}
@@ -494,7 +492,7 @@ public void logOut(){
494492
java.net.http.HttpRequest.Builder httpRequestBuilder = java.net.http.HttpRequest.newBuilder();
495493
String postLogoutRedirect = "";
496494
String idToken = "";
497-
httpRequestBuilder.uri(URI.create(authDomain + "/oidc/logout"));
495+
httpRequestBuilder.uri(URI.create(InteractiveLogin.authDomain + "/oidc/logout"));
498496
httpRequestBuilder.header("Content-Type", "application/x-www-form-urlencoded");
499497
// httpRequestBuilder.method("GET");
500498
String logoutPath = "";

vcell-rest/src/main/resources/application.properties

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,11 @@ quarkus.datasource.postgresql.db-kind=postgresql
6767
## Auth OIDC Bearer Token
6868
%dev,prod.quarkus.oidc.auth-server-url=https://dev-dzhx7i2db3x3kkvq.us.auth0.com
6969
%dev,prod.quarkus.oidc.client-id=ViiDx0tdnXnv6OMiz9nS6MkHyWmlsRlG
70-
%dev,prod.quarkus.oidc.credentials.secret=
71-
%dev,prod.quarkus.oidc.application-type=hybrid
72-
%dev,prod.quarkus.oidc.authentication.scopes=openid,profile,email
70+
%dev,prod.quarkus.oidc.tenant-id=dev-dzhx7i2db3x3kkvq
71+
%dev,prod.quarkus.oidc.application-type=service
72+
#%dev,prod.quarkus.oidc.authentication.scopes=openid,profile,email,offline_access
73+
%dev,prod.quarkus.oidc.token.allow-jwt-introspection=false
74+
%dev,prod.quarkus.oidc.token.allow-opaque-token-introspection=false
7375

7476
%test.quarkus.oidc.client-id=backend-service
7577
%test.quarkus.oidc.credentials.secret=secret

vcell-restclient/src/main/java/org/vcell/restclient/auth/AuthApiClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void refreshAccessToken() throws IOException, ParseException {
6060
// Create the token request
6161
TokenRequest request = new TokenRequest(
6262
oidcProviderTokenEndpoint,
63-
new ClientID("your-client-id"),
63+
new ClientID(InteractiveLogin.authClientID),
6464
new RefreshTokenGrant(refreshToken)
6565
);
6666

vcell-restclient/src/main/java/org/vcell/restclient/auth/InteractiveLogin.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.nimbusds.oauth2.sdk.*;
44
import com.nimbusds.oauth2.sdk.http.HTTPRequest;
55
import com.nimbusds.oauth2.sdk.http.HTTPResponse;
6+
import com.nimbusds.oauth2.sdk.id.Audience;
67
import com.nimbusds.oauth2.sdk.id.ClientID;
78
import com.nimbusds.oauth2.sdk.id.State;
89
import com.nimbusds.oauth2.sdk.pkce.CodeChallengeMethod;
@@ -27,10 +28,18 @@
2728
import java.util.concurrent.TimeUnit;
2829

2930
public class InteractiveLogin {
31+
public final static String authClientID = "cjoWhd7W8A8znf7Z7vizyvKJCiqTgRtf";
32+
public final static String authDomain = "https://dev-dzhx7i2db3x3kkvq.us.auth0.com";
33+
34+
3035

3136
private InteractiveLogin() {
3237
}
3338

39+
public static AuthApiClient login() throws URISyntaxException, IOException, ParseException {
40+
return login(new URI(authDomain), new URI("https://vcell.cam.uchc.edu"), false);
41+
}
42+
3443
/**
3544
* 1. Goes to the authorization server, gather metadata about it's OIDC configuration
3645
* (ex. Scopes supported, signing methods supported, auth and token endpoint, response types...)
@@ -50,7 +59,6 @@ private InteractiveLogin() {
5059
* <br>
5160
* P.S: This HTTP client created has an automated refresh capability for the access token, allowing users to stay logged in
5261
* for an extended period of time.
53-
* @param clientID
5462
* @param authServerUri
5563
* @param apiBaseUri
5664
* @param ignoreSSLCertProblems
@@ -60,7 +68,7 @@ private InteractiveLogin() {
6068
* @throws ParseException
6169
*/
6270

63-
public static AuthApiClient login(String clientID, URI authServerUri, URI apiBaseUri, boolean ignoreSSLCertProblems) throws URISyntaxException, IOException, ParseException {
71+
public static AuthApiClient login(URI authServerUri, URI apiBaseUri, boolean ignoreSSLCertProblems) throws URISyntaxException, IOException, ParseException {
6472
URI successRedirectURI = new URI(apiBaseUri+( apiBaseUri.getHost().equals("localhost")? "" : "/login_success"));
6573

6674
// Retrieve OpenID Provider Metadata
@@ -93,9 +101,10 @@ public static AuthApiClient login(String clientID, URI authServerUri, URI apiBas
93101
String callback_endpoint_path = "/oidc_test_callback";
94102

95103
URI redirectURI = new URI("http://" + "localhost" + ":" + localHttpServerPort + callback_endpoint_path);
96-
Scope scope = new Scope("openid", "email", "profile"); //, "email"); //, "profile", "offline_access");
104+
Scope scope = new Scope("openid", "email", "profile", "offline_access"); //, "email"); //, "profile", "offline_access");
105+
97106
CodeVerifier codeVerifier = new CodeVerifier();
98-
URI authRequestURI = getAuthRequestURI(oidcProviderMetadata, redirectURI, new ClientID(clientID), scope, state, codeVerifier);
107+
URI authRequestURI = getAuthRequestURI(oidcProviderMetadata, redirectURI, new ClientID(authClientID), scope, state, codeVerifier, apiBaseUri);
99108

100109
final AuthorizationResponse authorizationResponse;
101110
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
@@ -120,13 +129,9 @@ public static AuthApiClient login(String clientID, URI authServerUri, URI apiBas
120129
authorizationResponse = getAuthorizationResponseManual(authRequestURI);
121130
}
122131

123-
OIDCTokens oidcTokens = exchangeCodeForTokens(authorizationResponse, oidcProviderMetadata.getTokenEndpointURI(), new ClientID(clientID), scope, redirectURI, codeVerifier);
124-
String accessToken = oidcTokens.getAccessToken().getValue();
125-
String idToken = oidcTokens.getIDTokenString();
132+
OIDCTokens oidcTokens = exchangeCodeForTokens(authorizationResponse, oidcProviderMetadata.getTokenEndpointURI(), new ClientID(authClientID), scope, redirectURI, codeVerifier);
126133

127-
AuthApiClient authApiClient = new AuthApiClient(apiBaseUri, oidcProviderMetadata.getTokenEndpointURI(), oidcTokens.getAccessToken(), oidcTokens.getRefreshToken(), ignoreSSLCertProblems);
128-
authApiClient.setRequestInterceptor(request -> request.header("Authorization", "Bearer " + idToken));
129-
return authApiClient;
134+
return new AuthApiClient(apiBaseUri, oidcProviderMetadata.getTokenEndpointURI(), oidcTokens.getAccessToken(), oidcTokens.getRefreshToken(), ignoreSSLCertProblems);
130135
}
131136

132137
static int findAvailablePort(List<Integer> potentialPorts) {
@@ -275,13 +280,16 @@ private static void pingHttpServer(URL url, String expectedPingResponse) throws
275280
* @throws IOException
276281
* @throws ParseException
277282
*/
278-
private static URI getAuthRequestURI(OIDCProviderMetadata oidcProviderMetadata, URI redirectURI, ClientID clientID, Scope scope, State state, CodeVerifier codeVerifier) throws URISyntaxException, IOException, ParseException {
283+
private static URI getAuthRequestURI(OIDCProviderMetadata oidcProviderMetadata, URI redirectURI, ClientID clientID,
284+
Scope scope, State state, CodeVerifier codeVerifier, URI audience) throws URISyntaxException, IOException, ParseException {
279285
// Create the authorization request
280286
URI authorizationEndpoint = oidcProviderMetadata.getAuthorizationEndpointURI();
281287

288+
String audiencePort = audience.getHost().equals("localhost") ? ":" + audience.getPort() : "";
282289
var authorizationRequest = new AuthorizationRequest.Builder(new ResponseType("code"), clientID)
283290
.endpointURI(authorizationEndpoint)
284291
.redirectionURI(redirectURI)
292+
.customParameter("audience", audience.getScheme() + "://" + audience.getHost() + audiencePort)
285293
.state(state)
286294
.scope(scope) // Add any other required scopes
287295
.codeChallenge(codeVerifier, CodeChallengeMethod.S256)
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Build stage
22
FROM node:20.11-alpine3.19 AS build
33

4+
ARG BUILD_COMMAND=build_prod
5+
46
RUN apk update && apk add git
57

68
RUN mkdir -p /app
@@ -14,7 +16,7 @@ RUN npm install --legacy-peer-deps
1416

1517
COPY . .
1618

17-
RUN npm run build_dev
19+
RUN npm run ${BUILD_COMMAND}
1820

1921
# -----------------
2022

webapp-ng/Dockerfile-webapp-island

Lines changed: 0 additions & 24 deletions
This file was deleted.

webapp-ng/Dockerfile-webapp-prod

Lines changed: 0 additions & 24 deletions
This file was deleted.

webapp-ng/Dockerfile-webapp-remote

Lines changed: 0 additions & 24 deletions
This file was deleted.

webapp-ng/Dockerfile-webapp-stage

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)