17568: Fixes the bug by requesting token's data to the issuer cluster.
authorLucas Di Pentima <lucas@di-pentima.com.ar>
Mon, 26 Apr 2021 19:47:55 +0000 (16:47 -0300)
committerLucas Di Pentima <lucas@di-pentima.com.ar>
Mon, 26 Apr 2021 19:47:55 +0000 (16:47 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas@di-pentima.com.ar>

src/store/auth/auth-action-session.ts
src/store/auth/auth-action.ts

index a02f922df435d9f0b1c9065ef9a9e9f4a317ebd6..d588ce1f387b61e0dc04b4f5c3758315c23d6db1 100644 (file)
@@ -56,7 +56,7 @@ const getClusterConfig = async (origin: string, apiClient: AxiosInstance): Promi
     return null;
 };
 
-const getRemoteHostConfig = async (remoteHost: string, useApiClient?: AxiosInstance): Promise<Config | null> => {
+export const getRemoteHostConfig = async (remoteHost: string, useApiClient?: AxiosInstance): Promise<Config | null> => {
     const apiClient = useApiClient || Axios.create({ headers: {} });
 
     let url = remoteHost;
index 8c44aec448754ad9115a25c0730a911664a9b23a..cca39bb0450a5e0671fca546ad043cb25e86b1cf 100644 (file)
@@ -15,7 +15,7 @@ import { createServices, setAuthorizationHeader } from "~/services/services";
 import { cancelLinking } from '~/store/link-account-panel/link-account-panel-actions';
 import { progressIndicatorActions } from "~/store/progress-indicator/progress-indicator-actions";
 import { WORKBENCH_LOADING_SCREEN } from '~/store/workbench/workbench-actions';
-import { addRemoteConfig } from './auth-action-session';
+import { addRemoteConfig, getRemoteHostConfig } from './auth-action-session';
 import { getTokenV2 } from '~/models/api-client-authorization';
 
 export const authActions = unionize({
@@ -68,11 +68,9 @@ const init = (config: Config) => async (dispatch: Dispatch, getState: () => Root
     if (token && token !== "undefined") {
         dispatch(progressIndicatorActions.START_WORKING(WORKBENCH_LOADING_SCREEN));
         try {
-            await dispatch<any>(saveApiToken(token)); // .then(() => {
-            await dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN));
-        } catch (e) {
-            dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN));
-        }
+            await dispatch<any>(saveApiToken(token));
+        } catch (e) {}
+        dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN));
     }
 };
 
@@ -82,7 +80,16 @@ export const getConfig = (dispatch: Dispatch, getState: () => RootState, service
 };
 
 export const saveApiToken = (token: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository): Promise<any> => {
-    const config = dispatch<any>(getConfig);
+    let config: any;
+    const tokenParts = token.split('/');
+    const auth = getState().auth;
+    config = dispatch<any>(getConfig);
+
+    // If federated token, get user & token data from the token issuing cluster
+    if (tokenParts.length === 3 && tokenParts[1].substring(0, 5) !== auth.localCluster) {
+        config = await getRemoteHostConfig(auth.remoteHosts[tokenParts[1].substring(0, 5)]);
+    }
+
     const svc = createServices(config, { progressFn: () => { }, errorFn: () => { } });
     setAuthorizationHeader(svc, token);
     try {