@frontegg/nextjs 8.0.25 → 8.0.26-alpha.9939120738

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +32 -7
  3. package/api/index.d.ts +6 -1
  4. package/api/index.js +27 -4
  5. package/api/index.js.map +1 -1
  6. package/app/FronteggAppProvider.js +10 -3
  7. package/app/FronteggAppProvider.js.map +1 -1
  8. package/config/constants.d.ts +22 -0
  9. package/config/constants.js +4 -0
  10. package/config/constants.js.map +1 -1
  11. package/config/index.d.ts +3 -0
  12. package/config/index.js +37 -5
  13. package/config/index.js.map +1 -1
  14. package/config/types.d.ts +2 -0
  15. package/config/types.js.map +1 -1
  16. package/edge/getSessionOnEdge.d.ts +3 -0
  17. package/edge/getSessionOnEdge.js +62 -1
  18. package/edge/getSessionOnEdge.js.map +1 -1
  19. package/index.js +1 -1
  20. package/middleware/FronteggApiMiddleware.js +14 -2
  21. package/middleware/FronteggApiMiddleware.js.map +1 -1
  22. package/middleware/ProxyRequestCallback.js +0 -3
  23. package/middleware/ProxyRequestCallback.js.map +1 -1
  24. package/middleware/ProxyResponseCallback.js +8 -7
  25. package/middleware/ProxyResponseCallback.js.map +1 -1
  26. package/middleware/helpers.d.ts +14 -0
  27. package/middleware/helpers.js +55 -1
  28. package/middleware/helpers.js.map +1 -1
  29. package/package.json +1 -1
  30. package/pages/withFronteggApp/withFronteggApp.js +14 -3
  31. package/pages/withFronteggApp/withFronteggApp.js.map +1 -1
  32. package/sdkVersion.js +1 -1
  33. package/sdkVersion.js.map +1 -1
  34. package/types/index.d.ts +1 -0
  35. package/types/index.js.map +1 -1
  36. package/utils/initializeFronteggApp/index.js +2 -1
  37. package/utils/initializeFronteggApp/index.js.map +1 -1
  38. package/utils/refreshAccessTokenIfNeeded/helpers.js +10 -2
  39. package/utils/refreshAccessTokenIfNeeded/helpers.js.map +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
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-15)
4
+
5
+
6
+
3
7
  ## [8.0.25](https://github.com/frontegg/frontegg-nextjs/compare/v8.0.24...v8.0.25) (2024-7-9)
4
8
 
5
9
  - 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
- hostedLoginBox: true
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
- # The statless session encruption password, used to encrypt
117
- # jwt before sending it to the client side.
118
- #
119
- # For quick password generation use the following command:
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 statless session cookie name
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","exports","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 (headers: Record<string, string>, refresh_token: string) => {\n return Post({\n url: `${config.baseUrl}${ApiUrls.refreshToken.hosted}`,\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token,\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};\n"],"mappings":"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"}
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
- const userData = await (0, _fetchUserData.default)({
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 const userData = await fetchUserData({ getSession: getAppSession, getHeaders: getAppHeadersPromise });\n const subDomainAppUrl = await getAppUrlForCustomLoginWithSubdomain(options.customLoginOptions?.subDomainIndex);\n\n const providerProps = {\n ...appEnvConfig,\n ...userData,\n ...options,\n envAppUrl: subDomainAppUrl ?? envAppUrl,\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;AAA8F,IAAAM,WAAA,GAAAN,OAAA;AAAA,MAAAO,SAAA;AAMvF,MAAMC,mBAAmB,GAAG,MAAOC,OAAiC,IAAK;EAAA,IAAAC,qBAAA;EAC9E,MAAAC,oBAAA,GAAuCC,eAAM,CAACC,YAAY;IAApD;MAAEC;IAA2B,CAAC,GAAAH,oBAAA;IAAdE,YAAY,OAAAE,8BAAA,CAAAC,OAAA,EAAAL,oBAAA,EAAAJ,SAAA;EAClC,MAAMU,QAAQ,GAAG,MAAM,IAAAC,sBAAa,EAAC;IAAEC,UAAU,EAAEC,sBAAa;IAAEC,UAAU,EAAEC;EAAqB,CAAC,CAAC;EACrG,MAAMC,eAAe,GAAG,MAAM,IAAAC,0EAAoC,GAAAd,qBAAA,GAACD,OAAO,CAACgB,kBAAkB,qBAA1Bf,qBAAA,CAA4BgB,cAAc,CAAC;EAE9G,MAAMC,aAAa,OAAAC,SAAA,CAAAZ,OAAA,MACdH,YAAY,EACZI,QAAQ,EACRR,OAAO;IACVK,SAAS,EAAES,eAAe,WAAfA,eAAe,GAAIT;EAAS,EACxC;EAED,oBAAO,IAAAR,WAAA,CAAAuB,GAAA,EAAC5B,uBAAA,CAAA6B,sBAAsB,MAAAF,SAAA,CAAAZ,OAAA,MAAKW,aAAa,EAAI;AACtD,CAAC;AAACI,OAAA,CAAAvB,mBAAA,GAAAA,mBAAA"}
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"}
@@ -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
@@ -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;
@@ -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 _getEnv3;
82
- const encryptionPasswordEnv = (_getEnv3 = (0, _helpers.getEnv)(_constants.EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD)) != null ? _getEnv3 : setupEnvVariables.FRONTEGG_ENCRYPTION_PASSWORD;
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
- return {
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();
@@ -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
@@ -15,4 +15,6 @@ export interface AppEnvConfig {
15
15
  envBaseUrl: string;
16
16
  /** {@link EnvVariables.FRONTEGG_CLIENT_ID} */
17
17
  envClientId: string;
18
+ /** {@link EnvVariables.FRONTEGG_SECURE_JWT_ENABLED} */
19
+ secureJwtEnabled?: string;
18
20
  }
@@ -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;
@@ -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,MAAMG,gBAAgB,GAAIC,GAA8B,IAAiD;EAC9G,MAAMC,OAAO,GAAGC,gBAAa,CAACC,2BAA2B,CAACH,GAAG,CAAC;EAC9D,OAAO,IAAAI,sBAAa,EAACH,OAAO,EAAEI,uBAAc,CAAC;AAC/C,CAAC;AAACC,OAAA,CAAAP,gBAAA,GAAAA,gBAAA"}
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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"}
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v8.0.25
1
+ /** @license Frontegg v8.0.26-alpha.9939120738
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.