Skip to content

Commit c6bb244

Browse files
authored
Merge pull request #273 from rupato-deriv/Rupato/Fix--oidc-with-relogin
fix: relogin to authclient
2 parents ee31fba + 6cda709 commit c6bb244

File tree

2 files changed

+45
-128
lines changed

2 files changed

+45
-128
lines changed

src/app/AuthWrapper.tsx

Lines changed: 31 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,143 +1,49 @@
11
import React from 'react';
2-
import Cookies from 'js-cookie';
32
import ChunkLoader from '@/components/loader/chunk-loader';
43
import { generateDerivApiInstance } from '@/external/bot-skeleton/services/api/appId';
54
import { localize } from '@deriv-com/translations';
65
import { URLUtils } from '@deriv-com/utils';
76
import App from './App';
8-
import { Account, AccountsList, ApiInstance, ClientAccounts, LoginInfo } from './types';
97

10-
const getCookieAccounts = (): ClientAccounts => {
11-
try {
12-
return JSON.parse(Cookies.get('client.accounts') || '{}');
13-
} catch (error) {
14-
console.error("Invalid JSON in 'client.accounts' cookie:", error);
15-
return {};
16-
}
17-
};
18-
19-
const storeAccountsToLocalStorage = (
20-
cookieAccounts: ClientAccounts,
21-
loginInfo: LoginInfo[],
22-
authorizedAccounts: LoginInfo[]
23-
): ClientAccounts => {
24-
const accountsList: AccountsList = {};
25-
const clientAccounts: ClientAccounts = { ...cookieAccounts };
26-
27-
authorizedAccounts.forEach(({ loginid, token, currency }) => {
28-
if (loginid && token) {
29-
accountsList[loginid] = token;
30-
clientAccounts[loginid] = { loginid, token, currency: currency || '' };
31-
}
32-
});
8+
const setLocalStorageToken = async (loginInfo: URLUtils.LoginInfo[], paramsToDelete: string[]) => {
9+
if (loginInfo.length) {
10+
try {
11+
const defaultActiveAccount = URLUtils.getDefaultActiveAccount(loginInfo);
12+
if (!defaultActiveAccount) return;
3313

34-
loginInfo.forEach(({ loginid, token, currency }) => {
35-
if (loginid && token) {
36-
accountsList[loginid] = token;
37-
clientAccounts[loginid] = { loginid, token, currency: currency || '' };
38-
}
39-
});
40-
41-
localStorage.setItem('accountsList', JSON.stringify(accountsList));
42-
localStorage.setItem('clientAccounts', JSON.stringify(clientAccounts));
43-
44-
return clientAccounts;
45-
};
14+
const accountsList: Record<string, string> = {};
15+
const clientAccounts: Record<string, { loginid: string; token: string; currency: string }> = {};
4616

47-
const getActiveAccount = (
48-
cookieAccounts: ClientAccounts,
49-
clientAccounts: ClientAccounts,
50-
loginInfo: LoginInfo[]
51-
): Account | LoginInfo => {
52-
const queryParams = new URLSearchParams(window.location.search);
53-
const currencyType = queryParams.get('account') || loginInfo[0]?.currency;
54-
55-
return (
56-
Object.values(cookieAccounts).find(acc => acc.currency === currencyType) ||
57-
Object.values(cookieAccounts)[0] ||
58-
Object.values(clientAccounts).find(acc => acc.currency === currencyType) ||
59-
Object.values(clientAccounts)[0] ||
60-
loginInfo[0]
61-
);
62-
};
63-
64-
const authorizeAccounts = async (api: ApiInstance | null, cookieAccounts: ClientAccounts): Promise<LoginInfo[]> => {
65-
if (!api || Object.keys(cookieAccounts).length === 0) return [];
66-
67-
const authorizedAccounts: LoginInfo[] = [];
68-
69-
for (const loginid in cookieAccounts) {
70-
const { token, currency } = cookieAccounts[loginid];
71-
72-
if (token) {
73-
authorizedAccounts.push({
74-
loginid,
75-
token,
76-
currency: currency || '',
17+
loginInfo.forEach((account: { loginid: string; token: string; currency: string }) => {
18+
accountsList[account.loginid] = account.token;
19+
clientAccounts[account.loginid] = account;
7720
});
78-
}
79-
}
8021

81-
for (const loginid in cookieAccounts) {
82-
const { token, currency } = cookieAccounts[loginid];
83-
84-
if (!token) {
85-
try {
86-
const { authorize, error } = await api.authorize(token);
87-
88-
if (!error && authorize?.account_list) {
89-
authorizedAccounts.push({
90-
loginid,
91-
token,
92-
currency: currency || authorize.currency || '',
93-
});
22+
localStorage.setItem('accountsList', JSON.stringify(accountsList));
23+
localStorage.setItem('clientAccounts', JSON.stringify(clientAccounts));
24+
25+
URLUtils.filterSearchParams(paramsToDelete);
26+
const api = await generateDerivApiInstance();
27+
28+
if (api) {
29+
const { authorize, error } = await api.authorize(loginInfo[0].token);
30+
api.disconnect();
31+
if (!error) {
32+
const firstId = authorize?.account_list[0]?.loginid;
33+
const filteredTokens = loginInfo.filter(token => token.loginid === firstId);
34+
if (filteredTokens.length) {
35+
localStorage.setItem('authToken', filteredTokens[0].token);
36+
localStorage.setItem('active_loginid', filteredTokens[0].loginid);
37+
return;
38+
}
9439
}
95-
} catch (err) {
96-
console.error(`Authorization failed for ${loginid}:`, err);
9740
}
98-
}
99-
}
100-
101-
api.disconnect();
102-
return authorizedAccounts;
103-
};
104-
105-
const setLocalStorageToken = async (loginInfo: LoginInfo[], paramsToDelete: string[]): Promise<void> => {
106-
const cookieAccounts = getCookieAccounts();
107-
const hasValidLoginInfo = loginInfo.length > 0 && loginInfo.some(acc => acc.token);
108-
const hasValidCookie = Object.keys(cookieAccounts).length > 0;
109-
110-
if (!hasValidLoginInfo && !hasValidCookie) return;
111-
112-
try {
113-
const api = await generateDerivApiInstance();
114-
let authorizedAccounts: LoginInfo[] = [];
11541

116-
if (api && hasValidCookie) {
117-
authorizedAccounts = await authorizeAccounts(api, cookieAccounts);
42+
localStorage.setItem('authToken', loginInfo[0].token);
43+
localStorage.setItem('active_loginid', loginInfo[0].loginid);
44+
} catch (error) {
45+
console.error('Error setting up login info:', error);
11846
}
119-
120-
const clientAccounts = storeAccountsToLocalStorage(cookieAccounts, loginInfo, authorizedAccounts);
121-
122-
let activeAccount = getActiveAccount(cookieAccounts, clientAccounts, loginInfo);
123-
124-
if (api && !activeAccount) {
125-
const authorizedAccount = authorizedAccounts[0];
126-
if (authorizedAccount) {
127-
activeAccount = authorizedAccount;
128-
localStorage.setItem('authToken', activeAccount.token);
129-
localStorage.setItem('active_loginid', activeAccount.loginid);
130-
}
131-
}
132-
133-
if (activeAccount) {
134-
localStorage.setItem('authToken', activeAccount.token);
135-
localStorage.setItem('active_loginid', activeAccount.loginid);
136-
}
137-
138-
URLUtils.filterSearchParams(paramsToDelete);
139-
} catch (error) {
140-
console.error('Error setting up login info:', error);
14147
}
14248
};
14349

@@ -147,7 +53,6 @@ export const AuthWrapper = () => {
14753

14854
React.useEffect(() => {
14955
const initializeAuth = async () => {
150-
console.log('loginInfo', loginInfo);
15156
await setLocalStorageToken(loginInfo, paramsToDelete);
15257
URLUtils.filterSearchParams(['lang']);
15358
setIsAuthComplete(true);

src/components/layout/index.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,26 @@ const Layout = () => {
2020
const isEndpointPage = window.location.pathname.includes('endpoint');
2121
const clientAccounts = JSON.parse(localStorage.getItem('accountsList') ?? '{}');
2222
const isClientAccountsPopulated = Object.keys(clientAccounts).length > 0;
23+
const clientAccountsMissingToken =
24+
isClientAccountsPopulated &&
25+
Object.values(clientAccounts).some(account => !(account as { token?: string }).token);
2326

27+
console.log('clientAccounts', clientAccountsMissingToken, clientAccounts);
2428
useEffect(() => {
25-
if (isLoggedInCookie && !isClientAccountsPopulated && isOAuth2Enabled && !isEndpointPage && !isCallbackPage) {
29+
if (isLoggedInCookie && isOAuth2Enabled && !isEndpointPage && !isCallbackPage && clientAccountsMissingToken) {
30+
console.log('requestOidcAuthentication');
2631
requestOidcAuthentication({
2732
redirectCallbackUri: `${window.location.origin}/callback`,
2833
});
2934
}
30-
}, [isLoggedInCookie, isClientAccountsPopulated, isOAuth2Enabled, isEndpointPage, isCallbackPage]);
35+
}, [
36+
isLoggedInCookie,
37+
isClientAccountsPopulated,
38+
isOAuth2Enabled,
39+
isEndpointPage,
40+
isCallbackPage,
41+
clientAccountsMissingToken,
42+
]);
3143

3244
return (
3345
<div className={clsx('layout', { responsive: isDesktop })}>

0 commit comments

Comments
 (0)