-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathwithFronteggApp.tsx
More file actions
124 lines (111 loc) · 4.06 KB
/
Copy pathwithFronteggApp.tsx
File metadata and controls
124 lines (111 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import React from 'react';
import type { AppContext, AppInitialProps, AppProps } from 'next/app';
import type { FronteggCustomAppClass, FronteggCustomApp, WithFronteggAppOptions } from './types';
import FronteggProvider from '../FronteggPagesProvider';
import refreshAccessTokenIfNeeded, { isRuntimeNextRequest } from '../../utils/refreshAccessTokenIfNeeded';
import fetchUserData from '../../utils/fetchUserData';
import config from '../../config';
import { AllUserData } from '../../types';
import { removeJwtSignatureFrom } from '../../middleware/helpers';
import { shouldBypassGetInitialProps } from './shouldBypassGetInitialProps';
import fronteggLogger from '../../utils/fronteggLogger';
export const withFronteggApp = (app: FronteggCustomAppClass, options?: WithFronteggAppOptions): FronteggCustomApp => {
const originalGetInitialProps = app.getInitialProps;
app.getInitialProps = async (appContext: AppContext & AllUserData): Promise<AppInitialProps> => {
const { ctx, router, Component } = appContext;
const logger = fronteggLogger.child({ tag: 'withFronteggApp' });
const isSSG = router.isReady == false && router.isPreview == false;
config.checkHostedLoginConfig(options);
let appEnvConfig = {};
const appContextSessionData: AllUserData = {
session: null,
user: null,
tenants: null,
};
if (shouldBypassGetInitialProps(ctx.req?.url ?? '/', ctx.req?.headers)) {
logger.debug('Bypassing get initial props for url: ' + (ctx.req?.url ?? ''));
return {
pageProps: {
...(originalGetInitialProps ? await originalGetInitialProps(appContext) : {}),
...(Component.getInitialProps ? await Component.getInitialProps(ctx) : {}),
},
};
}
let shouldRequestAuthorize = false;
if (ctx.req) {
appEnvConfig = config.appEnvConfig;
if (isSSG) {
shouldRequestAuthorize = true;
} else {
const url = ctx.req?.url;
if (url && isRuntimeNextRequest(url)) {
let session = await refreshAccessTokenIfNeeded(ctx);
if (process.env['FRONTEGG_SECURE_JWT_ENABLED'] === 'true') {
session = removeJwtSignatureFrom(session);
}
Object.assign(appContextSessionData, { session });
} else {
let userData = await fetchUserData({
getSession: async () => await refreshAccessTokenIfNeeded(ctx),
getHeaders: async () => ctx.req?.headers ?? {},
});
if (process.env['FRONTEGG_SECURE_JWT_ENABLED'] === 'true' && userData) {
userData = removeJwtSignatureFrom(userData);
userData.session = removeJwtSignatureFrom(userData?.session);
}
shouldRequestAuthorize = true;
Object.assign(appContextSessionData, userData);
}
}
}
Object.assign(appContext, appContextSessionData);
return {
pageProps: {
...(originalGetInitialProps ? await originalGetInitialProps(appContext) : {}),
...(Component.getInitialProps ? await Component.getInitialProps(ctx) : {}),
...(appContextSessionData.session == null ? {} : appContextSessionData),
...appEnvConfig,
shouldRequestAuthorize,
},
};
};
function CustomFronteggApp(appProps: AppProps) {
const {
user,
tenants,
activeTenant,
session,
envAppUrl,
envBaseUrl,
envClientId,
secureJwtEnabled,
envAppId,
envHostedLoginBox,
shouldRequestAuthorize,
} = appProps.pageProps;
return (
<FronteggProvider
{...options}
hostedLoginBox={envHostedLoginBox}
{...{
user,
tenants,
activeTenant,
session,
envAppUrl,
envBaseUrl,
envHostedLoginBox,
secureJwtEnabled,
shouldRequestAuthorize,
isSSG: appProps.__N_SSG,
envClientId,
envAppId,
}}
>
{app(appProps) as any}
</FronteggProvider>
);
}
CustomFronteggApp.getInitialProps = app.getInitialProps;
return CustomFronteggApp as FronteggCustomApp;
};