@frontegg/nextjs 8.0.25 → 8.0.26-alpha.9960571383
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 +6 -0
- package/README.md +32 -7
- package/api/index.d.ts +6 -1
- package/api/index.js +27 -4
- package/api/index.js.map +1 -1
- package/app/FronteggAppProvider.js +10 -3
- package/app/FronteggAppProvider.js.map +1 -1
- package/config/constants.d.ts +22 -0
- package/config/constants.js +4 -0
- package/config/constants.js.map +1 -1
- package/config/index.d.ts +3 -0
- package/config/index.js +37 -5
- package/config/index.js.map +1 -1
- package/config/types.d.ts +2 -0
- package/config/types.js.map +1 -1
- package/edge/getSessionOnEdge.d.ts +3 -0
- package/edge/getSessionOnEdge.js +62 -1
- package/edge/getSessionOnEdge.js.map +1 -1
- package/index.js +1 -1
- package/middleware/FronteggApiMiddleware.js +14 -2
- package/middleware/FronteggApiMiddleware.js.map +1 -1
- package/middleware/ProxyRequestCallback.js +0 -3
- package/middleware/ProxyRequestCallback.js.map +1 -1
- package/middleware/ProxyResponseCallback.js +8 -7
- package/middleware/ProxyResponseCallback.js.map +1 -1
- package/middleware/helpers.d.ts +14 -0
- package/middleware/helpers.js +55 -1
- package/middleware/helpers.js.map +1 -1
- package/package.json +1 -1
- package/pages/withFronteggApp/withFronteggApp.js +14 -3
- package/pages/withFronteggApp/withFronteggApp.js.map +1 -1
- package/sdkVersion.js +1 -1
- package/sdkVersion.js.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.js.map +1 -1
- package/utils/initializeFronteggApp/index.js +2 -1
- package/utils/initializeFronteggApp/index.js.map +1 -1
- package/utils/refreshAccessTokenIfNeeded/helpers.js +10 -2
- package/utils/refreshAccessTokenIfNeeded/helpers.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## [8.0.26](https://github.com/frontegg/frontegg-nextjs/compare/v8.0.25...v8.0.26) (2024-7-16)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### NextJS Wrapper 8.0.26:
|
|
7
|
+
- FR-17008 - fix pipeline release version
|
|
8
|
+
|
|
3
9
|
## [8.0.25](https://github.com/frontegg/frontegg-nextjs/compare/v8.0.24...v8.0.25) (2024-7-9)
|
|
4
10
|
|
|
5
11
|
- FR-16737 - Allow terms and conditions checkbox on sign up form being optional
|
package/README.md
CHANGED
|
@@ -53,7 +53,8 @@ To Add Frontegg to your existing Next.JS project, follow below steps:
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export default withFronteggApp(CustomApp, {
|
|
56
|
-
|
|
56
|
+
// when change to false, you have also to provide FRONTEGG_HOSTED_LOGIN='false' in .env.local
|
|
57
|
+
hostedLoginBox: true
|
|
57
58
|
});
|
|
58
59
|
```
|
|
59
60
|
|
|
@@ -104,24 +105,48 @@ your root project directory, this file will be used to store environment variabl
|
|
|
104
105
|
options:
|
|
105
106
|
|
|
106
107
|
```dotenv
|
|
107
|
-
# The AppUrl is to tell Frontegg your application hostname
|
|
108
|
+
# The AppUrl is used to tell Frontegg your application hostname
|
|
108
109
|
FRONTEGG_APP_URL='http://localhost:3000'
|
|
109
110
|
|
|
110
111
|
# The Frontegg domain is your unique URL to connect to the Frontegg gateway
|
|
111
112
|
FRONTEGG_BASE_URL='https://{YOUR_SUB_DOMAIN}.frontegg.com'
|
|
112
113
|
|
|
113
114
|
# Your Frontegg application's Client ID
|
|
115
|
+
# - For Dev environment [visit](https://portal.frontegg.com/development/settings/general)
|
|
116
|
+
# - For Prod environment [visit](https://portal.frontegg.com/production/settings/general)
|
|
114
117
|
FRONTEGG_CLIENT_ID='{YOUR_APPLICATION_CLIENT_ID}'
|
|
115
118
|
|
|
116
|
-
#
|
|
117
|
-
#
|
|
118
|
-
#
|
|
119
|
-
|
|
119
|
+
# Your Frontegg application's Client Secret
|
|
120
|
+
# - For Dev environment [visit](https://portal.frontegg.com/development/settings/general)
|
|
121
|
+
# - For Prod environment [visit](https://portal.frontegg.com/production/settings/general)
|
|
122
|
+
FRONTEGG_CLIENT_SECRET='{YOUR_APPLICATION_CLIENT_SECRET}'
|
|
123
|
+
|
|
124
|
+
# The stateless session encryption password used to encrypt the JWT before sending it to the client side.
|
|
125
|
+
# For quick password generation, use the following command:
|
|
120
126
|
# node -e "console.log(crypto.randomBytes(32).toString('hex'))"
|
|
121
127
|
FRONTEGG_ENCRYPTION_PASSWORD='{SESSION_ENCRYPTION_PASSWORD}'
|
|
122
128
|
|
|
123
|
-
# The
|
|
129
|
+
# The stateless session cookie name
|
|
124
130
|
FRONTEGG_COOKIE_NAME='fe_session'
|
|
131
|
+
|
|
132
|
+
# The JWT public key generated by Frontegg to verify JWT before creating a session.
|
|
133
|
+
# Retrieve it by visiting: https://[YOUR_FRONTEGG_DOMAIN]/.well-known/jwks.json.
|
|
134
|
+
# By default, this key will be fetched from the Frontegg server, but you can provide it manually.
|
|
135
|
+
# Copy and paste the first key from the response (not the whole array):
|
|
136
|
+
# {keys: [{__KEY__}]}
|
|
137
|
+
FRONTEGG_JWT_PUBLIC_KEY='{"kty":"RSA","kid":"...'
|
|
138
|
+
|
|
139
|
+
# When `true`, the initial props will not refresh the access token if it's still valid.
|
|
140
|
+
# This option saves the time of refreshing the token on the server side.
|
|
141
|
+
DISABLE_INITIAL_PROPS_REFRESH_TOKEN='true'
|
|
142
|
+
|
|
143
|
+
# Enable secure JWT by removing the signature from the JWT token.
|
|
144
|
+
# To enable this feature, you need to provide {@link EnvVariables.FRONTEGG_CLIENT_SECRET}
|
|
145
|
+
FRONTEGG_SECURE_JWT_ENABLED='false'
|
|
146
|
+
|
|
147
|
+
# The Frontegg Hosted Login URL used to redirect the user to the Frontegg login page.
|
|
148
|
+
# Set to 'true' to enable the hosted login feature.
|
|
149
|
+
FRONTEGG_HOSTED_LOGIN='true'
|
|
125
150
|
```
|
|
126
151
|
|
|
127
152
|
## Documentation
|
package/api/index.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { ILoginResponse, GetCurrentUserTenantsResponse, IPublicSettingsResponse, IGetUserAuthorizationResponse } from '@frontegg/rest-api';
|
|
2
2
|
import { UserEntitlementsResponseV2 } from '@frontegg/types';
|
|
3
|
+
/**
|
|
4
|
+
* Send HTTP post request for Frontegg services to exchange `hosted login` callback code
|
|
5
|
+
*/
|
|
6
|
+
export declare const exchangeHostedLoginToken: (headers: Record<string, string>, code: string, cliendId: string, clientSecret: string) => Promise<Response>;
|
|
3
7
|
/**
|
|
4
8
|
*
|
|
5
9
|
* @param headers
|
|
@@ -24,10 +28,11 @@ export declare const getPublicSettings: (headers: Record<string, string>) => Pro
|
|
|
24
28
|
declare const _default: {
|
|
25
29
|
loadPublicKey: () => Promise<any>;
|
|
26
30
|
refreshTokenEmbedded: (headers: Record<string, string>) => Promise<Response>;
|
|
27
|
-
refreshTokenHostedLogin: (headers: Record<string, string>, refresh_token: string) => Promise<Response>;
|
|
31
|
+
refreshTokenHostedLogin: (headers: Record<string, string>, refresh_token: string, cliendId?: string | undefined, clientSecret?: string | undefined) => Promise<Response>;
|
|
28
32
|
getMe: (headers: Record<string, string>) => Promise<ILoginResponse | undefined>;
|
|
29
33
|
getTenants: (headers: Record<string, string>) => Promise<GetCurrentUserTenantsResponse | undefined>;
|
|
30
34
|
getPublicSettings: (headers: Record<string, string>) => Promise<IPublicSettingsResponse | undefined>;
|
|
31
35
|
getEntitlements: (headers: Record<string, string>) => Promise<UserEntitlementsResponseV2 | undefined>;
|
|
36
|
+
exchangeHostedLoginToken: (headers: Record<string, string>, code: string, cliendId: string, clientSecret: string) => Promise<Response>;
|
|
32
37
|
};
|
|
33
38
|
export default _default;
|
package/api/index.js
CHANGED
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.getTenants = exports.getPublicSettings = exports.getMeAuthorization = exports.getMe = exports.getEntitlements = exports.default = void 0;
|
|
7
|
+
exports.getTenants = exports.getPublicSettings = exports.getMeAuthorization = exports.getMe = exports.getEntitlements = exports.exchangeHostedLoginToken = exports.default = void 0;
|
|
8
8
|
var _config = _interopRequireDefault(require("../config"));
|
|
9
9
|
var _urls = require("./urls");
|
|
10
10
|
var _utils = require("./utils");
|
|
@@ -37,21 +37,43 @@ const refreshTokenEmbedded = async headers => {
|
|
|
37
37
|
* Send HTTP post request for Frontegg services to refresh `hosted login` token
|
|
38
38
|
* by providing client's fe_ as body with grant_type.
|
|
39
39
|
*/
|
|
40
|
-
const refreshTokenHostedLogin = async (headers, refresh_token) => {
|
|
40
|
+
const refreshTokenHostedLogin = async (headers, refresh_token, cliendId, clientSecret) => {
|
|
41
41
|
return (0, _utils.Post)({
|
|
42
42
|
url: `${_config.default.baseUrl}${_urls.ApiUrls.refreshToken.hosted}`,
|
|
43
43
|
body: JSON.stringify({
|
|
44
44
|
grant_type: 'refresh_token',
|
|
45
|
-
refresh_token
|
|
45
|
+
refresh_token,
|
|
46
|
+
client_id: cliendId,
|
|
47
|
+
client_secret: clientSecret
|
|
46
48
|
}),
|
|
47
49
|
headers: (0, _utils.buildRequestHeaders)(headers)
|
|
48
50
|
});
|
|
49
51
|
};
|
|
50
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Send HTTP post request for Frontegg services to exchange `hosted login` callback code
|
|
55
|
+
*/
|
|
56
|
+
const exchangeHostedLoginToken = async (headers, code, cliendId, clientSecret) => {
|
|
57
|
+
return (0, _utils.Post)({
|
|
58
|
+
url: `${_config.default.baseUrl}${_urls.ApiUrls.refreshToken.hosted}`,
|
|
59
|
+
body: JSON.stringify({
|
|
60
|
+
redirect_uri: `${_config.default.appUrl}/oauth/callback`,
|
|
61
|
+
grant_type: 'authorization_code',
|
|
62
|
+
code,
|
|
63
|
+
client_id: cliendId,
|
|
64
|
+
client_secret: clientSecret
|
|
65
|
+
// code_verifier
|
|
66
|
+
}),
|
|
67
|
+
|
|
68
|
+
headers: (0, _utils.buildRequestHeaders)(headers)
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
|
|
51
72
|
/**
|
|
52
73
|
*
|
|
53
74
|
* @param headers
|
|
54
75
|
*/
|
|
76
|
+
exports.exchangeHostedLoginToken = exchangeHostedLoginToken;
|
|
55
77
|
const getMe = async headers => {
|
|
56
78
|
const headersToSend = (0, _utils.buildRequestHeaders)(headers);
|
|
57
79
|
const res = await (0, _utils.Get)({
|
|
@@ -118,7 +140,8 @@ var _default = {
|
|
|
118
140
|
getMe,
|
|
119
141
|
getTenants,
|
|
120
142
|
getPublicSettings,
|
|
121
|
-
getEntitlements
|
|
143
|
+
getEntitlements,
|
|
144
|
+
exchangeHostedLoginToken
|
|
122
145
|
};
|
|
123
146
|
exports.default = _default;
|
|
124
147
|
//# sourceMappingURL=index.js.map
|
package/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_config","_interopRequireDefault","require","_urls","_utils","_restApi","loadPublicKey","response","fetch","config","baseUrl","ApiUrls","WellKnown","jwks","cache","data","json","keys","refreshTokenEmbedded","headers","Post","url","refreshToken","embedded","body","credentials","buildRequestHeaders","refreshTokenHostedLogin","refresh_token","hosted","JSON","stringify","grant_type","getMe","headersToSend","res","Get","fronteggUsersUrl","parseHttpResponse","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_config","_interopRequireDefault","require","_urls","_utils","_restApi","loadPublicKey","response","fetch","config","baseUrl","ApiUrls","WellKnown","jwks","cache","data","json","keys","refreshTokenEmbedded","headers","Post","url","refreshToken","embedded","body","credentials","buildRequestHeaders","refreshTokenHostedLogin","refresh_token","cliendId","clientSecret","hosted","JSON","stringify","grant_type","client_id","client_secret","exchangeHostedLoginToken","code","redirect_uri","appUrl","exports","getMe","headersToSend","res","Get","fronteggUsersUrl","parseHttpResponse","getEntitlements","fronteggEntitlementsV2Url","getTenants","fronteggTenantsV3Url","getMeAuthorization","getPublicSettings","_default","default"],"sources":["../../../../packages/nextjs/src/api/index.ts"],"sourcesContent":["import config from '../config';\nimport { ApiUrls } from './urls';\nimport { buildRequestHeaders, Get, parseHttpResponse, Post } from './utils';\nimport {\n fronteggTenantsV3Url,\n fronteggUsersUrl,\n ILoginResponse,\n GetCurrentUserTenantsResponse,\n IPublicSettingsResponse,\n IGetUserAuthorizationResponse,\n fronteggEntitlementsV2Url,\n} from '@frontegg/rest-api';\n\nimport { UserEntitlementsResponseV2 } from '@frontegg/types';\n\n/**\n * Send HTTP GET to frontegg domain public route to download the JWT public key\n */\nconst loadPublicKey = async () => {\n const response = await fetch(`${config.baseUrl}${ApiUrls.WellKnown.jwks}`, {\n cache: 'force-cache',\n });\n const data = await response.json();\n return data.keys[0];\n};\n\n/**\n * Send HTTP post request for Frontegg services to refresh token\n * by providing client's fe_ cookies\n */\nconst refreshTokenEmbedded = async (headers: Record<string, string>) => {\n return Post({\n url: `${config.baseUrl}${ApiUrls.refreshToken.embedded}`,\n body: '{}',\n credentials: 'include',\n headers: buildRequestHeaders(headers),\n });\n};\n\n/**\n * Send HTTP post request for Frontegg services to refresh `hosted login` token\n * by providing client's fe_ as body with grant_type.\n */\nconst refreshTokenHostedLogin = async (\n headers: Record<string, string>,\n refresh_token: string,\n cliendId?: string,\n clientSecret?: string\n) => {\n return Post({\n url: `${config.baseUrl}${ApiUrls.refreshToken.hosted}`,\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token,\n client_id: cliendId,\n client_secret: clientSecret,\n }),\n headers: buildRequestHeaders(headers),\n });\n};\n\n/**\n * Send HTTP post request for Frontegg services to exchange `hosted login` callback code\n */\nexport const exchangeHostedLoginToken = async (\n headers: Record<string, string>,\n code: string,\n cliendId: string,\n clientSecret: string\n) => {\n return Post({\n url: `${config.baseUrl}${ApiUrls.refreshToken.hosted}`,\n body: JSON.stringify({\n redirect_uri: `${config.appUrl}/oauth/callback`,\n grant_type: 'authorization_code',\n code,\n client_id: cliendId,\n client_secret: clientSecret,\n // code_verifier\n }),\n headers: buildRequestHeaders(headers),\n });\n};\n\n/**\n *\n * @param headers\n */\nexport const getMe = async (headers: Record<string, string>): Promise<ILoginResponse | undefined> => {\n const headersToSend = buildRequestHeaders(headers);\n const res = await Get({\n url: `${config.baseUrl}/frontegg${fronteggUsersUrl}`,\n headers: headersToSend,\n });\n return parseHttpResponse(res);\n};\n\n/**\n *\n * @param headers\n */\nexport const getEntitlements = async (\n headers: Record<string, string>\n): Promise<UserEntitlementsResponseV2 | undefined> => {\n const headersToSend = buildRequestHeaders(headers);\n const res = await Get({\n url: `${config.baseUrl}${fronteggEntitlementsV2Url}`,\n headers: headersToSend,\n });\n return parseHttpResponse(res);\n};\n\n/**\n *\n * @param headers\n */\nexport const getTenants = async (\n headers: Record<string, string>\n): Promise<GetCurrentUserTenantsResponse | undefined> => {\n const res = await Get({\n url: `${config.baseUrl}/frontegg${fronteggTenantsV3Url}`,\n headers: buildRequestHeaders(headers),\n });\n return parseHttpResponse(res);\n};\n\n/**\n *\n * @param headers\n */\nexport const getMeAuthorization = async (\n headers: Record<string, string>\n): Promise<IGetUserAuthorizationResponse | undefined> => {\n const res = await Get({\n //TODO: replace this with rest/api route\n url: `${config.baseUrl}/frontegg/identity/resources/users/v1/me/authorization`,\n headers: buildRequestHeaders(headers),\n });\n return parseHttpResponse(res);\n};\n\nexport const getPublicSettings = async (\n headers: Record<string, string>\n): Promise<IPublicSettingsResponse | undefined> => {\n const res = await Get({\n //TODO: export the route url from rest-api and import from there\n url: `${config.baseUrl}/frontegg/tenants/resources/account-settings/v1/public`,\n headers: buildRequestHeaders(headers),\n });\n return parseHttpResponse(res);\n};\n\nexport default {\n loadPublicKey,\n refreshTokenEmbedded,\n refreshTokenHostedLogin,\n getMe,\n getTenants,\n getPublicSettings,\n getEntitlements,\n exchangeHostedLoginToken,\n};\n"],"mappings":"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"}
|
|
@@ -13,22 +13,29 @@ var _helpers = require("./helpers");
|
|
|
13
13
|
var _config = _interopRequireDefault(require("../config"));
|
|
14
14
|
var _fetchUserData = _interopRequireDefault(require("../utils/fetchUserData"));
|
|
15
15
|
var _getAppUrlForCustomLoginWithSubdomain = require("./getAppUrlForCustomLoginWithSubdomain");
|
|
16
|
+
var _helpers2 = require("../middleware/helpers");
|
|
16
17
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
18
|
const _excluded = ["envAppUrl"];
|
|
18
19
|
const FronteggAppProvider = async options => {
|
|
19
|
-
var _options$customLoginO;
|
|
20
|
+
var _options$customLoginO, _options$secureJwtEna;
|
|
20
21
|
const _config$appEnvConfig = _config.default.appEnvConfig,
|
|
21
22
|
{
|
|
22
23
|
envAppUrl
|
|
23
24
|
} = _config$appEnvConfig,
|
|
24
25
|
appEnvConfig = (0, _objectWithoutPropertiesLoose2.default)(_config$appEnvConfig, _excluded);
|
|
25
|
-
|
|
26
|
+
let userData = await (0, _fetchUserData.default)({
|
|
26
27
|
getSession: _helpers.getAppSession,
|
|
27
28
|
getHeaders: _helpers.getAppHeadersPromise
|
|
28
29
|
});
|
|
29
30
|
const subDomainAppUrl = await (0, _getAppUrlForCustomLoginWithSubdomain.getAppUrlForCustomLoginWithSubdomain)((_options$customLoginO = options.customLoginOptions) == null ? void 0 : _options$customLoginO.subDomainIndex);
|
|
31
|
+
if (process.env['FRONTEGG_SECURE_JWT_ENABLED'] === 'true' && userData) {
|
|
32
|
+
var _userData;
|
|
33
|
+
userData = (0, _helpers2.removeJwtSignatureFrom)(userData);
|
|
34
|
+
userData.session = (0, _helpers2.removeJwtSignatureFrom)((_userData = userData) == null ? void 0 : _userData.session);
|
|
35
|
+
}
|
|
30
36
|
const providerProps = (0, _extends2.default)({}, appEnvConfig, userData, options, {
|
|
31
|
-
envAppUrl: subDomainAppUrl != null ? subDomainAppUrl : envAppUrl
|
|
37
|
+
envAppUrl: subDomainAppUrl != null ? subDomainAppUrl : envAppUrl,
|
|
38
|
+
secureJwtEnabled: (_options$secureJwtEna = options.secureJwtEnabled) != null ? _options$secureJwtEna : false
|
|
32
39
|
});
|
|
33
40
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ClientFronteggProvider.ClientFronteggProvider, (0, _extends2.default)({}, providerProps));
|
|
34
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FronteggAppProvider.js","names":["_react","_interopRequireDefault","require","_ClientFronteggProvider","_helpers","_config","_fetchUserData","_getAppUrlForCustomLoginWithSubdomain","_jsxRuntime","_excluded","FronteggAppProvider","options","_options$customLoginO","_config$appEnvConfig","config","appEnvConfig","envAppUrl","_objectWithoutPropertiesLoose2","default","userData","fetchUserData","getSession","getAppSession","getHeaders","getAppHeadersPromise","subDomainAppUrl","getAppUrlForCustomLoginWithSubdomain","customLoginOptions","subDomainIndex","providerProps","_extends2","jsx","ClientFronteggProvider","exports"],"sources":["../../../../packages/nextjs/src/app/FronteggAppProvider.tsx"],"sourcesContent":["import React, { PropsWithChildren } from 'react';\nimport { ClientFronteggProvider } from './ClientFronteggProvider';\nimport { getAppHeadersPromise, getAppSession } from './helpers';\nimport config from '../config';\nimport fetchUserData from '../utils/fetchUserData';\nimport { ClientFronteggProviderProps } from '../types';\nimport { getAppUrlForCustomLoginWithSubdomain } from './getAppUrlForCustomLoginWithSubdomain';\n\nexport type FronteggAppProviderProps = PropsWithChildren<\n Omit<ClientFronteggProviderProps, 'contextOptions' | 'envAppUrl' | 'envBaseUrl' | 'envClientId'>\n>;\n\nexport const FronteggAppProvider = async (options: FronteggAppProviderProps) => {\n const { envAppUrl, ...appEnvConfig } = config.appEnvConfig;\n
|
|
1
|
+
{"version":3,"file":"FronteggAppProvider.js","names":["_react","_interopRequireDefault","require","_ClientFronteggProvider","_helpers","_config","_fetchUserData","_getAppUrlForCustomLoginWithSubdomain","_helpers2","_jsxRuntime","_excluded","FronteggAppProvider","options","_options$customLoginO","_options$secureJwtEna","_config$appEnvConfig","config","appEnvConfig","envAppUrl","_objectWithoutPropertiesLoose2","default","userData","fetchUserData","getSession","getAppSession","getHeaders","getAppHeadersPromise","subDomainAppUrl","getAppUrlForCustomLoginWithSubdomain","customLoginOptions","subDomainIndex","process","env","_userData","removeJwtSignatureFrom","session","providerProps","_extends2","secureJwtEnabled","jsx","ClientFronteggProvider","exports"],"sources":["../../../../packages/nextjs/src/app/FronteggAppProvider.tsx"],"sourcesContent":["import React, { PropsWithChildren } from 'react';\nimport { ClientFronteggProvider } from './ClientFronteggProvider';\nimport { getAppHeadersPromise, getAppSession } from './helpers';\nimport config from '../config';\nimport fetchUserData from '../utils/fetchUserData';\nimport { ClientFronteggProviderProps } from '../types';\nimport { getAppUrlForCustomLoginWithSubdomain } from './getAppUrlForCustomLoginWithSubdomain';\nimport { removeJwtSignatureFrom } from '../middleware/helpers';\n\nexport type FronteggAppProviderProps = PropsWithChildren<\n Omit<ClientFronteggProviderProps, 'contextOptions' | 'envAppUrl' | 'envBaseUrl' | 'envClientId'>\n>;\n\nexport const FronteggAppProvider = async (options: FronteggAppProviderProps) => {\n const { envAppUrl, ...appEnvConfig } = config.appEnvConfig;\n let userData = await fetchUserData({ getSession: getAppSession, getHeaders: getAppHeadersPromise });\n const subDomainAppUrl = await getAppUrlForCustomLoginWithSubdomain(options.customLoginOptions?.subDomainIndex);\n\n if (process.env['FRONTEGG_SECURE_JWT_ENABLED'] === 'true' && userData) {\n userData = removeJwtSignatureFrom(userData);\n userData.session = removeJwtSignatureFrom(userData?.session);\n }\n const providerProps = {\n ...appEnvConfig,\n ...userData,\n ...options,\n envAppUrl: subDomainAppUrl ?? envAppUrl,\n secureJwtEnabled: options.secureJwtEnabled ?? false,\n };\n\n return <ClientFronteggProvider {...providerProps} />;\n};\n"],"mappings":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,uBAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,cAAA,GAAAL,sBAAA,CAAAC,OAAA;AAEA,IAAAK,qCAAA,GAAAL,OAAA;AACA,IAAAM,SAAA,GAAAN,OAAA;AAA+D,IAAAO,WAAA,GAAAP,OAAA;AAAA,MAAAQ,SAAA;AAMxD,MAAMC,mBAAmB,GAAG,MAAOC,OAAiC,IAAK;EAAA,IAAAC,qBAAA,EAAAC,qBAAA;EAC9E,MAAAC,oBAAA,GAAuCC,eAAM,CAACC,YAAY;IAApD;MAAEC;IAA2B,CAAC,GAAAH,oBAAA;IAAdE,YAAY,OAAAE,8BAAA,CAAAC,OAAA,EAAAL,oBAAA,EAAAL,SAAA;EAClC,IAAIW,QAAQ,GAAG,MAAM,IAAAC,sBAAa,EAAC;IAAEC,UAAU,EAAEC,sBAAa;IAAEC,UAAU,EAAEC;EAAqB,CAAC,CAAC;EACnG,MAAMC,eAAe,GAAG,MAAM,IAAAC,0EAAoC,GAAAf,qBAAA,GAACD,OAAO,CAACiB,kBAAkB,qBAA1BhB,qBAAA,CAA4BiB,cAAc,CAAC;EAE9G,IAAIC,OAAO,CAACC,GAAG,CAAC,6BAA6B,CAAC,KAAK,MAAM,IAAIX,QAAQ,EAAE;IAAA,IAAAY,SAAA;IACrEZ,QAAQ,GAAG,IAAAa,gCAAsB,EAACb,QAAQ,CAAC;IAC3CA,QAAQ,CAACc,OAAO,GAAG,IAAAD,gCAAsB,GAAAD,SAAA,GAACZ,QAAQ,qBAARY,SAAA,CAAUE,OAAO,CAAC;EAC9D;EACA,MAAMC,aAAa,OAAAC,SAAA,CAAAjB,OAAA,MACdH,YAAY,EACZI,QAAQ,EACRT,OAAO;IACVM,SAAS,EAAES,eAAe,WAAfA,eAAe,GAAIT,SAAS;IACvCoB,gBAAgB,GAAAxB,qBAAA,GAAEF,OAAO,CAAC0B,gBAAgB,YAAAxB,qBAAA,GAAI;EAAK,EACpD;EAED,oBAAO,IAAAL,WAAA,CAAA8B,GAAA,EAACpC,uBAAA,CAAAqC,sBAAsB,MAAAH,SAAA,CAAAjB,OAAA,MAAKgB,aAAa,EAAI;AACtD,CAAC;AAACK,OAAA,CAAA9B,mBAAA,GAAAA,mBAAA"}
|
package/config/constants.d.ts
CHANGED
|
@@ -21,6 +21,12 @@ export declare enum EnvVariables {
|
|
|
21
21
|
* - For Prod environment [visit](https://portal.frontegg.com/production/settings/general)
|
|
22
22
|
*/
|
|
23
23
|
FRONTEGG_CLIENT_ID = "FRONTEGG_CLIENT_ID",
|
|
24
|
+
/**
|
|
25
|
+
* Your Frontegg application's Client Secret, get it by visit:
|
|
26
|
+
* - For Dev environment [visit](https://portal.frontegg.com/development/settings/general)
|
|
27
|
+
* - For Prod environment [visit](https://portal.frontegg.com/production/settings/general)
|
|
28
|
+
*/
|
|
29
|
+
FRONTEGG_CLIENT_SECRET = "FRONTEGG_CLIENT_SECRET",
|
|
24
30
|
/**
|
|
25
31
|
* The stateless session encryption password, used to encrypt
|
|
26
32
|
* JWT before sending it to the client side.
|
|
@@ -49,6 +55,22 @@ export declare enum EnvVariables {
|
|
|
49
55
|
* When `true`, the initial props will not refresh access token if it's valid.
|
|
50
56
|
*/
|
|
51
57
|
DISABLE_INITIAL_PROPS_REFRESH_TOKEN = "DISABLE_INITIAL_PROPS_REFRESH_TOKEN",
|
|
58
|
+
/**
|
|
59
|
+
* Enable secure JWT by removing the signature from the JWT token.
|
|
60
|
+
* In order to enable this feature, you need to provide {@link EnvVariables.FRONTEGG_CLIENT_SECRET}
|
|
61
|
+
*/
|
|
62
|
+
FRONTEGG_SECURE_JWT_ENABLED = "FRONTEGG_SECURE_JWT_ENABLED",
|
|
63
|
+
/**
|
|
64
|
+
* The Frontegg Hosted Login URL, used to redirect the user to the Frontegg login page
|
|
65
|
+
* set to 'true' to enable the hosted login feature
|
|
66
|
+
*/
|
|
67
|
+
FRONTEGG_HOSTED_LOGIN = "FRONTEGG_HOSTED_LOGIN",
|
|
68
|
+
/**
|
|
69
|
+
* Forward client IP address to Frontegg gateway, used to detect the client's IP address
|
|
70
|
+
* when the Next.js application using frontegg middleware proxy service
|
|
71
|
+
* In order to enable this feature, you need to provide {@link EnvVariables.FRONTEGG_CLIENT_SECRET}
|
|
72
|
+
*/
|
|
73
|
+
FRONTEGG_FORWARD_IP = "FRONTEGG_FORWARD_IP",
|
|
52
74
|
/**
|
|
53
75
|
* This Env variable assign automatically when deploying you Next.js application
|
|
54
76
|
* to Vercel deployments service, and will be used to detect to dynamically configure
|
package/config/constants.js
CHANGED
|
@@ -9,10 +9,14 @@ let EnvVariables = /*#__PURE__*/function (EnvVariables) {
|
|
|
9
9
|
EnvVariables["FRONTEGG_BASE_URL"] = "FRONTEGG_BASE_URL";
|
|
10
10
|
EnvVariables["FRONTEGG_TEST_URL"] = "FRONTEGG_TEST_URL";
|
|
11
11
|
EnvVariables["FRONTEGG_CLIENT_ID"] = "FRONTEGG_CLIENT_ID";
|
|
12
|
+
EnvVariables["FRONTEGG_CLIENT_SECRET"] = "FRONTEGG_CLIENT_SECRET";
|
|
12
13
|
EnvVariables["FRONTEGG_ENCRYPTION_PASSWORD"] = "FRONTEGG_ENCRYPTION_PASSWORD";
|
|
13
14
|
EnvVariables["FRONTEGG_JWT_PUBLIC_KEY"] = "FRONTEGG_JWT_PUBLIC_KEY";
|
|
14
15
|
EnvVariables["FRONTEGG_COOKIE_NAME"] = "FRONTEGG_COOKIE_NAME";
|
|
15
16
|
EnvVariables["DISABLE_INITIAL_PROPS_REFRESH_TOKEN"] = "DISABLE_INITIAL_PROPS_REFRESH_TOKEN";
|
|
17
|
+
EnvVariables["FRONTEGG_SECURE_JWT_ENABLED"] = "FRONTEGG_SECURE_JWT_ENABLED";
|
|
18
|
+
EnvVariables["FRONTEGG_HOSTED_LOGIN"] = "FRONTEGG_HOSTED_LOGIN";
|
|
19
|
+
EnvVariables["FRONTEGG_FORWARD_IP"] = "FRONTEGG_FORWARD_IP";
|
|
16
20
|
EnvVariables["VERCEL"] = "VERCEL";
|
|
17
21
|
EnvVariables["VERCEL_URL"] = "VERCEL_URL";
|
|
18
22
|
return EnvVariables;
|
package/config/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["EnvVariables","exports"],"sources":["../../../../packages/nextjs/src/config/constants.ts"],"sourcesContent":["export enum EnvVariables {\n /**\n * The AppUrl is to tell Frontegg your application's app url\n * for generating cookies and proxy http requests\n */\n FRONTEGG_APP_URL = 'FRONTEGG_APP_URL',\n /**\n * The Frontegg domain is your unique URL to connect to the Frontegg gateway, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/settings/domains)\n * - For Prod environment [visit](https://portal.frontegg.com/production/settings/domains)\n */\n FRONTEGG_BASE_URL = 'FRONTEGG_BASE_URL',\n /**\n * The Frontegg test domain used for testing proxy middleware\n * @private for Frontegg\n */\n FRONTEGG_TEST_URL = 'FRONTEGG_TEST_URL',\n\n /**\n * Your Frontegg application's Client ID, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/settings/general)\n * - For Prod environment [visit](https://portal.frontegg.com/production/settings/general)\n */\n FRONTEGG_CLIENT_ID = 'FRONTEGG_CLIENT_ID',\n\n /**\n * The stateless session encryption password, used to encrypt\n * JWT before sending it to the client side.\n *\n * For quick password generation use the following command:\n *\n * ```sh\n * node -e \"console.log(crypto.randomBytes(32).toString('hex'))\"\n * ```\n */\n FRONTEGG_ENCRYPTION_PASSWORD = 'FRONTEGG_ENCRYPTION_PASSWORD',\n\n /**\n * The JWT public key generated by frontegg, to verify JWT before create session,\n * get it by visit: https://[YOUR_FRONTEGG_FOMAIN]/.well-known/jwks.json.\n *\n * Then: Copy and Paste the first key from the response:\n * {keys: [{__KEY__}]}\n */\n FRONTEGG_JWT_PUBLIC_KEY = 'FRONTEGG_JWT_PUBLIC_KEY',\n\n /**\n * The stateless cookie name for storing the encrypted JWT\n * value as session cookies for supporting getServerSideProps and ServerComponents\n */\n FRONTEGG_COOKIE_NAME = 'FRONTEGG_COOKIE_NAME',\n\n /**\n * When `true`, the initial props will not refresh access token if it's valid.\n */\n DISABLE_INITIAL_PROPS_REFRESH_TOKEN = 'DISABLE_INITIAL_PROPS_REFRESH_TOKEN',\n\n /**\n * This Env variable assign automatically when deploying you Next.js application\n * to Vercel deployments service, and will be used to detect to dynamically configure\n * the {@link EnvVariables.FRONTEGG_APP_URL}\n *\n * @see [Vercel Environment Variables](https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables)\n */\n VERCEL = 'VERCEL',\n VERCEL_URL = 'VERCEL_URL',\n}\n"],"mappings":";;;;;;IAAYA,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAAAC,OAAA,CAAAD,YAAA,GAAAA,YAAA"}
|
|
1
|
+
{"version":3,"file":"constants.js","names":["EnvVariables","exports"],"sources":["../../../../packages/nextjs/src/config/constants.ts"],"sourcesContent":["export enum EnvVariables {\n /**\n * The AppUrl is to tell Frontegg your application's app url\n * for generating cookies and proxy http requests\n */\n FRONTEGG_APP_URL = 'FRONTEGG_APP_URL',\n /**\n * The Frontegg domain is your unique URL to connect to the Frontegg gateway, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/settings/domains)\n * - For Prod environment [visit](https://portal.frontegg.com/production/settings/domains)\n */\n FRONTEGG_BASE_URL = 'FRONTEGG_BASE_URL',\n /**\n * The Frontegg test domain used for testing proxy middleware\n * @private for Frontegg\n */\n FRONTEGG_TEST_URL = 'FRONTEGG_TEST_URL',\n\n /**\n * Your Frontegg application's Client ID, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/settings/general)\n * - For Prod environment [visit](https://portal.frontegg.com/production/settings/general)\n */\n FRONTEGG_CLIENT_ID = 'FRONTEGG_CLIENT_ID',\n\n /**\n * Your Frontegg application's Client Secret, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/settings/general)\n * - For Prod environment [visit](https://portal.frontegg.com/production/settings/general)\n */\n FRONTEGG_CLIENT_SECRET = 'FRONTEGG_CLIENT_SECRET',\n\n /**\n * The stateless session encryption password, used to encrypt\n * JWT before sending it to the client side.\n *\n * For quick password generation use the following command:\n *\n * ```sh\n * node -e \"console.log(crypto.randomBytes(32).toString('hex'))\"\n * ```\n */\n FRONTEGG_ENCRYPTION_PASSWORD = 'FRONTEGG_ENCRYPTION_PASSWORD',\n\n /**\n * The JWT public key generated by frontegg, to verify JWT before create session,\n * get it by visit: https://[YOUR_FRONTEGG_FOMAIN]/.well-known/jwks.json.\n *\n * Then: Copy and Paste the first key from the response:\n * {keys: [{__KEY__}]}\n */\n FRONTEGG_JWT_PUBLIC_KEY = 'FRONTEGG_JWT_PUBLIC_KEY',\n\n /**\n * The stateless cookie name for storing the encrypted JWT\n * value as session cookies for supporting getServerSideProps and ServerComponents\n */\n FRONTEGG_COOKIE_NAME = 'FRONTEGG_COOKIE_NAME',\n\n /**\n * When `true`, the initial props will not refresh access token if it's valid.\n */\n DISABLE_INITIAL_PROPS_REFRESH_TOKEN = 'DISABLE_INITIAL_PROPS_REFRESH_TOKEN',\n\n /**\n * Enable secure JWT by removing the signature from the JWT token.\n * In order to enable this feature, you need to provide {@link EnvVariables.FRONTEGG_CLIENT_SECRET}\n */\n FRONTEGG_SECURE_JWT_ENABLED = 'FRONTEGG_SECURE_JWT_ENABLED',\n\n /**\n * The Frontegg Hosted Login URL, used to redirect the user to the Frontegg login page\n * set to 'true' to enable the hosted login feature\n */\n FRONTEGG_HOSTED_LOGIN = 'FRONTEGG_HOSTED_LOGIN',\n\n /**\n * Forward client IP address to Frontegg gateway, used to detect the client's IP address\n * when the Next.js application using frontegg middleware proxy service\n * In order to enable this feature, you need to provide {@link EnvVariables.FRONTEGG_CLIENT_SECRET}\n */\n FRONTEGG_FORWARD_IP = 'FRONTEGG_FORWARD_IP',\n /**\n * This Env variable assign automatically when deploying you Next.js application\n * to Vercel deployments service, and will be used to detect to dynamically configure\n * the {@link EnvVariables.FRONTEGG_APP_URL}\n *\n * @see [Vercel Environment Variables](https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables)\n */\n VERCEL = 'VERCEL',\n VERCEL_URL = 'VERCEL_URL',\n}\n"],"mappings":";;;;;;IAAYA,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAAAC,OAAA,CAAAD,YAAA,GAAAA,YAAA"}
|
package/config/index.d.ts
CHANGED
|
@@ -9,7 +9,9 @@ declare class Config {
|
|
|
9
9
|
get baseUrl(): string;
|
|
10
10
|
get baseUrlHost(): string;
|
|
11
11
|
get clientId(): string;
|
|
12
|
+
get clientSecret(): string | undefined;
|
|
12
13
|
get jwtPublicKeyJson(): string | undefined;
|
|
14
|
+
get secureJwtEnabled(): string | undefined;
|
|
13
15
|
get cookieName(): string;
|
|
14
16
|
get cookieDomain(): string;
|
|
15
17
|
get authRoutes(): Partial<AuthPageRoutes>;
|
|
@@ -17,6 +19,7 @@ declare class Config {
|
|
|
17
19
|
get password(): PasswordsMap;
|
|
18
20
|
get isSSL(): boolean;
|
|
19
21
|
get isHostedLogin(): boolean;
|
|
22
|
+
get isForwardIpEnabled(): boolean;
|
|
20
23
|
get disableInitialPropsRefreshToken(): boolean;
|
|
21
24
|
get appEnvConfig(): AppEnvConfig;
|
|
22
25
|
}
|
package/config/index.js
CHANGED
|
@@ -18,9 +18,11 @@ const setupEnvVariables = {
|
|
|
18
18
|
FRONTEGG_BASE_URL: process.env.FRONTEGG_BASE_URL,
|
|
19
19
|
FRONTEGG_TEST_URL: process.env.FRONTEGG_TEST_URL,
|
|
20
20
|
FRONTEGG_CLIENT_ID: process.env.FRONTEGG_CLIENT_ID,
|
|
21
|
+
FRONTEGG_CLIENT_SECRET: process.env.FRONTEGG_CLIENT_SECRET,
|
|
21
22
|
FRONTEGG_ENCRYPTION_PASSWORD: process.env.FRONTEGG_ENCRYPTION_PASSWORD,
|
|
22
23
|
FRONTEGG_COOKIE_NAME: process.env.FRONTEGG_COOKIE_NAME,
|
|
23
24
|
FRONTEGG_JWT_PUBLIC_KEY: process.env.FRONTEGG_JWT_PUBLIC_KEY,
|
|
25
|
+
FRONTEGG_SECURE_JWT_ENABLED: process.env.FRONTEGG_SECURE_JWT_ENABLED,
|
|
24
26
|
DISABLE_INITIAL_PROPS_REFRESH_TOKEN: process.env.DISABLE_INITIAL_PROPS_REFRESH_TOKEN,
|
|
25
27
|
VERCEL: process.env.VERCEL,
|
|
26
28
|
VERCEL_URL: process.env.VERCEL_URL
|
|
@@ -53,9 +55,30 @@ class Config {
|
|
|
53
55
|
var _getEnv2;
|
|
54
56
|
return (_getEnv2 = (0, _helpers.getEnv)(_constants.EnvVariables.FRONTEGG_CLIENT_ID)) != null ? _getEnv2 : setupEnvVariables.FRONTEGG_CLIENT_ID;
|
|
55
57
|
}
|
|
58
|
+
get clientSecret() {
|
|
59
|
+
let clientSecret = undefined;
|
|
60
|
+
try {
|
|
61
|
+
var _getEnv3;
|
|
62
|
+
clientSecret = (_getEnv3 = (0, _helpers.getEnv)(_constants.EnvVariables.FRONTEGG_CLIENT_SECRET)) != null ? _getEnv3 : setupEnvVariables.FRONTEGG_CLIENT_SECRET;
|
|
63
|
+
} catch (e) {
|
|
64
|
+
clientSecret = setupEnvVariables.FRONTEGG_CLIENT_SECRET;
|
|
65
|
+
}
|
|
66
|
+
if (this.secureJwtEnabled === 'true' && !clientSecret) {
|
|
67
|
+
throw new _errors.InvalidFronteggEnv(_constants.EnvVariables.FRONTEGG_CLIENT_SECRET, 'Client secret is required when secure JWT is enabled');
|
|
68
|
+
}
|
|
69
|
+
return clientSecret;
|
|
70
|
+
}
|
|
56
71
|
get jwtPublicKeyJson() {
|
|
57
72
|
return (0, _helpers.getEnv)(_constants.EnvVariables.FRONTEGG_JWT_PUBLIC_KEY);
|
|
58
73
|
}
|
|
74
|
+
get secureJwtEnabled() {
|
|
75
|
+
try {
|
|
76
|
+
var _getEnv4;
|
|
77
|
+
return (_getEnv4 = (0, _helpers.getEnv)(_constants.EnvVariables.FRONTEGG_SECURE_JWT_ENABLED)) != null ? _getEnv4 : setupEnvVariables.FRONTEGG_SECURE_JWT_ENABLED;
|
|
78
|
+
} catch (e) {
|
|
79
|
+
return setupEnvVariables.FRONTEGG_SECURE_JWT_ENABLED;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
59
82
|
get cookieName() {
|
|
60
83
|
var _setupEnvVariables$FR;
|
|
61
84
|
const cookieNameEnv = (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_COOKIE_NAME, (_setupEnvVariables$FR = setupEnvVariables.FRONTEGG_COOKIE_NAME) != null ? _setupEnvVariables$FR : 'fe_session');
|
|
@@ -78,8 +101,8 @@ class Config {
|
|
|
78
101
|
}
|
|
79
102
|
}
|
|
80
103
|
get password() {
|
|
81
|
-
var
|
|
82
|
-
const encryptionPasswordEnv = (
|
|
104
|
+
var _getEnv5;
|
|
105
|
+
const encryptionPasswordEnv = (_getEnv5 = (0, _helpers.getEnv)(_constants.EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD)) != null ? _getEnv5 : setupEnvVariables.FRONTEGG_ENCRYPTION_PASSWORD;
|
|
83
106
|
return (0, _helpers.normalizeStringPasswordToMap)(encryptionPasswordEnv);
|
|
84
107
|
}
|
|
85
108
|
get isSSL() {
|
|
@@ -87,18 +110,27 @@ class Config {
|
|
|
87
110
|
}
|
|
88
111
|
get isHostedLogin() {
|
|
89
112
|
var _this$fronteggAppOpti4;
|
|
90
|
-
return (_this$fronteggAppOpti4 = this.fronteggAppOptions.hostedLoginBox) != null ? _this$fronteggAppOpti4 : false;
|
|
113
|
+
return (_this$fronteggAppOpti4 = this.fronteggAppOptions.hostedLoginBox) != null ? _this$fronteggAppOpti4 : (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_HOSTED_LOGIN, 'false') === 'true';
|
|
114
|
+
}
|
|
115
|
+
get isForwardIpEnabled() {
|
|
116
|
+
if (this.clientSecret) {
|
|
117
|
+
return (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_HOSTED_LOGIN, 'false') === 'true';
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
91
120
|
}
|
|
92
121
|
get disableInitialPropsRefreshToken() {
|
|
93
122
|
const disableInitialPropsRefreshToken = (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.DISABLE_INITIAL_PROPS_REFRESH_TOKEN, setupEnvVariables.DISABLE_INITIAL_PROPS_REFRESH_TOKEN);
|
|
94
123
|
return disableInitialPropsRefreshToken === 'true';
|
|
95
124
|
}
|
|
96
125
|
get appEnvConfig() {
|
|
97
|
-
|
|
126
|
+
const config = {
|
|
98
127
|
envAppUrl: this.appUrl,
|
|
99
128
|
envBaseUrl: this.baseUrl,
|
|
100
|
-
envClientId: this.clientId
|
|
129
|
+
envClientId: this.clientId,
|
|
130
|
+
secureJwtEnabled: this.secureJwtEnabled
|
|
101
131
|
};
|
|
132
|
+
console.log('this.appEnvConfig', config);
|
|
133
|
+
return config;
|
|
102
134
|
}
|
|
103
135
|
}
|
|
104
136
|
var _default = new Config();
|
package/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_helpers","require","_constants","_errors","setupEnvVariables","FRONTEGG_APP_URL","process","env","FRONTEGG_BASE_URL","FRONTEGG_TEST_URL","FRONTEGG_CLIENT_ID","FRONTEGG_ENCRYPTION_PASSWORD","FRONTEGG_COOKIE_NAME","FRONTEGG_JWT_PUBLIC_KEY","DISABLE_INITIAL_PROPS_REFRESH_TOKEN","VERCEL","VERCEL_URL","Config","constructor","fronteggAppOptions","window","validatePassword","appUrl","generateAppUrl","testUrl","getEnvOrDefault","EnvVariables","baseUrl","_getEnv","getEnv","endsWith","slice","baseUrlHost","URL","hostname","clientId","_getEnv2","jwtPublicKeyJson","cookieName","_setupEnvVariables$FR","cookieNameEnv","replace","cookieDomain","generateCookieDomain","authRoutes","_this$fronteggAppOpti","_this$fronteggAppOpti2","_this$fronteggAppOpti3","authOptions","routes","passwordMaps","password","key","Object","keys","match","length","InvalidFronteggEnv","_getEnv3","encryptionPasswordEnv","normalizeStringPasswordToMap","isSSL","protocol","isHostedLogin","_this$fronteggAppOpti4","hostedLoginBox","disableInitialPropsRefreshToken","appEnvConfig","envAppUrl","envBaseUrl","envClientId","_default","exports","default"],"sources":["../../../../packages/nextjs/src/config/index.ts"],"sourcesContent":["import { AuthPageRoutes } from '@frontegg/redux-store';\nimport { WithFronteggAppOptions } from '../pages';\nimport { AppEnvConfig, PasswordsMap } from './types';\nimport { generateAppUrl, generateCookieDomain, getEnv, getEnvOrDefault, normalizeStringPasswordToMap } from './helpers';\nimport { EnvVariables } from './constants';\nimport { InvalidFronteggEnv } from '../utils/errors';\n\nconst setupEnvVariables = {\n FRONTEGG_APP_URL: process.env.FRONTEGG_APP_URL,\n FRONTEGG_BASE_URL: process.env.FRONTEGG_BASE_URL,\n FRONTEGG_TEST_URL: process.env.FRONTEGG_TEST_URL,\n FRONTEGG_CLIENT_ID: process.env.FRONTEGG_CLIENT_ID,\n FRONTEGG_ENCRYPTION_PASSWORD: process.env.FRONTEGG_ENCRYPTION_PASSWORD,\n FRONTEGG_COOKIE_NAME: process.env.FRONTEGG_COOKIE_NAME,\n FRONTEGG_JWT_PUBLIC_KEY: process.env.FRONTEGG_JWT_PUBLIC_KEY,\n DISABLE_INITIAL_PROPS_REFRESH_TOKEN: process.env.DISABLE_INITIAL_PROPS_REFRESH_TOKEN,\n VERCEL: process.env.VERCEL,\n VERCEL_URL: process.env.VERCEL_URL,\n};\n\nclass Config {\n public fronteggAppOptions: Partial<WithFronteggAppOptions> = {};\n constructor() {\n if (typeof window === 'undefined') {\n this.validatePassword();\n }\n }\n\n get appUrl(): string {\n return generateAppUrl();\n }\n\n get testUrl(): string | undefined {\n return getEnvOrDefault(EnvVariables.FRONTEGG_TEST_URL, setupEnvVariables.FRONTEGG_TEST_URL);\n }\n\n get baseUrl(): string {\n const baseUrl = getEnv(EnvVariables.FRONTEGG_BASE_URL) ?? setupEnvVariables.FRONTEGG_BASE_URL;\n if (baseUrl.endsWith('/')) {\n return baseUrl.slice(0, -1);\n }\n return baseUrl;\n }\n\n get baseUrlHost(): string {\n return new URL(this.baseUrl).hostname;\n }\n\n get clientId(): string {\n return getEnv(EnvVariables.FRONTEGG_CLIENT_ID) ?? setupEnvVariables.FRONTEGG_CLIENT_ID;\n }\n\n get jwtPublicKeyJson(): string | undefined {\n return getEnv(EnvVariables.FRONTEGG_JWT_PUBLIC_KEY);\n }\n\n get cookieName(): string {\n const cookieNameEnv = getEnvOrDefault(\n EnvVariables.FRONTEGG_COOKIE_NAME,\n setupEnvVariables.FRONTEGG_COOKIE_NAME ?? 'fe_session'\n );\n return `${cookieNameEnv}-${this.clientId.replace(/-/g, '')}`;\n }\n\n get cookieDomain(): string {\n return generateCookieDomain(this.appUrl);\n }\n\n get authRoutes(): Partial<AuthPageRoutes> {\n return this.fronteggAppOptions?.authOptions?.routes ?? {};\n }\n\n private validatePassword() {\n const passwordMaps = this.password;\n for (let key of Object.keys(passwordMaps)) {\n const password = passwordMaps[key];\n if (!password.match(/[0-9A-Fa-f]{6}/g) || password.length !== 64) {\n throw new InvalidFronteggEnv(\n EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD,\n `Hex string.\\n\\nFor quick password generation use the following command:\\nnode -e \"console.log(crypto.randomBytes(32).toString('hex'))\"`\n );\n }\n }\n }\n get password(): PasswordsMap {\n const encryptionPasswordEnv =\n getEnv(EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD) ?? setupEnvVariables.FRONTEGG_ENCRYPTION_PASSWORD;\n\n return normalizeStringPasswordToMap(encryptionPasswordEnv);\n }\n\n get isSSL(): boolean {\n return new URL(this.appUrl).protocol === 'https:';\n }\n\n get isHostedLogin(): boolean {\n return this.fronteggAppOptions.hostedLoginBox ?? false;\n }\n\n get disableInitialPropsRefreshToken(): boolean {\n const disableInitialPropsRefreshToken = getEnvOrDefault(\n EnvVariables.DISABLE_INITIAL_PROPS_REFRESH_TOKEN,\n setupEnvVariables.DISABLE_INITIAL_PROPS_REFRESH_TOKEN\n );\n return disableInitialPropsRefreshToken === 'true';\n }\n\n get appEnvConfig(): AppEnvConfig {\n return {\n envAppUrl: this.appUrl,\n envBaseUrl: this.baseUrl,\n envClientId: this.clientId,\n };\n }\n}\n\nexport { EnvVariables } from './constants';\nexport default new Config();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_helpers","require","_constants","_errors","setupEnvVariables","FRONTEGG_APP_URL","process","env","FRONTEGG_BASE_URL","FRONTEGG_TEST_URL","FRONTEGG_CLIENT_ID","FRONTEGG_CLIENT_SECRET","FRONTEGG_ENCRYPTION_PASSWORD","FRONTEGG_COOKIE_NAME","FRONTEGG_JWT_PUBLIC_KEY","FRONTEGG_SECURE_JWT_ENABLED","DISABLE_INITIAL_PROPS_REFRESH_TOKEN","VERCEL","VERCEL_URL","Config","constructor","fronteggAppOptions","window","validatePassword","appUrl","generateAppUrl","testUrl","getEnvOrDefault","EnvVariables","baseUrl","_getEnv","getEnv","endsWith","slice","baseUrlHost","URL","hostname","clientId","_getEnv2","clientSecret","undefined","_getEnv3","e","secureJwtEnabled","InvalidFronteggEnv","jwtPublicKeyJson","_getEnv4","cookieName","_setupEnvVariables$FR","cookieNameEnv","replace","cookieDomain","generateCookieDomain","authRoutes","_this$fronteggAppOpti","_this$fronteggAppOpti2","_this$fronteggAppOpti3","authOptions","routes","passwordMaps","password","key","Object","keys","match","length","_getEnv5","encryptionPasswordEnv","normalizeStringPasswordToMap","isSSL","protocol","isHostedLogin","_this$fronteggAppOpti4","hostedLoginBox","FRONTEGG_HOSTED_LOGIN","isForwardIpEnabled","disableInitialPropsRefreshToken","appEnvConfig","config","envAppUrl","envBaseUrl","envClientId","console","log","_default","exports","default"],"sources":["../../../../packages/nextjs/src/config/index.ts"],"sourcesContent":["import { AuthPageRoutes } from '@frontegg/redux-store';\nimport { WithFronteggAppOptions } from '../pages';\nimport { AppEnvConfig, PasswordsMap } from './types';\nimport { generateAppUrl, generateCookieDomain, getEnv, getEnvOrDefault, normalizeStringPasswordToMap } from './helpers';\nimport { EnvVariables } from './constants';\nimport { InvalidFronteggEnv } from '../utils/errors';\n\nconst setupEnvVariables = {\n FRONTEGG_APP_URL: process.env.FRONTEGG_APP_URL,\n FRONTEGG_BASE_URL: process.env.FRONTEGG_BASE_URL,\n FRONTEGG_TEST_URL: process.env.FRONTEGG_TEST_URL,\n FRONTEGG_CLIENT_ID: process.env.FRONTEGG_CLIENT_ID,\n FRONTEGG_CLIENT_SECRET: process.env.FRONTEGG_CLIENT_SECRET,\n FRONTEGG_ENCRYPTION_PASSWORD: process.env.FRONTEGG_ENCRYPTION_PASSWORD,\n FRONTEGG_COOKIE_NAME: process.env.FRONTEGG_COOKIE_NAME,\n FRONTEGG_JWT_PUBLIC_KEY: process.env.FRONTEGG_JWT_PUBLIC_KEY,\n FRONTEGG_SECURE_JWT_ENABLED: process.env.FRONTEGG_SECURE_JWT_ENABLED,\n DISABLE_INITIAL_PROPS_REFRESH_TOKEN: process.env.DISABLE_INITIAL_PROPS_REFRESH_TOKEN,\n VERCEL: process.env.VERCEL,\n VERCEL_URL: process.env.VERCEL_URL,\n};\n\nclass Config {\n public fronteggAppOptions: Partial<WithFronteggAppOptions> = {};\n\n constructor() {\n if (typeof window === 'undefined') {\n this.validatePassword();\n }\n }\n\n get appUrl(): string {\n return generateAppUrl();\n }\n\n get testUrl(): string | undefined {\n return getEnvOrDefault(EnvVariables.FRONTEGG_TEST_URL, setupEnvVariables.FRONTEGG_TEST_URL);\n }\n\n get baseUrl(): string {\n const baseUrl = getEnv(EnvVariables.FRONTEGG_BASE_URL) ?? setupEnvVariables.FRONTEGG_BASE_URL;\n if (baseUrl.endsWith('/')) {\n return baseUrl.slice(0, -1);\n }\n return baseUrl;\n }\n\n get baseUrlHost(): string {\n return new URL(this.baseUrl).hostname;\n }\n\n get clientId(): string {\n return getEnv(EnvVariables.FRONTEGG_CLIENT_ID) ?? setupEnvVariables.FRONTEGG_CLIENT_ID;\n }\n\n get clientSecret(): string | undefined {\n let clientSecret = undefined;\n try {\n clientSecret = getEnv(EnvVariables.FRONTEGG_CLIENT_SECRET) ?? setupEnvVariables.FRONTEGG_CLIENT_SECRET;\n } catch (e) {\n clientSecret = setupEnvVariables.FRONTEGG_CLIENT_SECRET;\n }\n\n if (this.secureJwtEnabled === 'true' && !clientSecret) {\n throw new InvalidFronteggEnv(\n EnvVariables.FRONTEGG_CLIENT_SECRET,\n 'Client secret is required when secure JWT is enabled'\n );\n }\n return clientSecret;\n }\n\n get jwtPublicKeyJson(): string | undefined {\n return getEnv(EnvVariables.FRONTEGG_JWT_PUBLIC_KEY);\n }\n\n get secureJwtEnabled(): string | undefined {\n try {\n return getEnv(EnvVariables.FRONTEGG_SECURE_JWT_ENABLED) ?? setupEnvVariables.FRONTEGG_SECURE_JWT_ENABLED;\n } catch (e) {\n return setupEnvVariables.FRONTEGG_SECURE_JWT_ENABLED;\n }\n }\n\n get cookieName(): string {\n const cookieNameEnv = getEnvOrDefault(\n EnvVariables.FRONTEGG_COOKIE_NAME,\n setupEnvVariables.FRONTEGG_COOKIE_NAME ?? 'fe_session'\n );\n return `${cookieNameEnv}-${this.clientId.replace(/-/g, '')}`;\n }\n\n get cookieDomain(): string {\n return generateCookieDomain(this.appUrl);\n }\n\n get authRoutes(): Partial<AuthPageRoutes> {\n return this.fronteggAppOptions?.authOptions?.routes ?? {};\n }\n\n private validatePassword() {\n const passwordMaps = this.password;\n for (let key of Object.keys(passwordMaps)) {\n const password = passwordMaps[key];\n if (!password.match(/[0-9A-Fa-f]{6}/g) || password.length !== 64) {\n throw new InvalidFronteggEnv(\n EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD,\n `Hex string.\\n\\nFor quick password generation use the following command:\\nnode -e \"console.log(crypto.randomBytes(32).toString('hex'))\"`\n );\n }\n }\n }\n\n get password(): PasswordsMap {\n const encryptionPasswordEnv =\n getEnv(EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD) ?? setupEnvVariables.FRONTEGG_ENCRYPTION_PASSWORD;\n\n return normalizeStringPasswordToMap(encryptionPasswordEnv);\n }\n\n get isSSL(): boolean {\n return new URL(this.appUrl).protocol === 'https:';\n }\n\n get isHostedLogin(): boolean {\n return (\n this.fronteggAppOptions.hostedLoginBox ?? getEnvOrDefault(EnvVariables.FRONTEGG_HOSTED_LOGIN, 'false') === 'true'\n );\n }\n\n get isForwardIpEnabled(): boolean {\n if (this.clientSecret) {\n return getEnvOrDefault(EnvVariables.FRONTEGG_HOSTED_LOGIN, 'false') === 'true';\n }\n return false;\n }\n\n get disableInitialPropsRefreshToken(): boolean {\n const disableInitialPropsRefreshToken = getEnvOrDefault(\n EnvVariables.DISABLE_INITIAL_PROPS_REFRESH_TOKEN,\n setupEnvVariables.DISABLE_INITIAL_PROPS_REFRESH_TOKEN\n );\n return disableInitialPropsRefreshToken === 'true';\n }\n\n get appEnvConfig(): AppEnvConfig {\n const config = {\n envAppUrl: this.appUrl,\n envBaseUrl: this.baseUrl,\n envClientId: this.clientId,\n secureJwtEnabled: this.secureJwtEnabled,\n };\n console.log('this.appEnvConfig', config);\n return config;\n }\n}\n\nexport { EnvVariables } from './constants';\nexport default new Config();\n"],"mappings":"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"}
|
package/config/types.d.ts
CHANGED
package/config/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../packages/nextjs/src/config/types.ts"],"sourcesContent":["/**\n * PasswordMap used for JWT encryption, you can create multiple passwords\n * to be used for encrypting session cookie as round-robin strategy.\n */\nexport type PasswordsMap = { [id: string]: string };\n\n/**\n * PropTypes passed by FronteggProvider to the ClientSide Frontegg components.\n */\nexport interface AppEnvConfig {\n /** {@link EnvVariables.FRONTEGG_APP_URL} */\n envAppUrl: string;\n /** {@link EnvVariables.FRONTEGG_BASE_URL} */\n envBaseUrl: string;\n /** {@link EnvVariables.FRONTEGG_CLIENT_ID} */\n envClientId: string;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../packages/nextjs/src/config/types.ts"],"sourcesContent":["/**\n * PasswordMap used for JWT encryption, you can create multiple passwords\n * to be used for encrypting session cookie as round-robin strategy.\n */\nexport type PasswordsMap = { [id: string]: string };\n\n/**\n * PropTypes passed by FronteggProvider to the ClientSide Frontegg components.\n */\nexport interface AppEnvConfig {\n /** {@link EnvVariables.FRONTEGG_APP_URL} */\n envAppUrl: string;\n /** {@link EnvVariables.FRONTEGG_BASE_URL} */\n envBaseUrl: string;\n /** {@link EnvVariables.FRONTEGG_CLIENT_ID} */\n envClientId: string;\n\n /** {@link EnvVariables.FRONTEGG_SECURE_JWT_ENABLED} */\n secureJwtEnabled?: string;\n}\n"],"mappings":""}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import type { IncomingMessage } from 'http';
|
|
2
2
|
import { FronteggNextJSSession } from '../types';
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
3
4
|
export declare const getSessionOnEdge: (req: IncomingMessage | Request) => Promise<FronteggNextJSSession | undefined>;
|
|
5
|
+
export declare const handleHostedLoginCallback: (req: IncomingMessage | Request, pathname: string, searchParams: URLSearchParams) => Promise<NextResponse>;
|
|
6
|
+
export declare const isHostedLoginCallback: (pathname: string, searchParams: URLSearchParams) => boolean;
|
package/edge/getSessionOnEdge.js
CHANGED
|
@@ -4,13 +4,74 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.getSessionOnEdge = void 0;
|
|
7
|
+
exports.isHostedLoginCallback = exports.handleHostedLoginCallback = exports.getSessionOnEdge = void 0;
|
|
8
8
|
var _cookies = _interopRequireDefault(require("../utils/cookies"));
|
|
9
9
|
var _createSession = _interopRequireDefault(require("../utils/createSession"));
|
|
10
10
|
var _encryptionEdge = _interopRequireDefault(require("../utils/encryption-edge"));
|
|
11
|
+
var _api = _interopRequireDefault(require("../api"));
|
|
12
|
+
var _server = require("next/server");
|
|
13
|
+
var _config = _interopRequireDefault(require("../config"));
|
|
14
|
+
var _jwt = _interopRequireDefault(require("../utils/jwt"));
|
|
15
|
+
async function createSessionFromAccessTokenEdge(data) {
|
|
16
|
+
var _data$accessToken, _data$refreshToken;
|
|
17
|
+
const accessToken = (_data$accessToken = data.accessToken) != null ? _data$accessToken : data.access_token;
|
|
18
|
+
const refreshToken = (_data$refreshToken = data.refreshToken) != null ? _data$refreshToken : data.refresh_token;
|
|
19
|
+
const {
|
|
20
|
+
payload: decodedJwt
|
|
21
|
+
} = await _jwt.default.verify(accessToken);
|
|
22
|
+
decodedJwt.expiresIn = Math.floor((decodedJwt.exp * 1000 - Date.now()) / 1000);
|
|
23
|
+
const tokens = {
|
|
24
|
+
accessToken,
|
|
25
|
+
refreshToken
|
|
26
|
+
};
|
|
27
|
+
const session = await _encryptionEdge.default.sealTokens(tokens, decodedJwt.exp);
|
|
28
|
+
return [session, decodedJwt, refreshToken];
|
|
29
|
+
}
|
|
11
30
|
const getSessionOnEdge = req => {
|
|
12
31
|
const cookies = _cookies.default.getSessionCookieFromRequest(req);
|
|
13
32
|
return (0, _createSession.default)(cookies, _encryptionEdge.default);
|
|
14
33
|
};
|
|
15
34
|
exports.getSessionOnEdge = getSessionOnEdge;
|
|
35
|
+
const handleHostedLoginCallback = async (req, pathname, searchParams) => {
|
|
36
|
+
var _searchParams$get;
|
|
37
|
+
if (!isHostedLoginCallback(pathname, searchParams)) {
|
|
38
|
+
return _server.NextResponse.next();
|
|
39
|
+
}
|
|
40
|
+
const code = (_searchParams$get = searchParams.get('code')) != null ? _searchParams$get : '';
|
|
41
|
+
const response = await _api.default.exchangeHostedLoginToken({
|
|
42
|
+
'Content-Type': 'application/json'
|
|
43
|
+
}, code, _config.default.clientId, _config.default.clientSecret);
|
|
44
|
+
const data = await response.json();
|
|
45
|
+
const [session, decodedJwt, refreshToken] = await createSessionFromAccessTokenEdge(data);
|
|
46
|
+
if (!session) {
|
|
47
|
+
return _server.NextResponse.redirect(_config.default.appUrl);
|
|
48
|
+
}
|
|
49
|
+
const isSecured = _config.default.isSSL;
|
|
50
|
+
const cookieValue = _cookies.default.create({
|
|
51
|
+
value: session,
|
|
52
|
+
expires: new Date(decodedJwt.exp * 1000),
|
|
53
|
+
secure: isSecured
|
|
54
|
+
});
|
|
55
|
+
const refreshCookie = _cookies.default.create({
|
|
56
|
+
cookieName: `fe_refresh_${_config.default.clientId.replace('-', '')}`,
|
|
57
|
+
value: refreshToken != null ? refreshToken : '',
|
|
58
|
+
expires: new Date(decodedJwt.exp * 1000),
|
|
59
|
+
secure: isSecured
|
|
60
|
+
});
|
|
61
|
+
const sessionCookieHeaders = cookieValue.map(cookie => ['set-cookie', cookie]);
|
|
62
|
+
const refreshCookieHeaders = refreshCookie.map(cookie => ['set-cookie', cookie]);
|
|
63
|
+
return _server.NextResponse.redirect(_config.default.appUrl, {
|
|
64
|
+
headers: [...sessionCookieHeaders, ...refreshCookieHeaders]
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
exports.handleHostedLoginCallback = handleHostedLoginCallback;
|
|
68
|
+
const isHostedLoginCallback = (pathname, searchParams) => {
|
|
69
|
+
if (_config.default.secureJwtEnabled) {
|
|
70
|
+
if (pathname.startsWith('/oauth/callback')) {
|
|
71
|
+
return searchParams.get('code') != null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
};
|
|
76
|
+
exports.isHostedLoginCallback = isHostedLoginCallback;
|
|
16
77
|
//# sourceMappingURL=getSessionOnEdge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSessionOnEdge.js","names":["_cookies","_interopRequireDefault","require","_createSession","_encryptionEdge","getSessionOnEdge","req","cookies","CookieManager","getSessionCookieFromRequest","createSession","encryptionEdge","exports"],"sources":["../../../../packages/nextjs/src/edge/getSessionOnEdge.ts"],"sourcesContent":["import type { IncomingMessage } from 'http';\nimport { FronteggNextJSSession } from '../types';\nimport CookieManager from '../utils/cookies';\nimport createSession from '../utils/createSession';\nimport encryptionEdge from '../utils/encryption-edge';\n\nexport const getSessionOnEdge = (req: IncomingMessage | Request): Promise<FronteggNextJSSession | undefined> => {\n const cookies = CookieManager.getSessionCookieFromRequest(req);\n return createSession(cookies, encryptionEdge);\n};\n"],"mappings":";;;;;;;AAEA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,cAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,eAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEO,
|
|
1
|
+
{"version":3,"file":"getSessionOnEdge.js","names":["_cookies","_interopRequireDefault","require","_createSession","_encryptionEdge","_api","_server","_config","_jwt","createSessionFromAccessTokenEdge","data","_data$accessToken","_data$refreshToken","accessToken","access_token","refreshToken","refresh_token","payload","decodedJwt","JwtManager","verify","expiresIn","Math","floor","exp","Date","now","tokens","session","encryptionUtils","sealTokens","getSessionOnEdge","req","cookies","CookieManager","getSessionCookieFromRequest","createSession","encryptionEdge","exports","handleHostedLoginCallback","pathname","searchParams","_searchParams$get","isHostedLoginCallback","NextResponse","next","code","get","response","api","exchangeHostedLoginToken","config","clientId","clientSecret","json","redirect","appUrl","isSecured","isSSL","cookieValue","create","value","expires","secure","refreshCookie","cookieName","replace","sessionCookieHeaders","map","cookie","refreshCookieHeaders","headers","secureJwtEnabled","startsWith"],"sources":["../../../../packages/nextjs/src/edge/getSessionOnEdge.ts"],"sourcesContent":["import type { IncomingMessage } from 'http';\nimport { FronteggNextJSSession } from '../types';\nimport CookieManager from '../utils/cookies';\nimport createSession from '../utils/createSession';\nimport encryptionEdge from '../utils/encryption-edge';\nimport api from '../api';\nimport { NextResponse } from 'next/server';\nimport config from '../config';\nimport JwtManager from '../utils/jwt';\nimport encryptionUtils from '../utils/encryption-edge';\nimport Cookies from '../utils/cookies';\n\nasync function createSessionFromAccessTokenEdge(data: any): Promise<[string, any, string] | []> {\n const accessToken = data.accessToken ?? data.access_token;\n const refreshToken = data.refreshToken ?? data.refresh_token;\n const { payload: decodedJwt }: any = await JwtManager.verify(accessToken);\n decodedJwt.expiresIn = Math.floor((decodedJwt.exp * 1000 - Date.now()) / 1000);\n\n const tokens = { accessToken, refreshToken };\n const session = await encryptionUtils.sealTokens(tokens, decodedJwt.exp);\n return [session, decodedJwt, refreshToken];\n}\n\nexport const getSessionOnEdge = (req: IncomingMessage | Request): Promise<FronteggNextJSSession | undefined> => {\n const cookies = CookieManager.getSessionCookieFromRequest(req);\n return createSession(cookies, encryptionEdge);\n};\n\nexport const handleHostedLoginCallback = async (\n req: IncomingMessage | Request,\n pathname: string,\n searchParams: URLSearchParams\n): Promise<NextResponse> => {\n if (!isHostedLoginCallback(pathname, searchParams)) {\n return NextResponse.next();\n }\n\n const code = searchParams.get('code') ?? '';\n const response = await api.exchangeHostedLoginToken(\n {\n 'Content-Type': 'application/json',\n },\n code,\n config.clientId,\n config.clientSecret!\n );\n\n const data = await response.json();\n\n const [session, decodedJwt, refreshToken] = await createSessionFromAccessTokenEdge(data);\n\n if (!session) {\n return NextResponse.redirect(config.appUrl);\n }\n const isSecured = config.isSSL;\n const cookieValue = CookieManager.create({\n value: session,\n expires: new Date(decodedJwt.exp * 1000),\n secure: isSecured,\n });\n const refreshCookie = CookieManager.create({\n cookieName: `fe_refresh_${config.clientId.replace('-', '')}`,\n value: refreshToken ?? '',\n expires: new Date(decodedJwt.exp * 1000),\n secure: isSecured,\n });\n const sessionCookieHeaders: [string, string][] = cookieValue.map((cookie) => ['set-cookie', cookie]);\n const refreshCookieHeaders: [string, string][] = refreshCookie.map((cookie) => ['set-cookie', cookie]);\n\n return NextResponse.redirect(config.appUrl, {\n headers: [...sessionCookieHeaders, ...refreshCookieHeaders],\n });\n};\n\nexport const isHostedLoginCallback = (pathname: string, searchParams: URLSearchParams): boolean => {\n if (config.secureJwtEnabled) {\n if (pathname.startsWith('/oauth/callback')) {\n return searchParams.get('code') != null;\n }\n }\n return false;\n};\n"],"mappings":"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"}
|