Skip to content

Commit 74a5115

Browse files
committed
feat[refresh]: add funtionalty for refresh token for password
Signed-off-by: Chayan Das <[email protected]>
1 parent 8f7ec63 commit 74a5115

File tree

1 file changed

+71
-41
lines changed

1 file changed

+71
-41
lines changed

src/contexts/AuthContext.js

Lines changed: 71 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-FileCopyrightText: © 2025 Siemens AG
33
// SPDX-FileContributor: Sourav Bhowmik <[email protected]>
44
// SPDX-FileContributor: Dearsh Oberoi <[email protected]>
5+
// SPDX-FileContributor: 2025 Chayan Das <[email protected]>
56

67
import React, { useContext, useEffect } from 'react';
78
import axios from 'axios';
@@ -19,23 +20,33 @@ export function useAuth() {
1920

2021
export function AuthProvider({ children }) {
2122
useEffect(() => {
22-
if (process.env.REACT_APP_PROVIDER === 'oidc') {
23-
const interval = setInterval(
24-
getAccessTokenFromRefreshToken,
25-
30 * 60 * MILLISEC,
26-
); // every 30 minutes
23+
const interval = setInterval(
24+
() => {
25+
const refresh_token = localStorage.getItem(
26+
'licensedb.refresh_token',
27+
);
28+
if (refresh_token) {
29+
getAccessTokenFromRefreshToken();
30+
}
31+
},
32+
30 * 60 * MILLISEC,
33+
); // every 30 minutes
2734

28-
return () => clearInterval(interval);
29-
}
35+
return () => clearInterval(interval);
3036
}, []);
3137

3238
async function Signin(userCredentialsPayload) {
3339
try {
3440
const url = `${process.env.REACT_APP_BASE_URL}/login`;
35-
const response = await axios.post(url, userCredentialsPayload);
36-
localStorage.setItem('licensedb.token', response.data.token);
41+
const { data } = await axios.post(url, userCredentialsPayload);
42+
const { access_token, refresh_token, expires_in } = data.data;
3743

38-
const user = await fetchUserProfile(response.data.token);
44+
localStorage.setItem('licensedb.token', access_token);
45+
localStorage.setItem('licensedb.refresh_token', refresh_token);
46+
let expires_at = Date.now() + expires_in * MILLISEC;
47+
localStorage.setItem('licensedb.expires_at', expires_at);
48+
49+
const user = await fetchUserProfile(access_token);
3950
localStorage.setItem(
4051
'licensedb.user',
4152
JSON.stringify(user.data[0]),
@@ -52,11 +63,10 @@ export function AuthProvider({ children }) {
5263
async function OidcSignin() {
5364
const { code_verifier, code_challenge } = await generatePKCE();
5465
localStorage.setItem('licensedb.codeVerifier', code_verifier);
55-
const auth_url = `${process.env.REACT_APP_AUTH_URL}?response_type=code&client_id=${
56-
process.env.REACT_APP_CLIENT_ID
57-
}&redirect_uri=${encodeURIComponent(
58-
process.env.REACT_APP_REDIRECT_URL,
59-
)}&scope=openid&code_challenge=${code_challenge}&code_challenge_method=S256&response_mode=fragment`;
66+
const auth_url = `${process.env.REACT_APP_AUTH_URL}?response_type=code&client_id=${process.env.REACT_APP_CLIENT_ID
67+
}&redirect_uri=${encodeURIComponent(
68+
process.env.REACT_APP_REDIRECT_URL,
69+
)}&scope=openid&code_challenge=${code_challenge}&code_challenge_method=S256&response_mode=fragment`;
6070

6171
window.location.href = auth_url;
6272
}
@@ -163,32 +173,55 @@ async function getAccessTokenFromRefreshToken() {
163173
let expires_at = null;
164174
try {
165175
const refresh_token = localStorage.getItem('licensedb.refresh_token');
166-
167-
const response = await axios.post(
168-
process.env.REACT_APP_TOKEN_URL,
169-
{
170-
grant_type: 'refresh_token',
171-
client_id: process.env.REACT_APP_CLIENT_ID,
172-
refresh_token: refresh_token,
173-
scope: 'openid',
174-
},
175-
{
176-
headers: {
177-
'Content-Type': 'application/x-www-form-urlencoded',
176+
if (process.env.REACT_APP_PROVIDER === 'oidc') {
177+
const response = await axios.post(
178+
process.env.REACT_APP_TOKEN_URL,
179+
{
180+
grant_type: 'refresh_token',
181+
client_id: process.env.REACT_APP_CLIENT_ID,
182+
refresh_token: refresh_token,
183+
scope: 'openid',
178184
},
179-
},
180-
);
185+
{
186+
headers: {
187+
'Content-Type': 'application/x-www-form-urlencoded',
188+
},
189+
},
190+
);
191+
192+
token = response.data.id_token;
193+
new_refresh_token = response.data.refresh_token;
194+
expires_at = Date.now() + response.data.expires_in * MILLISEC;
195+
196+
const user = await fetchUserProfile(token);
181197

182-
token = response.data.id_token;
183-
new_refresh_token = response.data.refresh_token;
184-
expires_at = Date.now() + response.data.expires_in * MILLISEC;
198+
localStorage.setItem('licensedb.token', token);
199+
localStorage.setItem('licensedb.expires_at', expires_at);
200+
localStorage.setItem('licensedb.refresh_token', new_refresh_token);
201+
localStorage.setItem(
202+
'licensedb.user',
203+
JSON.stringify(user.data[0]),
204+
);
205+
} else {
206+
// local
207+
const url = `${process.env.REACT_APP_BASE_URL}/refresh-token`;
208+
const { data } = await axios.post(url, {
209+
refresh_token: refresh_token,
210+
});
211+
token = data.data.access_token;
212+
new_refresh_token = data.data.refresh_token;
213+
expires_at = Date.now() + data.data.expires_in * MILLISEC;
185214

186-
const user = await fetchUserProfile(token);
215+
const user = await fetchUserProfile(token);
187216

188-
localStorage.setItem('licensedb.token', token);
189-
localStorage.setItem('licensedb.expires_at', expires_at);
190-
localStorage.setItem('licensedb.refresh_token', new_refresh_token);
191-
localStorage.setItem('licensedb.user', JSON.stringify(user.data[0]));
217+
localStorage.setItem('licensedb.token', token);
218+
localStorage.setItem('licensedb.expires_at', expires_at);
219+
localStorage.setItem('licensedb.refresh_token', new_refresh_token);
220+
localStorage.setItem(
221+
'licensedb.user',
222+
JSON.stringify(user.data[0]),
223+
);
224+
}
192225
} catch (e) {
193226
if (e.response?.data?.status) {
194227
if (e.response.data.status !== 409) {
@@ -217,10 +250,7 @@ export async function GetToken() {
217250
const expires_at = localStorage.getItem('licensedb.expires_at');
218251
let token = localStorage.getItem('licensedb.token');
219252
const BUFFER_TIME = 60 * MILLISEC * 10; // 10 mins
220-
if (
221-
Date.now() >= Number(expires_at) - BUFFER_TIME &&
222-
process.env.REACT_APP_PROVIDER === 'oidc'
223-
) {
253+
if (Date.now() >= Number(expires_at) - BUFFER_TIME) {
224254
await getAccessTokenFromRefreshToken();
225255
token = localStorage.getItem('licensedb.token');
226256
}

0 commit comments

Comments
 (0)