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
67import React , { useContext , useEffect } from 'react' ;
78import axios from 'axios' ;
@@ -19,23 +20,33 @@ export function useAuth() {
1920
2021export 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