@frontegg/nextjs 6.7.8 → 6.7.9-alpha.3741489660
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/FronteggBaseProvider-5529ded6.js +119 -0
- package/FronteggBaseProvider-5529ded6.js.map +1 -0
- package/FronteggClientProviderNext13-65bb4cd0.js +19 -0
- package/FronteggClientProviderNext13-65bb4cd0.js.map +1 -0
- package/FronteggConfig-7ae86562.js +123 -0
- package/FronteggConfig-7ae86562.js.map +1 -0
- package/FronteggProvider.d.ts +3 -12
- package/FronteggProviderNoSSR.d.ts +2 -4
- package/README.md +56 -4
- package/api-70f0e81e.js +58 -0
- package/api-70f0e81e.js.map +1 -0
- package/client/FronteggAppRouter.d.ts +10 -0
- package/client/FronteggClientProviderNext13.d.ts +3 -0
- package/client/index.d.ts +2 -0
- package/client/index.js +63 -0
- package/client/index.js.map +1 -0
- package/{FronteggConfig.d.ts → common/FronteggConfig.d.ts} +1 -1
- package/{api.d.ts → common/api.d.ts} +0 -0
- package/{AppContext.d.ts → common/client/AppContext.d.ts} +0 -0
- package/common/client/ExpireInListener.d.ts +1 -0
- package/common/client/FronteggBaseProvider.d.ts +3 -0
- package/common/client/createOrGetFronteggApp.d.ts +11 -0
- package/common/client/hooks/index.d.ts +1 -0
- package/common/client/hooks/useRequestAuthorizeSSR.d.ts +9 -0
- package/common/client/index.d.ts +4 -0
- package/{consts.d.ts → common/consts.d.ts} +0 -0
- package/common/getMeAndTenants.d.ts +2 -0
- package/{helpers.d.ts → common/helpers.d.ts} +7 -9
- package/common/index.d.ts +6 -0
- package/common/index.js +12 -0
- package/common/index.js.map +1 -0
- package/common/types.d.ts +74 -0
- package/common/utils/createGetSession.d.ts +7 -0
- package/common/utils/getCookieFromRequest.d.ts +2 -0
- package/common/utils/index.d.ts +3 -0
- package/common/utils/parseCookie.d.ts +1 -0
- package/consts-873fdf4e.js +9 -0
- package/consts-873fdf4e.js.map +1 -0
- package/createGetSession-81b1748e.js +50 -0
- package/createGetSession-81b1748e.js.map +1 -0
- package/edge/getSessionOnEdge.d.ts +2 -0
- package/edge/index.d.ts +1 -0
- package/edge/index.js +29 -0
- package/edge/index.js.map +1 -0
- package/getCookieFromRequest-624c37b5.js +28 -0
- package/getCookieFromRequest-624c37b5.js.map +1 -0
- package/helpers-dbf29bd5.js +189 -0
- package/helpers-dbf29bd5.js.map +1 -0
- package/index.d.ts +1 -2
- package/index.js +599 -0
- package/index.js.map +1 -0
- package/package.json +16 -10
- package/refreshToken.d.ts +3 -0
- package/server/FronteggProviderNext13.d.ts +3 -0
- package/server/getSessionNext13.d.ts +4 -0
- package/server/index.d.ts +2 -0
- package/server/index.js +87 -0
- package/server/index.js.map +1 -0
- package/session.d.ts +4 -8
- package/withFronteggApp.d.ts +10 -8
- package/index.cjs.js +0 -2747
- package/index.esm.js +0 -2691
- package/types.d.ts +0 -53
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __assign, __rest } from 'tslib';
|
|
3
|
+
import { useAuthUserOrNull, useAuthActions, FronteggStoreProvider } from '@frontegg/react-hooks';
|
|
4
|
+
import { fronteggAuthApiRoutes, ContextHolder } from '@frontegg/rest-api';
|
|
5
|
+
import React, { createContext, useEffect, useRef, useCallback, useMemo } from 'react';
|
|
6
|
+
import { AppHolder, initialize } from '@frontegg/js';
|
|
7
|
+
import { createFronteggStore } from '@frontegg/redux-store';
|
|
8
|
+
|
|
9
|
+
var AppContext = createContext(null);
|
|
10
|
+
|
|
11
|
+
var createOrGetFronteggApp = function (_a) {
|
|
12
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
13
|
+
var options = _a.options, onRedirectTo = _a.onRedirectTo, appName = _a.appName, user = _a.user, tenants = _a.tenants, storeHolder = _a.storeHolder;
|
|
14
|
+
var _l = (_b = options.session) !== null && _b !== void 0 ? _b : {}, accessToken = _l.accessToken, refreshToken = _l.refreshToken;
|
|
15
|
+
var contextOptions = __assign(__assign({ requestCredentials: 'include' }, options.contextOptions), { baseUrl: function (path) {
|
|
16
|
+
if (fronteggAuthApiRoutes.indexOf(path) !== -1 ||
|
|
17
|
+
path.endsWith('/postlogin') ||
|
|
18
|
+
path.endsWith('/prelogin') ||
|
|
19
|
+
path === '/oauth/token') {
|
|
20
|
+
return options.envAppUrl + "/api";
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return options.envBaseUrl;
|
|
24
|
+
}
|
|
25
|
+
}, clientId: options.envClientId });
|
|
26
|
+
var tenantsState = tenants
|
|
27
|
+
? __assign({ tenantTree: null, subTenants: [], tenants: tenants, loading: false }, (_c = options.authOptions) === null || _c === void 0 ? void 0 : _c.tenantsState) : undefined;
|
|
28
|
+
var userData = user
|
|
29
|
+
? __assign(__assign(__assign({}, user), { accessToken: accessToken !== null && accessToken !== void 0 ? accessToken : '', refreshToken: refreshToken !== null && refreshToken !== void 0 ? refreshToken : undefined }), (_d = options.authOptions) === null || _d === void 0 ? void 0 : _d.user) : null;
|
|
30
|
+
var authOptions = __assign(__assign({}, options.authOptions), { onRedirectTo: onRedirectTo, isLoading: false, isAuthenticated: !!options.session, hostedLoginBox: (_e = options.hostedLoginBox) !== null && _e !== void 0 ? _e : false, disableSilentRefresh: (_g = (_f = options.authOptions) === null || _f === void 0 ? void 0 : _f.disableSilentRefresh) !== null && _g !== void 0 ? _g : false, user: userData, tenantsState: tenantsState });
|
|
31
|
+
var sharedStore = createFronteggStore({ context: contextOptions }, storeHolder.current, options.previewMode, authOptions, {
|
|
32
|
+
auth: authOptions !== null && authOptions !== void 0 ? authOptions : {},
|
|
33
|
+
audits: (_h = options.auditsOptions) !== null && _h !== void 0 ? _h : {},
|
|
34
|
+
}, false, options.urlStrategy);
|
|
35
|
+
var createdApp;
|
|
36
|
+
try {
|
|
37
|
+
createdApp = AppHolder.getInstance(appName !== null && appName !== void 0 ? appName : 'default');
|
|
38
|
+
createdApp.store = sharedStore;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
createdApp = initialize(__assign(__assign({}, options), { store: sharedStore, hostedLoginBox: (_j = options.hostedLoginBox) !== null && _j !== void 0 ? _j : false, customLoginBox: (_k = options.customLoginBox) !== null && _k !== void 0 ? _k : false, basename: options.basename, authOptions: authOptions,
|
|
42
|
+
contextOptions: contextOptions,
|
|
43
|
+
onRedirectTo: onRedirectTo }), appName !== null && appName !== void 0 ? appName : 'default');
|
|
44
|
+
}
|
|
45
|
+
return createdApp;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
var ExpireInListener = function () {
|
|
49
|
+
var user = useAuthUserOrNull();
|
|
50
|
+
var actions = useAuthActions();
|
|
51
|
+
useEffect(function () {
|
|
52
|
+
if (user && (user === null || user === void 0 ? void 0 : user.expiresIn) == null) {
|
|
53
|
+
actions.setUser(__assign(__assign({}, user), { expiresIn: Math.floor((user['exp'] * 1000 - Date.now()) / 1000) }));
|
|
54
|
+
}
|
|
55
|
+
}, [actions, user]);
|
|
56
|
+
// eslint-disable-next-line react/jsx-no-useless-fragment
|
|
57
|
+
return React.createElement(React.Fragment, null);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
var useRequestAuthorizeSSR = function (_a) {
|
|
61
|
+
var app = _a.app, accessToken = _a.accessToken, user = _a.user, tenants = _a.tenants, refreshToken = _a.refreshToken;
|
|
62
|
+
useEffect(function () {
|
|
63
|
+
app === null || app === void 0 ? void 0 : app.store.dispatch({
|
|
64
|
+
type: 'auth/requestAuthorizeSSR',
|
|
65
|
+
payload: {
|
|
66
|
+
accessToken: accessToken,
|
|
67
|
+
user: user ? __assign(__assign({}, user), { refreshToken: refreshToken }) : null,
|
|
68
|
+
tenants: tenants,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}, [app]);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
var Connector = function (_a) {
|
|
75
|
+
var _b, _c;
|
|
76
|
+
var router = _a.router, _d = _a.appName, appName = _d === void 0 ? 'default' : _d, user = _a.user, tenants = _a.tenants, props = __rest(_a, ["router", "appName", "user", "tenants"]);
|
|
77
|
+
var isSSR = typeof window === 'undefined';
|
|
78
|
+
var _e = (_b = props.session) !== null && _b !== void 0 ? _b : {}, accessToken = _e.accessToken, refreshToken = _e.refreshToken;
|
|
79
|
+
var baseName = (_c = props.basename) !== null && _c !== void 0 ? _c : '';
|
|
80
|
+
var storeHolder = useRef({});
|
|
81
|
+
var onRedirectTo = useCallback(function (_path, opts) {
|
|
82
|
+
var path = _path;
|
|
83
|
+
if (path.startsWith(baseName)) {
|
|
84
|
+
path = path.substring(baseName.length);
|
|
85
|
+
}
|
|
86
|
+
if (opts === null || opts === void 0 ? void 0 : opts.preserveQueryParams) {
|
|
87
|
+
path = "" + path + window.location.search;
|
|
88
|
+
}
|
|
89
|
+
if ((opts === null || opts === void 0 ? void 0 : opts.refresh) && !isSSR) {
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
window.Cypress ? router.push(path) : (window.location.href = path);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
(opts === null || opts === void 0 ? void 0 : opts.replace) ? router.replace(path) : router.push(path);
|
|
95
|
+
}
|
|
96
|
+
}, []);
|
|
97
|
+
var app = useMemo(function () {
|
|
98
|
+
return createOrGetFronteggApp({
|
|
99
|
+
options: __assign(__assign({}, props), { basename: baseName }),
|
|
100
|
+
user: user,
|
|
101
|
+
tenants: tenants,
|
|
102
|
+
onRedirectTo: onRedirectTo,
|
|
103
|
+
appName: appName,
|
|
104
|
+
storeHolder: storeHolder,
|
|
105
|
+
});
|
|
106
|
+
}, [props]);
|
|
107
|
+
ContextHolder.setOnRedirectTo(onRedirectTo);
|
|
108
|
+
useRequestAuthorizeSSR({ app: app, accessToken: accessToken, user: user, tenants: tenants, refreshToken: refreshToken });
|
|
109
|
+
return (React.createElement(AppContext.Provider, { value: app },
|
|
110
|
+
React.createElement(FronteggStoreProvider, __assign({}, __assign(__assign({}, props), { app: app })), props.children)));
|
|
111
|
+
};
|
|
112
|
+
var FronteggBaseProvider = function (props) {
|
|
113
|
+
return (React.createElement(Connector, __assign({}, props, { framework: 'nextjs' }),
|
|
114
|
+
React.createElement(ExpireInListener, null),
|
|
115
|
+
props.children));
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export { AppContext as A, ExpireInListener as E, FronteggBaseProvider as F };
|
|
119
|
+
//# sourceMappingURL=FronteggBaseProvider-5529ded6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FronteggBaseProvider-5529ded6.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __rest, __assign } from 'tslib';
|
|
3
|
+
import { F as FronteggBaseProvider } from './FronteggBaseProvider-5529ded6.js';
|
|
4
|
+
import '@frontegg/js';
|
|
5
|
+
import '@frontegg/redux-store';
|
|
6
|
+
import '@frontegg/rest-api';
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import '@frontegg/react-hooks';
|
|
9
|
+
import { useRouter } from 'next/navigation';
|
|
10
|
+
|
|
11
|
+
var FronteggClientProviderNext13 = function (_a) {
|
|
12
|
+
var children = _a.children, basename = _a.basename, props = __rest(_a, ["children", "basename"]);
|
|
13
|
+
var router = useRouter();
|
|
14
|
+
var basePath = process.env.__NEXT_ROUTER_BASEPATH || '';
|
|
15
|
+
return (React.createElement(FronteggBaseProvider, __assign({ router: router, basename: basename !== null && basename !== void 0 ? basename : basePath }, props), children));
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { FronteggClientProviderNext13 as F };
|
|
19
|
+
//# sourceMappingURL=FronteggClientProviderNext13-65bb4cd0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FronteggClientProviderNext13-65bb4cd0.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { __awaiter, __generator } from 'tslib';
|
|
2
|
+
import { importJWK } from 'jose';
|
|
3
|
+
|
|
4
|
+
function normalizeStringPasswordToMap(password) {
|
|
5
|
+
return typeof password === 'string' ? { 1: password } : password;
|
|
6
|
+
}
|
|
7
|
+
var FronteggConfig = /** @class */ (function () {
|
|
8
|
+
function FronteggConfig() {
|
|
9
|
+
var _a, _b, _c;
|
|
10
|
+
this.authRoutes = {};
|
|
11
|
+
this.fronteggAppOptions = {};
|
|
12
|
+
this._clientId = (_a = process.env['FRONTEGG_CLIENT_ID']) !== null && _a !== void 0 ? _a : '';
|
|
13
|
+
this._cookieName = (_b = process.env['FRONTEGG_COOKIE_NAME']) !== null && _b !== void 0 ? _b : "fe_next_session";
|
|
14
|
+
this._password = (_c = process.env['FRONTEGG_ENCRYPTION_PASSWORD']) !== null && _c !== void 0 ? _c : '';
|
|
15
|
+
this._passwordsAsMap = normalizeStringPasswordToMap(this._password);
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(FronteggConfig.prototype, "cookieName", {
|
|
18
|
+
get: function () {
|
|
19
|
+
return this._cookieName + "-" + this._clientId.replace(/-/g, '');
|
|
20
|
+
},
|
|
21
|
+
enumerable: false,
|
|
22
|
+
configurable: true
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(FronteggConfig.prototype, "password", {
|
|
25
|
+
get: function () {
|
|
26
|
+
return this._password;
|
|
27
|
+
},
|
|
28
|
+
enumerable: false,
|
|
29
|
+
configurable: true
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(FronteggConfig.prototype, "clientId", {
|
|
32
|
+
get: function () {
|
|
33
|
+
return this._clientId;
|
|
34
|
+
},
|
|
35
|
+
enumerable: false,
|
|
36
|
+
configurable: true
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(FronteggConfig.prototype, "baseUrlHost", {
|
|
39
|
+
get: function () {
|
|
40
|
+
var _a;
|
|
41
|
+
return new URL((_a = process.env['FRONTEGG_BASE_URL']) !== null && _a !== void 0 ? _a : '').hostname;
|
|
42
|
+
},
|
|
43
|
+
enumerable: false,
|
|
44
|
+
configurable: true
|
|
45
|
+
});
|
|
46
|
+
FronteggConfig.prototype.getEnvAppUrl = function () {
|
|
47
|
+
var url = undefined;
|
|
48
|
+
if (process.env['FRONTEGG_APP_URL']) {
|
|
49
|
+
url = process.env['FRONTEGG_APP_URL'];
|
|
50
|
+
}
|
|
51
|
+
else if (process.env['VERCEL'] && process.env['VERCEL_URL']) {
|
|
52
|
+
url = process.env['VERCEL_URL'];
|
|
53
|
+
}
|
|
54
|
+
if (url && !url.startsWith('http')) {
|
|
55
|
+
var protocol = url.startsWith('localhost') ? 'http://' : 'https://';
|
|
56
|
+
url = "" + protocol + url;
|
|
57
|
+
}
|
|
58
|
+
return url;
|
|
59
|
+
};
|
|
60
|
+
Object.defineProperty(FronteggConfig.prototype, "appUrl", {
|
|
61
|
+
get: function () {
|
|
62
|
+
var _a;
|
|
63
|
+
return (_a = this.getEnvAppUrl()) !== null && _a !== void 0 ? _a : 'http://localhost:3000';
|
|
64
|
+
},
|
|
65
|
+
enumerable: false,
|
|
66
|
+
configurable: true
|
|
67
|
+
});
|
|
68
|
+
Object.defineProperty(FronteggConfig.prototype, "appEnvConfig", {
|
|
69
|
+
get: function () {
|
|
70
|
+
return {
|
|
71
|
+
envAppUrl: this.getEnvAppUrl(),
|
|
72
|
+
envBaseUrl: process.env['FRONTEGG_BASE_URL'],
|
|
73
|
+
envClientId: process.env['FRONTEGG_CLIENT_ID'],
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
enumerable: false,
|
|
77
|
+
configurable: true
|
|
78
|
+
});
|
|
79
|
+
Object.defineProperty(FronteggConfig.prototype, "cookieDomain", {
|
|
80
|
+
get: function () {
|
|
81
|
+
var _a;
|
|
82
|
+
return new URL((_a = this.getEnvAppUrl()) !== null && _a !== void 0 ? _a : '').hostname.replace(/:(\d)+$/, '');
|
|
83
|
+
},
|
|
84
|
+
enumerable: false,
|
|
85
|
+
configurable: true
|
|
86
|
+
});
|
|
87
|
+
FronteggConfig.prototype.getJwtPublicKey = function () {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
89
|
+
var response, data, publicKey, _a;
|
|
90
|
+
return __generator(this, function (_b) {
|
|
91
|
+
switch (_b.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
if (!!this._jwtPublicKey) return [3 /*break*/, 4];
|
|
94
|
+
return [4 /*yield*/, fetch(process.env['FRONTEGG_BASE_URL'] + "/.well-known/jwks.json")];
|
|
95
|
+
case 1:
|
|
96
|
+
response = _b.sent();
|
|
97
|
+
return [4 /*yield*/, response.json()];
|
|
98
|
+
case 2:
|
|
99
|
+
data = _b.sent();
|
|
100
|
+
publicKey = data.keys.find(function (key) { return key.kty === 'RSA'; });
|
|
101
|
+
_a = this;
|
|
102
|
+
return [4 /*yield*/, importJWK(publicKey)];
|
|
103
|
+
case 3:
|
|
104
|
+
_a._jwtPublicKey = _b.sent();
|
|
105
|
+
_b.label = 4;
|
|
106
|
+
case 4: return [2 /*return*/, this._jwtPublicKey];
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
Object.defineProperty(FronteggConfig.prototype, "passwordsAsMap", {
|
|
112
|
+
get: function () {
|
|
113
|
+
return this._passwordsAsMap;
|
|
114
|
+
},
|
|
115
|
+
enumerable: false,
|
|
116
|
+
configurable: true
|
|
117
|
+
});
|
|
118
|
+
return FronteggConfig;
|
|
119
|
+
}());
|
|
120
|
+
var FronteggConfig$1 = new FronteggConfig();
|
|
121
|
+
|
|
122
|
+
export { FronteggConfig$1 as F };
|
|
123
|
+
//# sourceMappingURL=FronteggConfig-7ae86562.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FronteggConfig-7ae86562.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/FronteggProvider.d.ts
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
import { FC
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export declare type FronteggProviderProps = Omit<FronteggAppOptions, 'contextOptions'> & MeAndTenants & {
|
|
5
|
-
children?: ReactNode;
|
|
6
|
-
session?: FronteggNextJSSession;
|
|
7
|
-
envAppUrl: string;
|
|
8
|
-
envBaseUrl: string;
|
|
9
|
-
envClientId: string;
|
|
10
|
-
contextOptions?: Omit<FronteggAppOptions['contextOptions'], 'baseUrl'>;
|
|
11
|
-
};
|
|
12
|
-
export declare const FronteggProvider: FC<FronteggProviderProps>;
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { FronteggProviderProps } from './common';
|
|
3
|
+
export declare const FronteggProvider: FC<Omit<FronteggProviderProps, 'router'>>;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { FC, ReactNode } from 'react';
|
|
2
1
|
import { FronteggAppOptions } from '@frontegg/types';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
2
|
+
import { FC, PropsWithChildren } from 'react';
|
|
3
|
+
export declare type FronteggProviderNoSSRProps = PropsWithChildren<FronteggAppOptions>;
|
|
6
4
|
export declare const FronteggProviderNoSSR: FC<FronteggProviderNoSSRProps>;
|
package/README.md
CHANGED
|
@@ -228,6 +228,57 @@ export const getServerSideProps: GetServerSideProps = withSSRSession(
|
|
|
228
228
|
);
|
|
229
229
|
```
|
|
230
230
|
|
|
231
|
+
## Next.js 13
|
|
232
|
+
### wrapping your application
|
|
233
|
+
```ts
|
|
234
|
+
// app/layout.tsx
|
|
235
|
+
import { FronteggAppProvider } from '@frontegg/nextjs/server';
|
|
236
|
+
|
|
237
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
238
|
+
return (
|
|
239
|
+
<FronteggAppProvider hostedLoginBox>
|
|
240
|
+
<html>
|
|
241
|
+
<head></head>
|
|
242
|
+
<body>{children}</body>
|
|
243
|
+
</html>
|
|
244
|
+
</FronteggAppProvider>
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### routing
|
|
250
|
+
```ts
|
|
251
|
+
// app/[...frontegg-router]/page.tsx
|
|
252
|
+
export { FronteggAppRouter as default } from '@frontegg/nextjs/client';
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### server component
|
|
256
|
+
```ts
|
|
257
|
+
// app/ServerComponent.tsx
|
|
258
|
+
import { getUserSession } from '@frontegg/nextjs/server';
|
|
259
|
+
|
|
260
|
+
export const ServerComponent = async () => {
|
|
261
|
+
const userSession = await getUserSession();
|
|
262
|
+
return (
|
|
263
|
+
<div>
|
|
264
|
+
user session server side: {JSON.stringify(userSession)}
|
|
265
|
+
</div>
|
|
266
|
+
);
|
|
267
|
+
};
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### client component
|
|
271
|
+
```ts
|
|
272
|
+
// app/ClientComponent.tsx
|
|
273
|
+
'use client';
|
|
274
|
+
import { useAuthUserOrNull } from '@frontegg/nextjs';
|
|
275
|
+
|
|
276
|
+
export const ClientComponent = () => {
|
|
277
|
+
const user = useAuthUserOrNull();
|
|
278
|
+
return <div>user session client side: {JSON.stringify(user)}</div>;
|
|
279
|
+
};
|
|
280
|
+
```
|
|
281
|
+
|
|
231
282
|
## Next.js middlewares usage
|
|
232
283
|
|
|
233
284
|
To prevent access unauthenticated user to all routes, use [Next.js middlewares](https://nextjs.org/docs/advanced-features/middleware).
|
|
@@ -238,16 +289,17 @@ To prevent access unauthenticated user to all routes, use [Next.js middlewares](
|
|
|
238
289
|
// /middleware.ts
|
|
239
290
|
import { NextResponse } from "next/server";
|
|
240
291
|
import type { NextRequest } from "next/server";
|
|
241
|
-
import { getSession } from '@frontegg/nextjs';
|
|
292
|
+
import { getSession } from '@frontegg/nextjs/edge';
|
|
242
293
|
|
|
243
294
|
export const middleware = async (request: NextRequest) => {
|
|
244
295
|
const session = await getSession(request);
|
|
296
|
+
const isAuthRoute = [...your auth routes]
|
|
245
297
|
|
|
246
298
|
console.log("middleware session", session);
|
|
247
|
-
|
|
248
|
-
if(!session){
|
|
299
|
+
|
|
300
|
+
if(!session && isAuthRoute){
|
|
249
301
|
// redirect unauthenticated user to /account/login page
|
|
250
|
-
return NextResponse.redirect(new URL('/account/login',
|
|
302
|
+
return NextResponse.redirect(new URL('/account/login', request))
|
|
251
303
|
}
|
|
252
304
|
|
|
253
305
|
return NextResponse.next();
|
package/api-70f0e81e.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { __awaiter, __generator } from 'tslib';
|
|
2
|
+
import { fronteggUsersUrl, fronteggTenantsUrl } from '@frontegg/rest-api';
|
|
3
|
+
|
|
4
|
+
var BASE_URL = process.env['FRONTEGG_BASE_URL'] + "/frontegg";
|
|
5
|
+
var Get = function (_a) {
|
|
6
|
+
var url = _a.url, _b = _a.credentials, credentials = _b === void 0 ? 'include' : _b, headers = _a.headers;
|
|
7
|
+
return fetch(url, { method: 'GET', credentials: credentials, headers: headers });
|
|
8
|
+
};
|
|
9
|
+
var extractHeaders = function (headers) { return ({
|
|
10
|
+
'accept-encoding': headers['accept-encoding'],
|
|
11
|
+
'accept-language': headers['accept-language'],
|
|
12
|
+
cookie: headers['cookie'],
|
|
13
|
+
accept: headers['accept'],
|
|
14
|
+
'user-agent': headers['user-agent'],
|
|
15
|
+
// connection: headers['connection'],
|
|
16
|
+
'cache-control': headers['cache-control'],
|
|
17
|
+
Authorization: headers['Authorization'],
|
|
18
|
+
}); };
|
|
19
|
+
var parseResponse = function (res) { return __awaiter(void 0, void 0, void 0, function () {
|
|
20
|
+
var resText;
|
|
21
|
+
return __generator(this, function (_a) {
|
|
22
|
+
switch (_a.label) {
|
|
23
|
+
case 0:
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
return [2 /*return*/, undefined];
|
|
26
|
+
}
|
|
27
|
+
return [4 /*yield*/, res.text()];
|
|
28
|
+
case 1:
|
|
29
|
+
resText = _a.sent();
|
|
30
|
+
return [2 /*return*/, JSON.parse(resText)];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}); };
|
|
34
|
+
var getUsers = function (headers) { return __awaiter(void 0, void 0, void 0, function () {
|
|
35
|
+
var res;
|
|
36
|
+
return __generator(this, function (_a) {
|
|
37
|
+
switch (_a.label) {
|
|
38
|
+
case 0: return [4 /*yield*/, Get({ url: "" + BASE_URL + fronteggUsersUrl, headers: extractHeaders(headers) })];
|
|
39
|
+
case 1:
|
|
40
|
+
res = _a.sent();
|
|
41
|
+
return [2 /*return*/, parseResponse(res)];
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}); };
|
|
45
|
+
var getTenants = function (headers) { return __awaiter(void 0, void 0, void 0, function () {
|
|
46
|
+
var res;
|
|
47
|
+
return __generator(this, function (_a) {
|
|
48
|
+
switch (_a.label) {
|
|
49
|
+
case 0: return [4 /*yield*/, Get({ url: "" + BASE_URL + fronteggTenantsUrl, headers: extractHeaders(headers) })];
|
|
50
|
+
case 1:
|
|
51
|
+
res = _a.sent();
|
|
52
|
+
return [2 /*return*/, parseResponse(res)];
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}); };
|
|
56
|
+
|
|
57
|
+
export { getTenants as a, getUsers as g };
|
|
58
|
+
//# sourceMappingURL=api-70f0e81e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-70f0e81e.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ParsedUrlQuery } from 'querystring';
|
|
3
|
+
declare type FronteggRouterProps = {
|
|
4
|
+
params: ParsedUrlQuery & {
|
|
5
|
+
'frontegg-router'?: string[];
|
|
6
|
+
};
|
|
7
|
+
searchParams: ParsedUrlQuery;
|
|
8
|
+
};
|
|
9
|
+
export declare function FronteggAppRouter({ params: { 'frontegg-router': pathArr }, searchParams }: FronteggRouterProps): string;
|
|
10
|
+
export {};
|
package/client/index.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __assign, __spreadArrays } from 'tslib';
|
|
3
|
+
import { F as FronteggConfig } from '../FronteggConfig-7ae86562.js';
|
|
4
|
+
import '../api-70f0e81e.js';
|
|
5
|
+
import 'cookie';
|
|
6
|
+
import 'iron-session';
|
|
7
|
+
import 'jose';
|
|
8
|
+
import { useLoginWithRedirect, useLoginActions } from '@frontegg/react-hooks';
|
|
9
|
+
import '@frontegg/rest-api';
|
|
10
|
+
import { useContext, useEffect } from 'react';
|
|
11
|
+
import { A as AppContext } from '../FronteggBaseProvider-5529ded6.js';
|
|
12
|
+
import '@frontegg/js';
|
|
13
|
+
import { authInitialState } from '@frontegg/redux-store';
|
|
14
|
+
import { useRouter, notFound } from 'next/navigation';
|
|
15
|
+
export { F as FronteggClientProviderNext13 } from '../FronteggClientProviderNext13-65bb4cd0.js';
|
|
16
|
+
|
|
17
|
+
function FronteggAppRouter(_a) {
|
|
18
|
+
var _b = _a.params["frontegg-router"], pathArr = _b === void 0 ? [] : _b, searchParams = _a.searchParams;
|
|
19
|
+
var routesObj = __assign(__assign({}, authInitialState.routes), FronteggConfig.authRoutes);
|
|
20
|
+
var routesArr = Object.keys(routesObj).reduce(function (p, key) { return __spreadArrays(p, [routesObj[key]]); }, []);
|
|
21
|
+
var app = useContext(AppContext);
|
|
22
|
+
var replace = useRouter().replace;
|
|
23
|
+
var loginWithRedirect = useLoginWithRedirect();
|
|
24
|
+
var logout = useLoginActions().logout;
|
|
25
|
+
var pathname = "/" + pathArr.join('/');
|
|
26
|
+
if (!pathname || pathname.startsWith('/_next/data')) {
|
|
27
|
+
var query = searchParams[Object.keys(searchParams)[0]];
|
|
28
|
+
pathname = "/" + (Array.isArray(query) ? query.join('/') : query);
|
|
29
|
+
}
|
|
30
|
+
if (routesArr.indexOf(pathname) === -1) {
|
|
31
|
+
notFound();
|
|
32
|
+
}
|
|
33
|
+
if (FronteggConfig.fronteggAppOptions.hostedLoginBox &&
|
|
34
|
+
routesObj.loginUrl !== pathname &&
|
|
35
|
+
routesObj.logoutUrl !== pathname &&
|
|
36
|
+
routesObj.hostedLoginRedirectUrl !== pathname) {
|
|
37
|
+
notFound();
|
|
38
|
+
}
|
|
39
|
+
useEffect(function () {
|
|
40
|
+
if (!app) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (app.options.hostedLoginBox) {
|
|
44
|
+
if (pathname === routesObj.loginUrl) {
|
|
45
|
+
if (searchParams.redirectUrl) {
|
|
46
|
+
localStorage.setItem('FRONTEGG_AFTER_AUTH_REDIRECT_URL', "" + window.location.origin + searchParams.redirectUrl);
|
|
47
|
+
}
|
|
48
|
+
loginWithRedirect();
|
|
49
|
+
}
|
|
50
|
+
else if (pathname === routesObj.logoutUrl) {
|
|
51
|
+
var _baseUrl = app.options.contextOptions.baseUrl;
|
|
52
|
+
var baseUrl_1 = typeof _baseUrl === 'string' ? _baseUrl : _baseUrl('');
|
|
53
|
+
logout(function () {
|
|
54
|
+
window.location.href = baseUrl_1 + "/oauth/logout?post_logout_redirect_uri=" + encodeURIComponent(window.location.origin);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}, [app, searchParams, loginWithRedirect, logout, replace]);
|
|
59
|
+
return '';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { FronteggAppRouter };
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { AppEnvConfig } from './types';
|
|
1
2
|
import { KeyLike } from 'jose';
|
|
2
3
|
import { AuthPageRoutes } from '@frontegg/redux-store';
|
|
3
4
|
import { FronteggAppOptions } from '@frontegg/types';
|
|
4
|
-
import { AppEnvConfig } from './types';
|
|
5
5
|
export declare type PasswordsMap = {
|
|
6
6
|
[id: string]: string;
|
|
7
7
|
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ExpireInListener: () => JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FronteggApp } from '@frontegg/js';
|
|
2
|
+
import { AuthState } from '@frontegg/redux-store';
|
|
3
|
+
import { FronteggProviderOptions, MeAndTenantsResponse } from '../types';
|
|
4
|
+
declare type CreateOrGetFronteggAppParams = {
|
|
5
|
+
options: FronteggProviderOptions;
|
|
6
|
+
onRedirectTo: AuthState['onRedirectTo'];
|
|
7
|
+
appName?: string;
|
|
8
|
+
storeHolder: any;
|
|
9
|
+
} & MeAndTenantsResponse;
|
|
10
|
+
export declare const createOrGetFronteggApp: ({ options, onRedirectTo, appName, user, tenants, storeHolder, }: CreateOrGetFronteggAppParams) => FronteggApp;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useRequestAuthorizeSSR';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FronteggApp } from '@frontegg/js';
|
|
2
|
+
import { MeAndTenantsResponse } from '../../types';
|
|
3
|
+
declare type useRequestAuthorizeSSR = {
|
|
4
|
+
app: FronteggApp;
|
|
5
|
+
accessToken?: string;
|
|
6
|
+
refreshToken?: string;
|
|
7
|
+
} & MeAndTenantsResponse;
|
|
8
|
+
export declare const useRequestAuthorizeSSR: ({ app, accessToken, user, tenants, refreshToken }: useRequestAuthorizeSSR) => void;
|
|
9
|
+
export {};
|
|
File without changes
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { ServerResponse } from 'http';
|
|
3
2
|
import { CookieSerializeOptions } from 'cookie';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
3
|
+
import { ServerResponse } from 'http';
|
|
4
|
+
import { RequestCookie } from 'next/dist/server/web/spec-extension/cookies';
|
|
5
|
+
import { FronteggUserTokens } from './types';
|
|
6
|
+
export declare function rewriteCookieProperty(header: string | string[], config: any, property: string): string | string[];
|
|
7
7
|
declare type CreateCookieArguments = {
|
|
8
8
|
cookieName?: string;
|
|
9
9
|
session: string;
|
|
@@ -13,13 +13,11 @@ declare type CreateCookieArguments = {
|
|
|
13
13
|
httpOnly?: CookieSerializeOptions['httpOnly'];
|
|
14
14
|
path?: CookieSerializeOptions['path'];
|
|
15
15
|
};
|
|
16
|
-
export declare function createCookie({ cookieName, session, expires, isSecured, cookieDomain, httpOnly, path }: CreateCookieArguments): string[];
|
|
17
|
-
export declare function
|
|
16
|
+
export declare function createCookie({ cookieName, session, expires, isSecured, cookieDomain, httpOnly, path, }: CreateCookieArguments): string[];
|
|
17
|
+
export declare function parseCookieFromArray(cookies: RequestCookie[]): string | undefined;
|
|
18
18
|
export declare function addToCookies(newCookies: string[], res: ServerResponse): void;
|
|
19
19
|
export declare function removeCookies(cookieName: string, isSecured: boolean, cookieDomain: string, res: ServerResponse): void;
|
|
20
|
-
export declare function compress(input: string): Promise<string>;
|
|
21
|
-
export declare function uncompress(input: string): Promise<string>;
|
|
22
20
|
export declare function createSessionFromAccessToken(output: string): Promise<[string, any, string] | []>;
|
|
23
21
|
export declare const modifySetCookieIfUnsecure: (setCookieValue: string[] | undefined, isSecured: boolean) => string[] | undefined;
|
|
24
|
-
export declare function
|
|
22
|
+
export declare function getTokensFromCookie(cookie?: string): Promise<FronteggUserTokens | undefined>;
|
|
25
23
|
export {};
|