Skip to content

Commit

Permalink
feature(oidc):preload user (release) (#1352)
Browse files Browse the repository at this point in the history
* feature(oidc):preload user (alpha)

* fix (alpha)

* fix (alpha)
  • Loading branch information
guillaume-chervet committed Apr 23, 2024
1 parent 5e21bcb commit 64c76e0
Show file tree
Hide file tree
Showing 8 changed files with 31 additions and 6 deletions.
2 changes: 2 additions & 0 deletions examples/react-oidc-demo/src/Profile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ interface OidcUserRoleInfo extends OidcUserInfo{
const DisplayUserInfo = () => {
const { oidcUser, oidcUserLoadingState, reloadOidcUser } = useOidcUser<OidcUserRoleInfo>();

console.log('oidcUser', oidcUser);
console.log('oidcUserLoadingState', oidcUserLoadingState);
switch (oidcUserLoadingState) {
case OidcUserStatus.Loading:
return <p>User Information are loading</p>;
Expand Down
1 change: 1 addition & 0 deletions examples/react-oidc-demo/src/configurations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export const configurationIdentityServer = {
token_renew_mode: TokenRenewMode.access_token_invalid,
token_automatic_renew_mode: TokenAutomaticRenewMode.AutomaticOnlyWhenFetchExecuted,
demonstrating_proof_of_possession: false,
preload_user_info: true
};

export const configurationIdentityServer1 = {
Expand Down
6 changes: 6 additions & 0 deletions packages/oidc-client/src/keepSession.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ export const tryKeepSessionAsync = async (oidc: Oidc) =>{
const sessionState = await serviceWorker.getSessionStateAsync();
// @ts-ignore
await oidc.startCheckSessionAsync(oidcServerConfiguration.check_session_iframe, configuration.client_id, sessionState);
if(configuration.preload_user_info){
await oidc.userInfoAsync();
}
oidc.publishEvent(eventNames.tryKeepExistingSessionAsync_end, {
success: true,
message: 'tokens inside ServiceWorker are valid',
Expand Down Expand Up @@ -55,6 +58,9 @@ export const tryKeepSessionAsync = async (oidc: Oidc) =>{
const sessionState = await session.getSessionStateAsync();
// @ts-ignore
await oidc.startCheckSessionAsync(oidcServerConfiguration.check_session_iframe, configuration.client_id, sessionState);
if(configuration.preload_user_info){
await oidc.userInfoAsync();
}
oidc.publishEvent(eventNames.tryKeepExistingSessionAsync_end, {
success: true,
message: 'tokens inside storage are valid',
Expand Down
3 changes: 3 additions & 0 deletions packages/oidc-client/src/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,9 @@ export const loginCallbackAsync = (oidc:Oidc) => async (isSilentSignin = false)
}

await oidc.startCheckSessionAsync(oidcServerConfiguration.checkSessionIframe, clientId, sessionState, isSilentSignin);
if(configuration.preload_user_info){
await oidc.userInfoAsync();
}
oidc.publishEvent(eventNames.loginCallbackAsync_end, {});
return {
tokens: formattedTokens,
Expand Down
1 change: 1 addition & 0 deletions packages/oidc-client/src/oidc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ export class Oidc {
service_worker_update_require_callback,
service_worker_activate: configuration.service_worker_activate ?? activateServiceWorker,
demonstrating_proof_of_possession_configuration: configuration.demonstrating_proof_of_possession_configuration ?? defaultDemonstratingProofOfPossessionConfiguration,
preload_user_info: configuration.preload_user_info ?? false,
};

this.getFetch = getFetch ?? getFetchDefault;
Expand Down
6 changes: 5 additions & 1 deletion packages/oidc-client/src/oidcClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,11 @@ export class OidcClient {
}

async userInfoAsync<T extends OidcUserInfo = OidcUserInfo>(noCache = false, demonstrating_proof_of_possession:boolean=false):Promise<T> {
return this._oidc.userInfoAsync(noCache);
return this._oidc.userInfoAsync(noCache, demonstrating_proof_of_possession);
}

userInfo<T extends OidcUserInfo = OidcUserInfo>():T {
return this._oidc.userInfo;
}
}

Expand Down
1 change: 1 addition & 0 deletions packages/oidc-client/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export type OidcConfiguration = {
logout_tokens_to_invalidate?:Array<LogoutToken>;
demonstrating_proof_of_possession?:boolean;
demonstrating_proof_of_possession_configuration?: DemonstratingProofOfPossessionConfiguration;
preload_user_info?:boolean;
};

export interface DemonstratingProofOfPossessionConfiguration {
Expand Down
17 changes: 12 additions & 5 deletions packages/react-oidc/src/User.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,30 @@ export type OidcUser<T extends OidcUserInfo = OidcUserInfo> = {
}

export const useOidcUser = <T extends OidcUserInfo = OidcUserInfo>(configurationName = 'default', demonstrating_proof_of_possession=false) => {
const [oidcUser, setOidcUser] = useState<OidcUser<T>>({ user: null, status: OidcUserStatus.Unauthenticated });
const [oidcUserId, setOidcUserId] = useState<string>('');
const oidc = OidcClient.get(configurationName);
const user = oidc.userInfo<T>();
const [oidcUser, setOidcUser] = useState<OidcUser<T>>({ user: user, status: user ? OidcUserStatus.Loaded : OidcUserStatus.Unauthenticated });
const [oidcUserId, setOidcUserId] = useState<number>(user ? 1 : 0);
const [oidcPreviousUserId, setPreviousOidcUserId] = useState<number>(user ? 1 : 0);

useEffect(() => {
const oidc = OidcClient.get(configurationName);
let isMounted = true;
if (oidc && oidc.tokens) {
const isCache = oidcUserId === oidcPreviousUserId;
if(isCache && oidc.userInfo<T>()) {
return;
}
setOidcUser({ ...oidcUser, status: OidcUserStatus.Loading });
const isNoCache = oidcUserId !== '';
oidc.userInfoAsync(isNoCache, demonstrating_proof_of_possession)
oidc.userInfoAsync(!isCache, demonstrating_proof_of_possession)
.then((info) => {
if (isMounted) {
// @ts-ignore
setOidcUser({ user: info, status: OidcUserStatus.Loaded });
}
})
.catch(() => setOidcUser({ ...oidcUser, status: OidcUserStatus.LoadingError }));
setPreviousOidcUserId(oidcUserId);
} else {
setOidcUser({ user: null, status: OidcUserStatus.Unauthenticated });
}
Expand All @@ -48,7 +55,7 @@ export const useOidcUser = <T extends OidcUserInfo = OidcUserInfo>(configuration
}, [oidcUserId]);

const reloadOidcUser = () => {
setOidcUserId(oidcUserId + ' ');
setOidcUserId(oidcUserId+1);
};

return { oidcUser: oidcUser.user, oidcUserLoadingState: oidcUser.status, reloadOidcUser };
Expand Down

0 comments on commit 64c76e0

Please sign in to comment.