@frontegg/nextjs 9.2.14-alpha.34330679131 → 9.2.14

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 CHANGED
@@ -1,9 +1,24 @@
1
1
  # Change Log
2
2
 
3
- ## [9.2.14](https://github.com/frontegg/frontegg-nextjs/compare/v9.2.13...v9.2.14) (2026-9-9)
3
+ ## [9.2.14](https://github.com/frontegg/frontegg-nextjs/compare/v9.2.13...v9.2.14) (2026-9-29)
4
4
 
5
5
 
6
+ ### Highlights
7
+
8
+ **Impersonation with Hosted Login and secure JWT** ([#448](https://github.com/frontegg/frontegg-nextjs/pull/448))
9
+
10
+ Impersonation started from the Frontegg portal redirects to the application URL (`{appUrl}?code=...`) instead of `/oauth/callback`, so the Next.js middleware never created the session. To support it, enable the new environment variable:
11
+
12
+ ```
13
+ FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL='true'
14
+ ```
15
+
16
+ - Requires `FRONTEGG_SECURE_JWT_ENABLED='true'`.
17
+ - `FRONTEGG_APP_URL` must be identical to the App URL configured in the Frontegg portal.
18
+ - Off by default, so existing apps are not affected.
19
+
6
20
  ### NextJS Wrapper 9.2.14:
21
+ - fix: accept the hosted login code on the app URL for impersonation
7
22
  - fix: honor authRoutes.hostedLoginRedirectUrl for hosted login callback
8
23
  - fix: bump dependencies and resolve security vulnerabilities
9
24
  - test: add unit + E2E test coverage for cookies and token refresh
package/README.md CHANGED
@@ -152,6 +152,13 @@ DISABLE_INITIAL_PROPS_REFRESH_TOKEN='true'
152
152
  # To enable this feature, you need to provide {@link EnvVariables.FRONTEGG_CLIENT_SECRET}
153
153
  FRONTEGG_SECURE_JWT_ENABLED='false'
154
154
 
155
+ # Accept the hosted login authorization code on the FRONTEGG_APP_URL itself, in addition to
156
+ # the `/oauth/callback` route. Needed for flows that are started outside the application,
157
+ # like impersonation, which redirect to the application URL configured in the Frontegg portal.
158
+ # Requires FRONTEGG_SECURE_JWT_ENABLED, and the application URL configured in the Frontegg portal
159
+ # must be identical to FRONTEGG_APP_URL.
160
+ FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL='false'
161
+
155
162
  # The Frontegg Hosted Login URL used to redirect the user to the Frontegg login page.
156
163
  # Set to 'true' to enable the hosted login feature.
157
164
  FRONTEGG_HOSTED_LOGIN='true'
package/api/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import { UserEntitlementsResponseV2 } from '@frontegg/types';
3
3
  /**
4
4
  * Send HTTP post request for Frontegg services to exchange `hosted login` callback code
5
5
  */
6
- export declare const exchangeHostedLoginToken: (headers: Record<string, string>, code: string, cliendId: string, clientSecret: string) => Promise<Response>;
6
+ export declare const exchangeHostedLoginToken: (headers: Record<string, string>, code: string, cliendId: string, clientSecret: string, redirectUri?: string) => Promise<Response>;
7
7
  /**
8
8
  *
9
9
  * @param headers
@@ -33,6 +33,6 @@ declare const _default: {
33
33
  getTenants: (headers: Record<string, string>) => Promise<GetCurrentUserTenantsResponse | undefined>;
34
34
  getPublicSettings: (headers: Record<string, string>) => Promise<IPublicSettingsResponse | undefined>;
35
35
  getEntitlements: (headers: Record<string, string>) => Promise<UserEntitlementsResponseV2 | undefined>;
36
- exchangeHostedLoginToken: (headers: Record<string, string>, code: string, cliendId: string, clientSecret: string) => Promise<Response>;
36
+ exchangeHostedLoginToken: (headers: Record<string, string>, code: string, cliendId: string, clientSecret: string, redirectUri?: string) => Promise<Response>;
37
37
  };
38
38
  export default _default;
package/api/index.js CHANGED
@@ -54,11 +54,11 @@ const refreshTokenHostedLogin = async (headers, refreshToken, clientId, clientSe
54
54
  /**
55
55
  * Send HTTP post request for Frontegg services to exchange `hosted login` callback code
56
56
  */
57
- const exchangeHostedLoginToken = async (headers, code, cliendId, clientSecret) => {
57
+ const exchangeHostedLoginToken = async (headers, code, cliendId, clientSecret, redirectUri = (0, _routing.buildHostedLoginRedirectUri)()) => {
58
58
  return (0, _utils.Post)({
59
59
  url: `${_config.default.baseUrl}${_urls.CommonUrls.refreshToken.hosted}`,
60
60
  body: JSON.stringify({
61
- redirect_uri: (0, _routing.buildHostedLoginRedirectUri)(),
61
+ redirect_uri: redirectUri,
62
62
  grant_type: 'authorization_code',
63
63
  code,
64
64
  client_id: cliendId,
package/api/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_config","_interopRequireDefault","require","_utils","_restApi","_urls","_routing","loadPublicKey","response","fetch","config","baseUrl","CommonUrls","WellKnown","jwks","cache","data","json","keys","refreshTokenEmbedded","headers","Post","url","refreshToken","embedded","body","credentials","buildRequestHeaders","refreshTokenHostedLogin","clientId","clientSecret","hosted","JSON","stringify","grant_type","refresh_token","client_id","client_secret","exchangeHostedLoginToken","code","cliendId","redirect_uri","buildHostedLoginRedirectUri","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 { 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';\nimport { CommonUrls } from '../utils/common/urls';\nimport { buildHostedLoginRedirectUri } from '../utils/routing';\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}${CommonUrls.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}${CommonUrls.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 refreshToken: string,\n clientId?: string,\n clientSecret?: string\n) => {\n return Post({\n url: `${config.baseUrl}${CommonUrls.refreshToken.hosted}`,\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: clientId,\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}${CommonUrls.refreshToken.hosted}`,\n body: JSON.stringify({\n redirect_uri: buildHostedLoginRedirectUri(),\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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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_config","_interopRequireDefault","require","_utils","_restApi","_urls","_routing","loadPublicKey","response","fetch","config","baseUrl","CommonUrls","WellKnown","jwks","cache","data","json","keys","refreshTokenEmbedded","headers","Post","url","refreshToken","embedded","body","credentials","buildRequestHeaders","refreshTokenHostedLogin","clientId","clientSecret","hosted","JSON","stringify","grant_type","refresh_token","client_id","client_secret","exchangeHostedLoginToken","code","cliendId","redirectUri","buildHostedLoginRedirectUri","redirect_uri","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 { 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';\nimport { CommonUrls } from '../utils/common/urls';\nimport { buildHostedLoginRedirectUri } from '../utils/routing';\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}${CommonUrls.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}${CommonUrls.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 refreshToken: string,\n clientId?: string,\n clientSecret?: string\n) => {\n return Post({\n url: `${config.baseUrl}${CommonUrls.refreshToken.hosted}`,\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: clientId,\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 redirectUri: string = buildHostedLoginRedirectUri()\n) => {\n return Post({\n url: `${config.baseUrl}${CommonUrls.refreshToken.hosted}`,\n body: JSON.stringify({\n redirect_uri: redirectUri,\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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","ignoreList":[]}
@@ -92,6 +92,16 @@ export declare enum EnvVariables {
92
92
  * set to 'true' to enable the hosted login feature
93
93
  */
94
94
  FRONTEGG_HOSTED_LOGIN = "FRONTEGG_HOSTED_LOGIN",
95
+ /**
96
+ * Accept the hosted login authorization code on the {@link EnvVariables.FRONTEGG_APP_URL} itself,
97
+ * in addition to the `/oauth/callback` route. Flows that are started outside the application,
98
+ * like impersonation, redirect to the application URL configured in the Frontegg portal
99
+ * instead of the callback route.
100
+ *
101
+ * Requires {@link EnvVariables.FRONTEGG_SECURE_JWT_ENABLED}, and the application URL configured
102
+ * in the Frontegg portal must be identical to {@link EnvVariables.FRONTEGG_APP_URL}.
103
+ */
104
+ FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL = "FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL",
95
105
  /**
96
106
  * Forward client IP address to Frontegg gateway, used to detect the client's IP address
97
107
  * when the Next.js application using frontegg middleware proxy service
@@ -98,6 +98,16 @@ let EnvVariables = exports.EnvVariables = /*#__PURE__*/function (EnvVariables) {
98
98
  * set to 'true' to enable the hosted login feature
99
99
  */
100
100
  EnvVariables["FRONTEGG_HOSTED_LOGIN"] = "FRONTEGG_HOSTED_LOGIN";
101
+ /**
102
+ * Accept the hosted login authorization code on the {@link EnvVariables.FRONTEGG_APP_URL} itself,
103
+ * in addition to the `/oauth/callback` route. Flows that are started outside the application,
104
+ * like impersonation, redirect to the application URL configured in the Frontegg portal
105
+ * instead of the callback route.
106
+ *
107
+ * Requires {@link EnvVariables.FRONTEGG_SECURE_JWT_ENABLED}, and the application URL configured
108
+ * in the Frontegg portal must be identical to {@link EnvVariables.FRONTEGG_APP_URL}.
109
+ */
110
+ EnvVariables["FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL"] = "FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL";
101
111
  /**
102
112
  * Forward client IP address to Frontegg gateway, used to detect the client's IP address
103
113
  * when the Next.js application using frontegg middleware proxy service
@@ -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 * Your Frontegg application ID, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/applications)\n * - For Prod environment [visit](https://portal.frontegg.com/production/applications)\n */\n FRONTEGG_APP_ID = 'FRONTEGG_APP_ID',\n\n /**\n * Rewrite the cookie name by the Frontegg application ID\n * to support multiple Frontegg applications with same domain\n */\n FRONTEGG_REWRITE_COOKIE_BY_APP_ID = 'FRONTEGG_REWRITE_COOKIE_BY_APP_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 * Your Frontegg application's Shared Secret, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/applications/[YOUR_APP_ID])\n * - For Prod environment [visit](https://portal.frontegg.com/production/applications/[YOUR_APP_ID])\n */\n FRONTEGG_SHARED_SECRET = 'FRONTEGG_SHARED_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 * The stateless cookie domain for storing the encrypted JWT\n * value as session cookies for supporting getServerSideProps and ServerComponents\n */\n FRONTEGG_COOKIE_DOMAIN = 'FRONTEGG_COOKIE_DOMAIN',\n\n /**\n * The stateless cookie same site value for storing the encrypted JWT\n * default is none, you can set it to 'lax' or 'strict' for more security\n */\n FRONTEGG_COOKIE_SAME_SITE = 'FRONTEGG_COOKIE_SAME_SITE',\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_SHARED_SECRET}\n */\n FRONTEGG_FORWARD_IP = 'FRONTEGG_FORWARD_IP',\n\n /**\n * Where the Nextjs build output will be stored as static files\n * for SSG and ISR pages, this env variable will disable environment variables\n * checking and will not throw an error if the env variables are for SSR\n *\n * NOTE: you cannot use this env with SSR.\n */\n FRONTEGG_SSG_EXPORT = 'FRONTEGG_SSG_EXPORT',\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,GAAAC,OAAA,CAAAD,YAAA,0BAAZA,YAAY;EACtB;AACF;AACA;AACA;EAJYA,YAAY;EAMtB;AACF;AACA;AACA;AACA;EAVYA,YAAY;EAYtB;AACF;AACA;AACA;EAfYA,YAAY;EAkBtB;AACF;AACA;AACA;AACA;EAtBYA,YAAY;EAyBtB;AACF;AACA;AACA;AACA;EA7BYA,YAAY;EAgCtB;AACF;AACA;AACA;EAnCYA,YAAY;EAsCtB;AACF;AACA;AACA;AACA;EA1CYA,YAAY;EA6CtB;AACF;AACA;AACA;AACA;EAjDYA,YAAY;EAoDtB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EA7DYA,YAAY;EAgEtB;AACF;AACA;AACA;AACA;AACA;AACA;EAtEYA,YAAY;EAyEtB;AACF;AACA;AACA;EA5EYA,YAAY;EA+EtB;AACF;AACA;AACA;EAlFYA,YAAY;EAqFtB;AACF;AACA;AACA;EAxFYA,YAAY;EA2FtB;AACF;AACA;EA7FYA,YAAY;EAgGtB;AACF;AACA;AACA;EAnGYA,YAAY;EAsGtB;AACF;AACA;AACA;EAzGYA,YAAY;EA4GtB;AACF;AACA;AACA;AACA;EAhHYA,YAAY;EAmHtB;AACF;AACA;AACA;AACA;AACA;AACA;EAzHYA,YAAY;EA2HtB;AACF;AACA;AACA;AACA;AACA;AACA;EAjIYA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA","ignoreList":[]}
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 ID, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/applications)\n * - For Prod environment [visit](https://portal.frontegg.com/production/applications)\n */\n FRONTEGG_APP_ID = 'FRONTEGG_APP_ID',\n\n /**\n * Rewrite the cookie name by the Frontegg application ID\n * to support multiple Frontegg applications with same domain\n */\n FRONTEGG_REWRITE_COOKIE_BY_APP_ID = 'FRONTEGG_REWRITE_COOKIE_BY_APP_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 * Your Frontegg application's Shared Secret, get it by visit:\n * - For Dev environment [visit](https://portal.frontegg.com/development/applications/[YOUR_APP_ID])\n * - For Prod environment [visit](https://portal.frontegg.com/production/applications/[YOUR_APP_ID])\n */\n FRONTEGG_SHARED_SECRET = 'FRONTEGG_SHARED_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 * The stateless cookie domain for storing the encrypted JWT\n * value as session cookies for supporting getServerSideProps and ServerComponents\n */\n FRONTEGG_COOKIE_DOMAIN = 'FRONTEGG_COOKIE_DOMAIN',\n\n /**\n * The stateless cookie same site value for storing the encrypted JWT\n * default is none, you can set it to 'lax' or 'strict' for more security\n */\n FRONTEGG_COOKIE_SAME_SITE = 'FRONTEGG_COOKIE_SAME_SITE',\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 * Accept the hosted login authorization code on the {@link EnvVariables.FRONTEGG_APP_URL} itself,\n * in addition to the `/oauth/callback` route. Flows that are started outside the application,\n * like impersonation, redirect to the application URL configured in the Frontegg portal\n * instead of the callback route.\n *\n * Requires {@link EnvVariables.FRONTEGG_SECURE_JWT_ENABLED}, and the application URL configured\n * in the Frontegg portal must be identical to {@link EnvVariables.FRONTEGG_APP_URL}.\n */\n FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL = 'FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL',\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_SHARED_SECRET}\n */\n FRONTEGG_FORWARD_IP = 'FRONTEGG_FORWARD_IP',\n\n /**\n * Where the Nextjs build output will be stored as static files\n * for SSG and ISR pages, this env variable will disable environment variables\n * checking and will not throw an error if the env variables are for SSR\n *\n * NOTE: you cannot use this env with SSR.\n */\n FRONTEGG_SSG_EXPORT = 'FRONTEGG_SSG_EXPORT',\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,GAAAC,OAAA,CAAAD,YAAA,0BAAZA,YAAY;EACtB;AACF;AACA;AACA;EAJYA,YAAY;EAMtB;AACF;AACA;AACA;AACA;EAVYA,YAAY;EAYtB;AACF;AACA;AACA;EAfYA,YAAY;EAkBtB;AACF;AACA;AACA;AACA;EAtBYA,YAAY;EAyBtB;AACF;AACA;AACA;AACA;EA7BYA,YAAY;EAgCtB;AACF;AACA;AACA;EAnCYA,YAAY;EAsCtB;AACF;AACA;AACA;AACA;EA1CYA,YAAY;EA6CtB;AACF;AACA;AACA;AACA;EAjDYA,YAAY;EAoDtB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EA7DYA,YAAY;EAgEtB;AACF;AACA;AACA;AACA;AACA;AACA;EAtEYA,YAAY;EAyEtB;AACF;AACA;AACA;EA5EYA,YAAY;EA+EtB;AACF;AACA;AACA;EAlFYA,YAAY;EAqFtB;AACF;AACA;AACA;EAxFYA,YAAY;EA2FtB;AACF;AACA;EA7FYA,YAAY;EAgGtB;AACF;AACA;AACA;EAnGYA,YAAY;EAsGtB;AACF;AACA;AACA;EAzGYA,YAAY;EA4GtB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EApHYA,YAAY;EAuHtB;AACF;AACA;AACA;AACA;EA3HYA,YAAY;EA8HtB;AACF;AACA;AACA;AACA;AACA;AACA;EApIYA,YAAY;EAsItB;AACF;AACA;AACA;AACA;AACA;AACA;EA5IYA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA","ignoreList":[]}
package/config/index.d.ts CHANGED
@@ -19,6 +19,7 @@ declare class Config {
19
19
  get shouldForwardIp(): boolean;
20
20
  get jwtPublicKeyJson(): string | undefined;
21
21
  get secureJwtEnabled(): boolean;
22
+ get hostedLoginCallbackOnAppUrl(): boolean;
22
23
  get cookieName(): string;
23
24
  get cookieDomain(): string;
24
25
  get cookieSameSite(): 'lax' | 'strict' | 'none';
package/config/index.js CHANGED
@@ -28,6 +28,7 @@ const setupEnvVariables = {
28
28
  FRONTEGG_COOKIE_SAME_SITE: process.env.FRONTEGG_COOKIE_SAME_SITE,
29
29
  FRONTEGG_JWT_PUBLIC_KEY: process.env.FRONTEGG_JWT_PUBLIC_KEY,
30
30
  FRONTEGG_SECURE_JWT_ENABLED: process.env.FRONTEGG_SECURE_JWT_ENABLED,
31
+ FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL: process.env.FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL,
31
32
  FRONTEGG_FORWARD_IP: process.env.FRONTEGG_FORWARD_IP,
32
33
  FRONTEGG_SSG_EXPORT: process.env.FRONTEGG_SSG_EXPORT,
33
34
  DISABLE_INITIAL_PROPS_REFRESH_TOKEN: process.env.DISABLE_INITIAL_PROPS_REFRESH_TOKEN,
@@ -117,9 +118,13 @@ class Config {
117
118
  var _setupEnvVariables$FR3;
118
119
  return (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_SECURE_JWT_ENABLED, (_setupEnvVariables$FR3 = setupEnvVariables.FRONTEGG_SECURE_JWT_ENABLED) != null ? _setupEnvVariables$FR3 : 'false') == 'true';
119
120
  }
120
- get cookieName() {
121
+ get hostedLoginCallbackOnAppUrl() {
121
122
  var _setupEnvVariables$FR4;
122
- const cookieNameEnv = (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_COOKIE_NAME, (_setupEnvVariables$FR4 = setupEnvVariables.FRONTEGG_COOKIE_NAME) != null ? _setupEnvVariables$FR4 : 'fe_session');
123
+ return (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL, (_setupEnvVariables$FR4 = setupEnvVariables.FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL) != null ? _setupEnvVariables$FR4 : 'false') == 'true';
124
+ }
125
+ get cookieName() {
126
+ var _setupEnvVariables$FR5;
127
+ const cookieNameEnv = (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_COOKIE_NAME, (_setupEnvVariables$FR5 = setupEnvVariables.FRONTEGG_COOKIE_NAME) != null ? _setupEnvVariables$FR5 : 'fe_session');
123
128
  if (this.rewriteCookieByAppId && this.appId) {
124
129
  return `${cookieNameEnv}-${this.appId.replace(/-/g, '')}`;
125
130
  } else {
@@ -127,12 +132,12 @@ class Config {
127
132
  }
128
133
  }
129
134
  get cookieDomain() {
130
- var _setupEnvVariables$FR5;
131
- return (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_COOKIE_DOMAIN, (_setupEnvVariables$FR5 = setupEnvVariables.FRONTEGG_COOKIE_DOMAIN) != null ? _setupEnvVariables$FR5 : (0, _helpers.generateCookieDomain)(this.appUrl));
135
+ var _setupEnvVariables$FR6;
136
+ return (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_COOKIE_DOMAIN, (_setupEnvVariables$FR6 = setupEnvVariables.FRONTEGG_COOKIE_DOMAIN) != null ? _setupEnvVariables$FR6 : (0, _helpers.generateCookieDomain)(this.appUrl));
132
137
  }
133
138
  get cookieSameSite() {
134
- var _setupEnvVariables$FR6;
135
- let sameSite = (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_COOKIE_SAME_SITE, (_setupEnvVariables$FR6 = setupEnvVariables.FRONTEGG_COOKIE_SAME_SITE) != null ? _setupEnvVariables$FR6 : 'none');
139
+ var _setupEnvVariables$FR7;
140
+ let sameSite = (0, _helpers.getEnvOrDefault)(_constants.EnvVariables.FRONTEGG_COOKIE_SAME_SITE, (_setupEnvVariables$FR7 = setupEnvVariables.FRONTEGG_COOKIE_SAME_SITE) != null ? _setupEnvVariables$FR7 : 'none');
136
141
  switch (sameSite) {
137
142
  case 'true':
138
143
  return 'strict';
@@ -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_APP_ID","FRONTEGG_REWRITE_COOKIE_BY_APP_ID","FRONTEGG_CLIENT_SECRET","FRONTEGG_SHARED_SECRET","FRONTEGG_ENCRYPTION_PASSWORD","FRONTEGG_COOKIE_NAME","FRONTEGG_COOKIE_DOMAIN","FRONTEGG_COOKIE_SAME_SITE","FRONTEGG_JWT_PUBLIC_KEY","FRONTEGG_SECURE_JWT_ENABLED","FRONTEGG_FORWARD_IP","FRONTEGG_SSG_EXPORT","DISABLE_INITIAL_PROPS_REFRESH_TOKEN","VERCEL","VERCEL_URL","Config","constructor","fronteggAppOptions","isSSGExport","window","validatePassword","_getEnvOrDefault","getEnvOrDefault","EnvVariables","appUrl","generateAppUrl","testUrl","baseUrl","FronteggEnvNotFound","endsWith","slice","baseUrlHost","URL","hostname","clientId","_EnvVariables$FRONTEG","getEnv","appId","rewriteCookieByAppId","_setupEnvVariables$FR","clientSecret","_getEnv","e","secureJwtEnabled","InvalidFronteggEnv","sharedSecret","_getEnv2","shouldForwardIp","_setupEnvVariables$FR2","jwtPublicKeyJson","_getEnv3","_setupEnvVariables$FR3","cookieName","_setupEnvVariables$FR4","cookieNameEnv","replace","cookieDomain","_setupEnvVariables$FR5","generateCookieDomain","cookieSameSite","_setupEnvVariables$FR6","sameSite","authRoutes","_this$fronteggAppOpti","_this$fronteggAppOpti2","authOptions","routes","passwordMaps","password","key","Object","keys","match","length","encryptionPasswordEnv","normalizeStringPasswordToMap","isSSL","protocol","isHostedLogin","_this$fronteggAppOpti3","hostedLoginBox","FRONTEGG_HOSTED_LOGIN","isVercel","disableInitialPropsRefreshToken","ipResolver","_ipResolver","fn","appEnvConfig","config","envAppUrl","envBaseUrl","envClientId","envAppId","envHostedLoginBox","checkHostedLoginConfig","options","undefined","Error","_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 { IpResolverFunction } from '../middleware/types';\nimport { generateAppUrl, generateCookieDomain, getEnv, getEnvOrDefault, normalizeStringPasswordToMap } from './helpers';\nimport { EnvVariables } from './constants';\nimport { FronteggEnvNotFound, 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_APP_ID: process.env.FRONTEGG_APP_ID,\n FRONTEGG_REWRITE_COOKIE_BY_APP_ID: process.env.FRONTEGG_REWRITE_COOKIE_BY_APP_ID,\n FRONTEGG_CLIENT_SECRET: process.env.FRONTEGG_CLIENT_SECRET,\n FRONTEGG_SHARED_SECRET: process.env.FRONTEGG_SHARED_SECRET,\n FRONTEGG_ENCRYPTION_PASSWORD: process.env.FRONTEGG_ENCRYPTION_PASSWORD,\n FRONTEGG_COOKIE_NAME: process.env.FRONTEGG_COOKIE_NAME,\n FRONTEGG_COOKIE_DOMAIN: process.env.FRONTEGG_COOKIE_DOMAIN,\n FRONTEGG_COOKIE_SAME_SITE: process.env.FRONTEGG_COOKIE_SAME_SITE,\n FRONTEGG_JWT_PUBLIC_KEY: process.env.FRONTEGG_JWT_PUBLIC_KEY,\n FRONTEGG_SECURE_JWT_ENABLED: process.env.FRONTEGG_SECURE_JWT_ENABLED,\n FRONTEGG_FORWARD_IP: process.env.FRONTEGG_FORWARD_IP,\n FRONTEGG_SSG_EXPORT: process.env.FRONTEGG_SSG_EXPORT,\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 private _ipResolver?: IpResolverFunction;\n\n constructor() {\n if (!this.isSSGExport) {\n if (typeof window === 'undefined') {\n this.validatePassword();\n }\n }\n }\n\n get isSSGExport(): boolean {\n const isSSGExport =\n getEnvOrDefault(EnvVariables.FRONTEGG_SSG_EXPORT, setupEnvVariables.FRONTEGG_SSG_EXPORT) ?? 'false';\n return isSSGExport === 'true';\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 = getEnvOrDefault(EnvVariables.FRONTEGG_BASE_URL, setupEnvVariables.FRONTEGG_BASE_URL);\n if (!baseUrl) {\n throw new FronteggEnvNotFound(EnvVariables.FRONTEGG_BASE_URL);\n }\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 const clientId = getEnv(EnvVariables.FRONTEGG_CLIENT_ID ?? setupEnvVariables.FRONTEGG_CLIENT_ID);\n if (!clientId) {\n throw new FronteggEnvNotFound(EnvVariables.FRONTEGG_CLIENT_ID);\n }\n return clientId;\n }\n\n get appId(): string | undefined {\n return getEnvOrDefault(EnvVariables.FRONTEGG_APP_ID, setupEnvVariables.FRONTEGG_APP_ID);\n }\n\n get rewriteCookieByAppId(): boolean {\n return (\n getEnvOrDefault(\n EnvVariables.FRONTEGG_REWRITE_COOKIE_BY_APP_ID,\n setupEnvVariables.FRONTEGG_REWRITE_COOKIE_BY_APP_ID ?? 'false'\n ) === 'true'\n );\n }\n\n get clientSecret(): string | undefined {\n let clientSecret;\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 && !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 sharedSecret(): string | undefined {\n let sharedSecret;\n try {\n sharedSecret = getEnv(EnvVariables.FRONTEGG_SHARED_SECRET) ?? setupEnvVariables.FRONTEGG_SHARED_SECRET;\n } catch (e) {\n sharedSecret = setupEnvVariables.FRONTEGG_SHARED_SECRET;\n }\n\n return sharedSecret;\n }\n\n get shouldForwardIp(): boolean {\n return (\n getEnvOrDefault(EnvVariables.FRONTEGG_FORWARD_IP, setupEnvVariables.FRONTEGG_FORWARD_IP ?? 'false') === 'true'\n );\n }\n\n get jwtPublicKeyJson(): string | undefined {\n return getEnv(EnvVariables.FRONTEGG_JWT_PUBLIC_KEY) ?? setupEnvVariables.FRONTEGG_JWT_PUBLIC_KEY;\n }\n\n get secureJwtEnabled(): boolean {\n return (\n getEnvOrDefault(\n EnvVariables.FRONTEGG_SECURE_JWT_ENABLED,\n setupEnvVariables.FRONTEGG_SECURE_JWT_ENABLED ?? 'false'\n ) == 'true'\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\n if (this.rewriteCookieByAppId && this.appId) {\n return `${cookieNameEnv}-${this.appId.replace(/-/g, '')}`;\n } else {\n return `${cookieNameEnv}-${this.clientId.replace(/-/g, '')}`;\n }\n }\n\n get cookieDomain(): string {\n return getEnvOrDefault(\n EnvVariables.FRONTEGG_COOKIE_DOMAIN,\n setupEnvVariables.FRONTEGG_COOKIE_DOMAIN ?? generateCookieDomain(this.appUrl)\n );\n }\n\n get cookieSameSite(): 'lax' | 'strict' | 'none' {\n let sameSite = getEnvOrDefault(\n EnvVariables.FRONTEGG_COOKIE_SAME_SITE,\n setupEnvVariables.FRONTEGG_COOKIE_SAME_SITE ?? 'none'\n );\n switch (sameSite) {\n case 'true':\n return 'strict';\n case 'false':\n return 'none';\n case 'lax':\n case 'strict':\n case 'none':\n return sameSite;\n default:\n return 'none';\n }\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 = getEnvOrDefault(\n EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD,\n setupEnvVariables.FRONTEGG_ENCRYPTION_PASSWORD\n );\n\n if (!encryptionPasswordEnv) {\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 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 isVercel(): boolean {\n return getEnvOrDefault(EnvVariables.VERCEL, setupEnvVariables.VERCEL) === '1';\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 ipResolver(): IpResolverFunction | undefined {\n return this._ipResolver;\n }\n\n set ipResolver(fn: IpResolverFunction | undefined) {\n this._ipResolver = fn;\n }\n\n get appEnvConfig(): AppEnvConfig {\n const config = {\n envAppUrl: this.appUrl,\n envBaseUrl: this.baseUrl,\n envClientId: this.clientId,\n envAppId: this.appId,\n secureJwtEnabled: this.secureJwtEnabled,\n envHostedLoginBox: this.isHostedLogin,\n };\n return config;\n }\n\n checkHostedLoginConfig(options: WithFronteggAppOptions | undefined) {\n // noinspection JSDeprecatedSymbols\n if (options?.hostedLoginBox === undefined) {\n return;\n }\n // noinspection JSDeprecatedSymbols\n if (options.hostedLoginBox != this.isHostedLogin) {\n throw new Error(\n 'There is mismatch between FRONTEGG_HOSTED_LOGIN environment variable and withFronteggOptions, ' +\n 'please remove the hostedLoginBox from withFronteggOptions and use the FRONTEGG_HOSTED_LOGIN environment variable instead.'\n );\n }\n }\n}\n\nexport { EnvVariables } from './constants';\nexport default new Config();\n"],"mappings":"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","ignoreList":[]}
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_APP_ID","FRONTEGG_REWRITE_COOKIE_BY_APP_ID","FRONTEGG_CLIENT_SECRET","FRONTEGG_SHARED_SECRET","FRONTEGG_ENCRYPTION_PASSWORD","FRONTEGG_COOKIE_NAME","FRONTEGG_COOKIE_DOMAIN","FRONTEGG_COOKIE_SAME_SITE","FRONTEGG_JWT_PUBLIC_KEY","FRONTEGG_SECURE_JWT_ENABLED","FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL","FRONTEGG_FORWARD_IP","FRONTEGG_SSG_EXPORT","DISABLE_INITIAL_PROPS_REFRESH_TOKEN","VERCEL","VERCEL_URL","Config","constructor","fronteggAppOptions","isSSGExport","window","validatePassword","_getEnvOrDefault","getEnvOrDefault","EnvVariables","appUrl","generateAppUrl","testUrl","baseUrl","FronteggEnvNotFound","endsWith","slice","baseUrlHost","URL","hostname","clientId","_EnvVariables$FRONTEG","getEnv","appId","rewriteCookieByAppId","_setupEnvVariables$FR","clientSecret","_getEnv","e","secureJwtEnabled","InvalidFronteggEnv","sharedSecret","_getEnv2","shouldForwardIp","_setupEnvVariables$FR2","jwtPublicKeyJson","_getEnv3","_setupEnvVariables$FR3","hostedLoginCallbackOnAppUrl","_setupEnvVariables$FR4","cookieName","_setupEnvVariables$FR5","cookieNameEnv","replace","cookieDomain","_setupEnvVariables$FR6","generateCookieDomain","cookieSameSite","_setupEnvVariables$FR7","sameSite","authRoutes","_this$fronteggAppOpti","_this$fronteggAppOpti2","authOptions","routes","passwordMaps","password","key","Object","keys","match","length","encryptionPasswordEnv","normalizeStringPasswordToMap","isSSL","protocol","isHostedLogin","_this$fronteggAppOpti3","hostedLoginBox","FRONTEGG_HOSTED_LOGIN","isVercel","disableInitialPropsRefreshToken","ipResolver","_ipResolver","fn","appEnvConfig","config","envAppUrl","envBaseUrl","envClientId","envAppId","envHostedLoginBox","checkHostedLoginConfig","options","undefined","Error","_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 { IpResolverFunction } from '../middleware/types';\nimport { generateAppUrl, generateCookieDomain, getEnv, getEnvOrDefault, normalizeStringPasswordToMap } from './helpers';\nimport { EnvVariables } from './constants';\nimport { FronteggEnvNotFound, 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_APP_ID: process.env.FRONTEGG_APP_ID,\n FRONTEGG_REWRITE_COOKIE_BY_APP_ID: process.env.FRONTEGG_REWRITE_COOKIE_BY_APP_ID,\n FRONTEGG_CLIENT_SECRET: process.env.FRONTEGG_CLIENT_SECRET,\n FRONTEGG_SHARED_SECRET: process.env.FRONTEGG_SHARED_SECRET,\n FRONTEGG_ENCRYPTION_PASSWORD: process.env.FRONTEGG_ENCRYPTION_PASSWORD,\n FRONTEGG_COOKIE_NAME: process.env.FRONTEGG_COOKIE_NAME,\n FRONTEGG_COOKIE_DOMAIN: process.env.FRONTEGG_COOKIE_DOMAIN,\n FRONTEGG_COOKIE_SAME_SITE: process.env.FRONTEGG_COOKIE_SAME_SITE,\n FRONTEGG_JWT_PUBLIC_KEY: process.env.FRONTEGG_JWT_PUBLIC_KEY,\n FRONTEGG_SECURE_JWT_ENABLED: process.env.FRONTEGG_SECURE_JWT_ENABLED,\n FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL: process.env.FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL,\n FRONTEGG_FORWARD_IP: process.env.FRONTEGG_FORWARD_IP,\n FRONTEGG_SSG_EXPORT: process.env.FRONTEGG_SSG_EXPORT,\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 private _ipResolver?: IpResolverFunction;\n\n constructor() {\n if (!this.isSSGExport) {\n if (typeof window === 'undefined') {\n this.validatePassword();\n }\n }\n }\n\n get isSSGExport(): boolean {\n const isSSGExport =\n getEnvOrDefault(EnvVariables.FRONTEGG_SSG_EXPORT, setupEnvVariables.FRONTEGG_SSG_EXPORT) ?? 'false';\n return isSSGExport === 'true';\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 = getEnvOrDefault(EnvVariables.FRONTEGG_BASE_URL, setupEnvVariables.FRONTEGG_BASE_URL);\n if (!baseUrl) {\n throw new FronteggEnvNotFound(EnvVariables.FRONTEGG_BASE_URL);\n }\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 const clientId = getEnv(EnvVariables.FRONTEGG_CLIENT_ID ?? setupEnvVariables.FRONTEGG_CLIENT_ID);\n if (!clientId) {\n throw new FronteggEnvNotFound(EnvVariables.FRONTEGG_CLIENT_ID);\n }\n return clientId;\n }\n\n get appId(): string | undefined {\n return getEnvOrDefault(EnvVariables.FRONTEGG_APP_ID, setupEnvVariables.FRONTEGG_APP_ID);\n }\n\n get rewriteCookieByAppId(): boolean {\n return (\n getEnvOrDefault(\n EnvVariables.FRONTEGG_REWRITE_COOKIE_BY_APP_ID,\n setupEnvVariables.FRONTEGG_REWRITE_COOKIE_BY_APP_ID ?? 'false'\n ) === 'true'\n );\n }\n\n get clientSecret(): string | undefined {\n let clientSecret;\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 && !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 sharedSecret(): string | undefined {\n let sharedSecret;\n try {\n sharedSecret = getEnv(EnvVariables.FRONTEGG_SHARED_SECRET) ?? setupEnvVariables.FRONTEGG_SHARED_SECRET;\n } catch (e) {\n sharedSecret = setupEnvVariables.FRONTEGG_SHARED_SECRET;\n }\n\n return sharedSecret;\n }\n\n get shouldForwardIp(): boolean {\n return (\n getEnvOrDefault(EnvVariables.FRONTEGG_FORWARD_IP, setupEnvVariables.FRONTEGG_FORWARD_IP ?? 'false') === 'true'\n );\n }\n\n get jwtPublicKeyJson(): string | undefined {\n return getEnv(EnvVariables.FRONTEGG_JWT_PUBLIC_KEY) ?? setupEnvVariables.FRONTEGG_JWT_PUBLIC_KEY;\n }\n\n get secureJwtEnabled(): boolean {\n return (\n getEnvOrDefault(\n EnvVariables.FRONTEGG_SECURE_JWT_ENABLED,\n setupEnvVariables.FRONTEGG_SECURE_JWT_ENABLED ?? 'false'\n ) == 'true'\n );\n }\n\n get hostedLoginCallbackOnAppUrl(): boolean {\n return (\n getEnvOrDefault(\n EnvVariables.FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL,\n setupEnvVariables.FRONTEGG_HOSTED_LOGIN_CALLBACK_ON_APP_URL ?? 'false'\n ) == 'true'\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\n if (this.rewriteCookieByAppId && this.appId) {\n return `${cookieNameEnv}-${this.appId.replace(/-/g, '')}`;\n } else {\n return `${cookieNameEnv}-${this.clientId.replace(/-/g, '')}`;\n }\n }\n\n get cookieDomain(): string {\n return getEnvOrDefault(\n EnvVariables.FRONTEGG_COOKIE_DOMAIN,\n setupEnvVariables.FRONTEGG_COOKIE_DOMAIN ?? generateCookieDomain(this.appUrl)\n );\n }\n\n get cookieSameSite(): 'lax' | 'strict' | 'none' {\n let sameSite = getEnvOrDefault(\n EnvVariables.FRONTEGG_COOKIE_SAME_SITE,\n setupEnvVariables.FRONTEGG_COOKIE_SAME_SITE ?? 'none'\n );\n switch (sameSite) {\n case 'true':\n return 'strict';\n case 'false':\n return 'none';\n case 'lax':\n case 'strict':\n case 'none':\n return sameSite;\n default:\n return 'none';\n }\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 = getEnvOrDefault(\n EnvVariables.FRONTEGG_ENCRYPTION_PASSWORD,\n setupEnvVariables.FRONTEGG_ENCRYPTION_PASSWORD\n );\n\n if (!encryptionPasswordEnv) {\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 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 isVercel(): boolean {\n return getEnvOrDefault(EnvVariables.VERCEL, setupEnvVariables.VERCEL) === '1';\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 ipResolver(): IpResolverFunction | undefined {\n return this._ipResolver;\n }\n\n set ipResolver(fn: IpResolverFunction | undefined) {\n this._ipResolver = fn;\n }\n\n get appEnvConfig(): AppEnvConfig {\n const config = {\n envAppUrl: this.appUrl,\n envBaseUrl: this.baseUrl,\n envClientId: this.clientId,\n envAppId: this.appId,\n secureJwtEnabled: this.secureJwtEnabled,\n envHostedLoginBox: this.isHostedLogin,\n };\n return config;\n }\n\n checkHostedLoginConfig(options: WithFronteggAppOptions | undefined) {\n // noinspection JSDeprecatedSymbols\n if (options?.hostedLoginBox === undefined) {\n return;\n }\n // noinspection JSDeprecatedSymbols\n if (options.hostedLoginBox != this.isHostedLogin) {\n throw new Error(\n 'There is mismatch between FRONTEGG_HOSTED_LOGIN environment variable and withFronteggOptions, ' +\n 'please remove the hostedLoginBox from withFronteggOptions and use the FRONTEGG_HOSTED_LOGIN environment variable instead.'\n );\n }\n }\n}\n\nexport { EnvVariables } from './constants';\nexport default new Config();\n"],"mappings":"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","ignoreList":[]}
@@ -81,3 +81,12 @@ export declare const getSessionOnEdge: (req: IncomingMessage | Request, disableW
81
81
  export declare const checkSessionOnEdge: (req: IncomingMessage | Request) => Promise<FronteggEdgeSession | undefined>;
82
82
  export declare const handleHostedLoginCallback: (req: IncomingMessage | Request, pathname: string, searchParams: URLSearchParams) => Promise<NextResponse>;
83
83
  export declare const isHostedLoginCallback: (pathname: string, searchParams: URLSearchParams) => boolean;
84
+ /**
85
+ * Whether the request is an authorization code landing on the application URL.
86
+ *
87
+ * Flows that are started outside the application, like impersonation, redirect to the
88
+ * application URL configured in the Frontegg portal and not to the hosted login callback
89
+ * route. The code is issued against that URL, so it has to be exchanged with the application
90
+ * URL as the `redirect_uri`.
91
+ */
92
+ export declare const isAppUrlLoginCallback: (pathname: string, searchParams: URLSearchParams) => boolean;
@@ -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.isHostedLoginCallback = exports.handleSessionOnEdge = exports.handleHostedLoginCallback = exports.getSessionOnEdge = exports.checkSessionOnEdge = void 0;
7
+ exports.isHostedLoginCallback = exports.isAppUrlLoginCallback = exports.handleSessionOnEdge = exports.handleHostedLoginCallback = exports.getSessionOnEdge = exports.checkSessionOnEdge = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _cookies = _interopRequireDefault(require("../utils/cookies"));
10
10
  var _createSession = _interopRequireDefault(require("../utils/createSession"));
@@ -32,6 +32,12 @@ const handleSessionOnEdge = async params => {
32
32
  if (isHostedLoginCallback(pathname, searchParams)) {
33
33
  return handleHostedLoginCallback(request, pathname, searchParams);
34
34
  }
35
+ if (isAppUrlLoginCallback(pathname, searchParams)) {
36
+ const response = await handleAppUrlLoginCallback(request, searchParams);
37
+ if (response) {
38
+ return response;
39
+ }
40
+ }
35
41
  if ((0, _shouldBypassMiddleware.shouldByPassMiddleware)(pathname, headers /*, options: optional bypass configuration */)) {
36
42
  return _server.NextResponse.next();
37
43
  }
@@ -187,11 +193,35 @@ async function createSessionFromAccessTokenEdge(data) {
187
193
  return [session, decodedJwt, refreshToken];
188
194
  }
189
195
  const handleHostedLoginCallback = async (req, pathname, searchParams) => {
190
- var _searchParams$get, _req$headers;
196
+ var _searchParams$get;
191
197
  if (!isHostedLoginCallback(pathname, searchParams)) {
192
198
  return _server.NextResponse.next();
193
199
  }
194
- const code = (_searchParams$get = searchParams.get('code')) != null ? _searchParams$get : '';
200
+ logger.debug('Authorization code received on the hosted login callback route, going to exchange it');
201
+ return exchangeCodeForSession(req, (_searchParams$get = searchParams.get('code')) != null ? _searchParams$get : '');
202
+ };
203
+
204
+ /**
205
+ * Handle an authorization code that landed on the application URL instead of the hosted
206
+ * login callback route, see {@link isAppUrlLoginCallback}.
207
+ *
208
+ * The `code` query param on the application URL is not guaranteed to be a Frontegg
209
+ * authorization code, so a failed exchange resolves to `undefined` and the request
210
+ * continues through the regular session handling.
211
+ */
212
+ exports.handleHostedLoginCallback = handleHostedLoginCallback;
213
+ const handleAppUrlLoginCallback = async (req, searchParams) => {
214
+ try {
215
+ var _searchParams$get2;
216
+ logger.debug('Authorization code received on the application URL, going to exchange it');
217
+ return await exchangeCodeForSession(req, (_searchParams$get2 = searchParams.get('code')) != null ? _searchParams$get2 : '', _config.default.appUrl);
218
+ } catch (e) {
219
+ logger.debug('Failed to exchange the authorization code received on the application URL', e);
220
+ return undefined;
221
+ }
222
+ };
223
+ const exchangeCodeForSession = async (req, code, redirectUri) => {
224
+ var _req$headers;
195
225
  let headers = {};
196
226
  let clientIp = undefined;
197
227
  if (typeof ((_req$headers = req.headers) == null ? void 0 : _req$headers.get) === 'function') {
@@ -208,7 +238,7 @@ const handleHostedLoginCallback = async (req, pathname, searchParams) => {
208
238
  headers[_utils.FRONTEGG_HEADERS_VERIFIER_HEADER] = (_config$sharedSecret = _config.default.sharedSecret) != null ? _config$sharedSecret : '';
209
239
  headers[_utils.FRONTEGG_VENDOR_ID_HEADER] = _config.default.clientId;
210
240
  }
211
- const response = await _api.default.exchangeHostedLoginToken((0, _utils.buildRequestHeaders)(headers), code, _config.default.clientId, _config.default.clientSecret);
241
+ const response = await _api.default.exchangeHostedLoginToken((0, _utils.buildRequestHeaders)(headers), code, _config.default.clientId, _config.default.clientSecret, redirectUri);
212
242
  const data = await response.json();
213
243
  const [session, decodedJwt, refreshToken] = await createSessionFromAccessTokenEdge(data);
214
244
  if (!session) {
@@ -236,7 +266,6 @@ const handleHostedLoginCallback = async (req, pathname, searchParams) => {
236
266
  headers: [...sessionCookieHeaders, ...refreshCookieHeaders]
237
267
  });
238
268
  };
239
- exports.handleHostedLoginCallback = handleHostedLoginCallback;
240
269
  const isHostedLoginCallback = (pathname, searchParams) => {
241
270
  if (_config.default.secureJwtEnabled) {
242
271
  const hasCode = searchParams.get('code') != null;
@@ -245,4 +274,24 @@ const isHostedLoginCallback = (pathname, searchParams) => {
245
274
  return false;
246
275
  };
247
276
  exports.isHostedLoginCallback = isHostedLoginCallback;
277
+ const withoutTrailingSlash = path => path.endsWith('/') ? path.slice(0, -1) : path;
278
+
279
+ /**
280
+ * Whether the request is an authorization code landing on the application URL.
281
+ *
282
+ * Flows that are started outside the application, like impersonation, redirect to the
283
+ * application URL configured in the Frontegg portal and not to the hosted login callback
284
+ * route. The code is issued against that URL, so it has to be exchanged with the application
285
+ * URL as the `redirect_uri`.
286
+ */
287
+ const isAppUrlLoginCallback = (pathname, searchParams) => {
288
+ if (!_config.default.secureJwtEnabled || !_config.default.hostedLoginCallbackOnAppUrl) {
289
+ return false;
290
+ }
291
+ if (searchParams.get('code') == null) {
292
+ return false;
293
+ }
294
+ return withoutTrailingSlash(pathname) === withoutTrailingSlash(new URL(_config.default.appUrl).pathname);
295
+ };
296
+ exports.isAppUrlLoginCallback = isAppUrlLoginCallback;
248
297
  //# sourceMappingURL=getSessionOnEdge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getSessionOnEdge.js","names":["_cookies","_interopRequireDefault","require","_createSession","_encryptionEdge","_api","_server","_config","_jwt","_utils","_fronteggLogger","_refreshAccessTokenIfNeededOnEdge","_redirectToLogin","_shouldBypassMiddleware","_routing","logger","fronteggLogger","child","tag","handleSessionOnEdge","params","request","pathname","searchParams","headers","isHostedLoginCallback","handleHostedLoginCallback","shouldByPassMiddleware","NextResponse","next","edgeSession","checkSessionOnEdge","redirectToLogin","forwardedHeaders","exports","GET_SESSION_ON_EDGE_DEPRECATED_WARN","getSessionOnEdge","req","disableWarning","cookies","CookieManager","getSessionCookieFromRequest","info","createSession","encryptionEdge","sessionCookies","existingSession","debug","session","refreshAccessTokenIfNeededOnEdge","createSessionFromAccessTokenEdge","data","_data$accessToken","_data$refreshToken","accessToken","access_token","refreshToken","refresh_token","payload","decodedJwt","JwtManager","verify","expiresIn","Math","floor","exp","Date","now","tokens","sealTokens","_searchParams$get","_req$headers","code","get","clientIp","undefined","_socket","getClientIp","socket","remoteAddress","_socket2","requestHeaders","_extends2","default","config","shouldForwardIp","_config$sharedSecret","FRONTEGG_FORWARD_IP_HEADER","FRONTEGG_HEADERS_VERIFIER_HEADER","sharedSecret","FRONTEGG_VENDOR_ID_HEADER","clientId","response","api","exchangeHostedLoginToken","buildRequestHeaders","clientSecret","json","redirect","appUrl","isSecured","isSSL","cookieValue","create","value","expires","secure","cookieName","replace","rewriteCookieByAppId","appId","refreshCookie","sessionCookieHeaders","map","cookie","refreshCookieHeaders","secureJwtEnabled","hasCode","isHostedLoginCallbackPath"],"sources":["../../../../packages/nextjs/src/edge/getSessionOnEdge.ts"],"sourcesContent":["import type { IncomingMessage } from 'http';\nimport { FronteggEdgeSession, FronteggNextJSSession } from '../types';\nimport CookieManager from '../utils/cookies';\nimport createSession from '../utils/createSession';\nimport encryptionEdge from '../utils/encryption-edge';\nimport api from '../api';\nimport { type NextRequest, NextResponse } from 'next/server';\nimport config from '../config';\nimport JwtManager from '../utils/jwt';\nimport {\n buildRequestHeaders,\n FRONTEGG_HEADERS_VERIFIER_HEADER,\n FRONTEGG_FORWARD_IP_HEADER,\n getClientIp,\n FRONTEGG_VENDOR_ID_HEADER,\n} from '../api/utils';\nimport fronteggLogger from '../utils/fronteggLogger';\nimport { refreshAccessTokenIfNeededOnEdge } from './refreshAccessTokenIfNeededOnEdge';\nimport { redirectToLogin } from './redirectToLogin';\nimport { shouldByPassMiddleware } from './shouldBypassMiddleware';\nimport { isHostedLoginCallbackPath } from '../utils/routing';\n\nconst logger = fronteggLogger.child({ tag: 'EdgeRuntime.getSessionOnEdge' });\n\nexport type HandleSessionOnEdge = {\n request: IncomingMessage | Request;\n pathname: string;\n headers: NextRequest['headers'];\n searchParams: URLSearchParams;\n};\n\nexport const handleSessionOnEdge = async (params: HandleSessionOnEdge): Promise<NextResponse> => {\n const { request, pathname, searchParams, headers } = params;\n\n if (isHostedLoginCallback(pathname, searchParams)) {\n return handleHostedLoginCallback(request, pathname, searchParams);\n }\n\n if (shouldByPassMiddleware(pathname, headers /*, options: optional bypass configuration */)) {\n return NextResponse.next();\n }\n\n const edgeSession = await checkSessionOnEdge(request);\n if (!edgeSession) {\n return redirectToLogin(pathname, searchParams);\n }\n if (edgeSession.headers) {\n return NextResponse.next({\n headers: edgeSession.headers,\n request: {\n headers: edgeSession.forwardedHeaders,\n },\n });\n }\n return NextResponse.next();\n};\n\nconst GET_SESSION_ON_EDGE_DEPRECATED_WARN = `Deprecation Notice: getSessionOnEdge has been deprecated. Please use handleSessionOnEdge instead. For example:\n\nfile: middleware.ts\n\\`\\`\\`ts\n import { NextRequest } from 'next/server';\n import { handleSessionOnEdge } from '@frontegg/nextjs/edge';\n \n export const middleware = async (request: NextRequest) => {\n const { pathname, searchParams } = request.nextUrl;\n const headers = request.headers;\n \n // Additional logic if needed\n \n return handleSessionOnEdge({ request, pathname, searchParams, headers });\n };\n \n \n export const config = {\n matcher: '/(.*)',\n };\n\n\\`\\`\\`\n\nAlternatively, to manually verify the session, you can use checkSessionOnEdge. Note that this method does not redirect to the login page if the session is invalid.\n`;\n\n/**\n * getSessionOnEdge is deprecated, please use handleSessionOnEdge instead example:\n *\n * ```ts\n * import { NextRequest } from 'next/server';\n * import { handleSessionOnEdge } from '@frontegg/nextjs/edge';\n *\n * export const middleware = async (request: NextRequest) => {\n * const { pathname, searchParams } = request.nextUrl;\n * const headers = request.headers;\n *\n * // Additional logic if needed\n *\n * return handleSessionOnEdge({ request, pathname, searchParams, headers });\n * };\n *\n * export const config = {\n * matcher: '/(.*)',\n * };\n * ```\n * @deprecated\n */\n\nexport const getSessionOnEdge = (\n req: IncomingMessage | Request,\n disableWarning = false\n): Promise<FronteggNextJSSession | undefined> => {\n const logger = fronteggLogger.child({ tag: 'EdgeRuntime.getSessionOnEdge' });\n const cookies = CookieManager.getSessionCookieFromRequest(req);\n if (!disableWarning) {\n logger.info(GET_SESSION_ON_EDGE_DEPRECATED_WARN);\n }\n return createSession(cookies, encryptionEdge);\n};\n\n/**\n * Check session on edge and return session if exists this method does not redirect to login page\n * Example:\n *\n * ```ts\n * import { NextRequest } from 'next/server';\n * import { handleSessionOnEdge } from '@frontegg/nextjs/edge';\n *\n * export const middleware = async (request: NextRequest) => {\n * const { pathname, searchParams } = request.nextUrl;\n * const headers = request.headers;\n *\n * // Additional logic if needed\n *\n * // check if it's a hosted login callback\n * if (isHostedLoginCallback(pathname, searchParams)) {\n * return handleHostedLoginCallback(request, pathname, searchParams);\n * }\n *\n * // check if we should bypass the middleware\n * if (shouldByPassMiddleware(pathname)) {\n * return NextResponse.next();\n * }\n *\n * // check session\n * const session = await checkSessionOnEdge(request);\n *\n * if (!session) {\n * return redirectToLogin(pathname);\n * }\n *\n * // if headers are present forward them to the next response / request\n * if (session.headers) {\n * return NextResponse.next({\n * headers: edgeSession.headers,\n * request:{\n * headers: edgeSession.forwardedHeaders\n * }\n * });\n * }\n * return NextResponse.next();\n * };\n * ```\n *\n *\n * @param req\n */\nexport const checkSessionOnEdge = async (req: IncomingMessage | Request): Promise<FronteggEdgeSession | undefined> => {\n const sessionCookies = CookieManager.getSessionCookieFromRequest(req);\n let existingSession = await createSession(sessionCookies, encryptionEdge);\n if (existingSession) {\n logger.debug('session resolved from session cookie');\n return {\n session: existingSession,\n };\n }\n\n logger.debug('Failed to resolve session from cookie, going to refresh token');\n return refreshAccessTokenIfNeededOnEdge(req);\n};\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 encryptionEdge.sealTokens(tokens, decodedJwt.exp);\n return [session, decodedJwt, refreshToken];\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\n let headers: Record<string, string> = {};\n let clientIp: string | undefined = undefined;\n if (typeof req.headers?.get === 'function') {\n clientIp =\n getClientIp(req.headers.get('cf-connecting-ip') || req.headers.get('x-forwarded-for')) ||\n (req as any).socket?.remoteAddress;\n } else if (typeof req.headers === 'object') {\n let requestHeaders: any = { ...req.headers };\n clientIp =\n getClientIp(requestHeaders['cf-connecting-ip'] || requestHeaders['x-forwarded-for']) ||\n (req as any).socket?.remoteAddress;\n }\n\n if (clientIp && config.shouldForwardIp) {\n headers[FRONTEGG_FORWARD_IP_HEADER] = clientIp;\n headers[FRONTEGG_HEADERS_VERIFIER_HEADER] = config.sharedSecret ?? '';\n headers[FRONTEGG_VENDOR_ID_HEADER] = config.clientId;\n }\n\n const response = await api.exchangeHostedLoginToken(\n buildRequestHeaders(headers),\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\n let cookieName = `fe_refresh_${config.clientId.replace('-', '')}`;\n if (config.rewriteCookieByAppId && config.appId) {\n cookieName = `fe_refresh_${config.appId.replace('-', '')}`;\n }\n const refreshCookie = CookieManager.create({\n cookieName,\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 const hasCode = searchParams.get('code') != null;\n return hasCode && isHostedLoginCallbackPath(pathname, hasCode);\n }\n return false;\n};\n"],"mappings":";;;;;;;;AAEA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,cAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,eAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,IAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,MAAA,GAAAP,OAAA;AAOA,IAAAQ,eAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,iCAAA,GAAAT,OAAA;AACA,IAAAU,gBAAA,GAAAV,OAAA;AACA,IAAAW,uBAAA,GAAAX,OAAA;AACA,IAAAY,QAAA,GAAAZ,OAAA;AAEA,MAAMa,MAAM,GAAGC,uBAAc,CAACC,KAAK,CAAC;EAAEC,GAAG,EAAE;AAA+B,CAAC,CAAC;AASrE,MAAMC,mBAAmB,GAAG,MAAOC,MAA2B,IAA4B;EAC/F,MAAM;IAAEC,OAAO;IAAEC,QAAQ;IAAEC,YAAY;IAAEC;EAAQ,CAAC,GAAGJ,MAAM;EAE3D,IAAIK,qBAAqB,CAACH,QAAQ,EAAEC,YAAY,CAAC,EAAE;IACjD,OAAOG,yBAAyB,CAACL,OAAO,EAAEC,QAAQ,EAAEC,YAAY,CAAC;EACnE;EAEA,IAAI,IAAAI,8CAAsB,EAACL,QAAQ,EAAEE,OAAO,CAAC,6CAA6C,CAAC,EAAE;IAC3F,OAAOI,oBAAY,CAACC,IAAI,CAAC,CAAC;EAC5B;EAEA,MAAMC,WAAW,GAAG,MAAMC,kBAAkB,CAACV,OAAO,CAAC;EACrD,IAAI,CAACS,WAAW,EAAE;IAChB,OAAO,IAAAE,gCAAe,EAACV,QAAQ,EAAEC,YAAY,CAAC;EAChD;EACA,IAAIO,WAAW,CAACN,OAAO,EAAE;IACvB,OAAOI,oBAAY,CAACC,IAAI,CAAC;MACvBL,OAAO,EAAEM,WAAW,CAACN,OAAO;MAC5BH,OAAO,EAAE;QACPG,OAAO,EAAEM,WAAW,CAACG;MACvB;IACF,CAAC,CAAC;EACJ;EACA,OAAOL,oBAAY,CAACC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAACK,OAAA,CAAAf,mBAAA,GAAAA,mBAAA;AAEF,MAAMgB,mCAAmC,GAAG;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAMC,gBAAgB,GAAGA,CAC9BC,GAA8B,EAC9BC,cAAc,GAAG,KAAK,KACyB;EAC/C,MAAMvB,MAAM,GAAGC,uBAAc,CAACC,KAAK,CAAC;IAAEC,GAAG,EAAE;EAA+B,CAAC,CAAC;EAC5E,MAAMqB,OAAO,GAAGC,gBAAa,CAACC,2BAA2B,CAACJ,GAAG,CAAC;EAC9D,IAAI,CAACC,cAAc,EAAE;IACnBvB,MAAM,CAAC2B,IAAI,CAACP,mCAAmC,CAAC;EAClD;EACA,OAAO,IAAAQ,sBAAa,EAACJ,OAAO,EAAEK,uBAAc,CAAC;AAC/C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA9CAV,OAAA,CAAAE,gBAAA,GAAAA,gBAAA;AA+CO,MAAML,kBAAkB,GAAG,MAAOM,GAA8B,IAA+C;EACpH,MAAMQ,cAAc,GAAGL,gBAAa,CAACC,2BAA2B,CAACJ,GAAG,CAAC;EACrE,IAAIS,eAAe,GAAG,MAAM,IAAAH,sBAAa,EAACE,cAAc,EAAED,uBAAc,CAAC;EACzE,IAAIE,eAAe,EAAE;IACnB/B,MAAM,CAACgC,KAAK,CAAC,sCAAsC,CAAC;IACpD,OAAO;MACLC,OAAO,EAAEF;IACX,CAAC;EACH;EAEA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","ignoreList":[]}
1
+ {"version":3,"file":"getSessionOnEdge.js","names":["_cookies","_interopRequireDefault","require","_createSession","_encryptionEdge","_api","_server","_config","_jwt","_utils","_fronteggLogger","_refreshAccessTokenIfNeededOnEdge","_redirectToLogin","_shouldBypassMiddleware","_routing","logger","fronteggLogger","child","tag","handleSessionOnEdge","params","request","pathname","searchParams","headers","isHostedLoginCallback","handleHostedLoginCallback","isAppUrlLoginCallback","response","handleAppUrlLoginCallback","shouldByPassMiddleware","NextResponse","next","edgeSession","checkSessionOnEdge","redirectToLogin","forwardedHeaders","exports","GET_SESSION_ON_EDGE_DEPRECATED_WARN","getSessionOnEdge","req","disableWarning","cookies","CookieManager","getSessionCookieFromRequest","info","createSession","encryptionEdge","sessionCookies","existingSession","debug","session","refreshAccessTokenIfNeededOnEdge","createSessionFromAccessTokenEdge","data","_data$accessToken","_data$refreshToken","accessToken","access_token","refreshToken","refresh_token","payload","decodedJwt","JwtManager","verify","expiresIn","Math","floor","exp","Date","now","tokens","sealTokens","_searchParams$get","exchangeCodeForSession","get","_searchParams$get2","config","appUrl","e","undefined","code","redirectUri","_req$headers","clientIp","_socket","getClientIp","socket","remoteAddress","_socket2","requestHeaders","_extends2","default","shouldForwardIp","_config$sharedSecret","FRONTEGG_FORWARD_IP_HEADER","FRONTEGG_HEADERS_VERIFIER_HEADER","sharedSecret","FRONTEGG_VENDOR_ID_HEADER","clientId","api","exchangeHostedLoginToken","buildRequestHeaders","clientSecret","json","redirect","isSecured","isSSL","cookieValue","create","value","expires","secure","cookieName","replace","rewriteCookieByAppId","appId","refreshCookie","sessionCookieHeaders","map","cookie","refreshCookieHeaders","secureJwtEnabled","hasCode","isHostedLoginCallbackPath","withoutTrailingSlash","path","endsWith","slice","hostedLoginCallbackOnAppUrl","URL"],"sources":["../../../../packages/nextjs/src/edge/getSessionOnEdge.ts"],"sourcesContent":["import type { IncomingMessage } from 'http';\nimport { FronteggEdgeSession, FronteggNextJSSession } from '../types';\nimport CookieManager from '../utils/cookies';\nimport createSession from '../utils/createSession';\nimport encryptionEdge from '../utils/encryption-edge';\nimport api from '../api';\nimport { type NextRequest, NextResponse } from 'next/server';\nimport config from '../config';\nimport JwtManager from '../utils/jwt';\nimport {\n buildRequestHeaders,\n FRONTEGG_HEADERS_VERIFIER_HEADER,\n FRONTEGG_FORWARD_IP_HEADER,\n getClientIp,\n FRONTEGG_VENDOR_ID_HEADER,\n} from '../api/utils';\nimport fronteggLogger from '../utils/fronteggLogger';\nimport { refreshAccessTokenIfNeededOnEdge } from './refreshAccessTokenIfNeededOnEdge';\nimport { redirectToLogin } from './redirectToLogin';\nimport { shouldByPassMiddleware } from './shouldBypassMiddleware';\nimport { isHostedLoginCallbackPath } from '../utils/routing';\n\nconst logger = fronteggLogger.child({ tag: 'EdgeRuntime.getSessionOnEdge' });\n\nexport type HandleSessionOnEdge = {\n request: IncomingMessage | Request;\n pathname: string;\n headers: NextRequest['headers'];\n searchParams: URLSearchParams;\n};\n\nexport const handleSessionOnEdge = async (params: HandleSessionOnEdge): Promise<NextResponse> => {\n const { request, pathname, searchParams, headers } = params;\n\n if (isHostedLoginCallback(pathname, searchParams)) {\n return handleHostedLoginCallback(request, pathname, searchParams);\n }\n\n if (isAppUrlLoginCallback(pathname, searchParams)) {\n const response = await handleAppUrlLoginCallback(request, searchParams);\n if (response) {\n return response;\n }\n }\n\n if (shouldByPassMiddleware(pathname, headers /*, options: optional bypass configuration */)) {\n return NextResponse.next();\n }\n\n const edgeSession = await checkSessionOnEdge(request);\n if (!edgeSession) {\n return redirectToLogin(pathname, searchParams);\n }\n if (edgeSession.headers) {\n return NextResponse.next({\n headers: edgeSession.headers,\n request: {\n headers: edgeSession.forwardedHeaders,\n },\n });\n }\n return NextResponse.next();\n};\n\nconst GET_SESSION_ON_EDGE_DEPRECATED_WARN = `Deprecation Notice: getSessionOnEdge has been deprecated. Please use handleSessionOnEdge instead. For example:\n\nfile: middleware.ts\n\\`\\`\\`ts\n import { NextRequest } from 'next/server';\n import { handleSessionOnEdge } from '@frontegg/nextjs/edge';\n \n export const middleware = async (request: NextRequest) => {\n const { pathname, searchParams } = request.nextUrl;\n const headers = request.headers;\n \n // Additional logic if needed\n \n return handleSessionOnEdge({ request, pathname, searchParams, headers });\n };\n \n \n export const config = {\n matcher: '/(.*)',\n };\n\n\\`\\`\\`\n\nAlternatively, to manually verify the session, you can use checkSessionOnEdge. Note that this method does not redirect to the login page if the session is invalid.\n`;\n\n/**\n * getSessionOnEdge is deprecated, please use handleSessionOnEdge instead example:\n *\n * ```ts\n * import { NextRequest } from 'next/server';\n * import { handleSessionOnEdge } from '@frontegg/nextjs/edge';\n *\n * export const middleware = async (request: NextRequest) => {\n * const { pathname, searchParams } = request.nextUrl;\n * const headers = request.headers;\n *\n * // Additional logic if needed\n *\n * return handleSessionOnEdge({ request, pathname, searchParams, headers });\n * };\n *\n * export const config = {\n * matcher: '/(.*)',\n * };\n * ```\n * @deprecated\n */\n\nexport const getSessionOnEdge = (\n req: IncomingMessage | Request,\n disableWarning = false\n): Promise<FronteggNextJSSession | undefined> => {\n const logger = fronteggLogger.child({ tag: 'EdgeRuntime.getSessionOnEdge' });\n const cookies = CookieManager.getSessionCookieFromRequest(req);\n if (!disableWarning) {\n logger.info(GET_SESSION_ON_EDGE_DEPRECATED_WARN);\n }\n return createSession(cookies, encryptionEdge);\n};\n\n/**\n * Check session on edge and return session if exists this method does not redirect to login page\n * Example:\n *\n * ```ts\n * import { NextRequest } from 'next/server';\n * import { handleSessionOnEdge } from '@frontegg/nextjs/edge';\n *\n * export const middleware = async (request: NextRequest) => {\n * const { pathname, searchParams } = request.nextUrl;\n * const headers = request.headers;\n *\n * // Additional logic if needed\n *\n * // check if it's a hosted login callback\n * if (isHostedLoginCallback(pathname, searchParams)) {\n * return handleHostedLoginCallback(request, pathname, searchParams);\n * }\n *\n * // check if we should bypass the middleware\n * if (shouldByPassMiddleware(pathname)) {\n * return NextResponse.next();\n * }\n *\n * // check session\n * const session = await checkSessionOnEdge(request);\n *\n * if (!session) {\n * return redirectToLogin(pathname);\n * }\n *\n * // if headers are present forward them to the next response / request\n * if (session.headers) {\n * return NextResponse.next({\n * headers: edgeSession.headers,\n * request:{\n * headers: edgeSession.forwardedHeaders\n * }\n * });\n * }\n * return NextResponse.next();\n * };\n * ```\n *\n *\n * @param req\n */\nexport const checkSessionOnEdge = async (req: IncomingMessage | Request): Promise<FronteggEdgeSession | undefined> => {\n const sessionCookies = CookieManager.getSessionCookieFromRequest(req);\n let existingSession = await createSession(sessionCookies, encryptionEdge);\n if (existingSession) {\n logger.debug('session resolved from session cookie');\n return {\n session: existingSession,\n };\n }\n\n logger.debug('Failed to resolve session from cookie, going to refresh token');\n return refreshAccessTokenIfNeededOnEdge(req);\n};\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 encryptionEdge.sealTokens(tokens, decodedJwt.exp);\n return [session, decodedJwt, refreshToken];\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 logger.debug('Authorization code received on the hosted login callback route, going to exchange it');\n return exchangeCodeForSession(req, searchParams.get('code') ?? '');\n};\n\n/**\n * Handle an authorization code that landed on the application URL instead of the hosted\n * login callback route, see {@link isAppUrlLoginCallback}.\n *\n * The `code` query param on the application URL is not guaranteed to be a Frontegg\n * authorization code, so a failed exchange resolves to `undefined` and the request\n * continues through the regular session handling.\n */\nconst handleAppUrlLoginCallback = async (\n req: IncomingMessage | Request,\n searchParams: URLSearchParams\n): Promise<NextResponse | undefined> => {\n try {\n logger.debug('Authorization code received on the application URL, going to exchange it');\n return await exchangeCodeForSession(req, searchParams.get('code') ?? '', config.appUrl);\n } catch (e) {\n logger.debug('Failed to exchange the authorization code received on the application URL', e);\n return undefined;\n }\n};\n\nconst exchangeCodeForSession = async (\n req: IncomingMessage | Request,\n code: string,\n redirectUri?: string\n): Promise<NextResponse> => {\n let headers: Record<string, string> = {};\n let clientIp: string | undefined = undefined;\n if (typeof req.headers?.get === 'function') {\n clientIp =\n getClientIp(req.headers.get('cf-connecting-ip') || req.headers.get('x-forwarded-for')) ||\n (req as any).socket?.remoteAddress;\n } else if (typeof req.headers === 'object') {\n let requestHeaders: any = { ...req.headers };\n clientIp =\n getClientIp(requestHeaders['cf-connecting-ip'] || requestHeaders['x-forwarded-for']) ||\n (req as any).socket?.remoteAddress;\n }\n\n if (clientIp && config.shouldForwardIp) {\n headers[FRONTEGG_FORWARD_IP_HEADER] = clientIp;\n headers[FRONTEGG_HEADERS_VERIFIER_HEADER] = config.sharedSecret ?? '';\n headers[FRONTEGG_VENDOR_ID_HEADER] = config.clientId;\n }\n\n const response = await api.exchangeHostedLoginToken(\n buildRequestHeaders(headers),\n code,\n config.clientId,\n config.clientSecret!,\n redirectUri\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\n let cookieName = `fe_refresh_${config.clientId.replace('-', '')}`;\n if (config.rewriteCookieByAppId && config.appId) {\n cookieName = `fe_refresh_${config.appId.replace('-', '')}`;\n }\n const refreshCookie = CookieManager.create({\n cookieName,\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 const hasCode = searchParams.get('code') != null;\n return hasCode && isHostedLoginCallbackPath(pathname, hasCode);\n }\n return false;\n};\n\nconst withoutTrailingSlash = (path: string): string => (path.endsWith('/') ? path.slice(0, -1) : path);\n\n/**\n * Whether the request is an authorization code landing on the application URL.\n *\n * Flows that are started outside the application, like impersonation, redirect to the\n * application URL configured in the Frontegg portal and not to the hosted login callback\n * route. The code is issued against that URL, so it has to be exchanged with the application\n * URL as the `redirect_uri`.\n */\nexport const isAppUrlLoginCallback = (pathname: string, searchParams: URLSearchParams): boolean => {\n if (!config.secureJwtEnabled || !config.hostedLoginCallbackOnAppUrl) {\n return false;\n }\n if (searchParams.get('code') == null) {\n return false;\n }\n return withoutTrailingSlash(pathname) === withoutTrailingSlash(new URL(config.appUrl).pathname);\n};\n"],"mappings":";;;;;;;;AAEA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,cAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,eAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,IAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,MAAA,GAAAP,OAAA;AAOA,IAAAQ,eAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,iCAAA,GAAAT,OAAA;AACA,IAAAU,gBAAA,GAAAV,OAAA;AACA,IAAAW,uBAAA,GAAAX,OAAA;AACA,IAAAY,QAAA,GAAAZ,OAAA;AAEA,MAAMa,MAAM,GAAGC,uBAAc,CAACC,KAAK,CAAC;EAAEC,GAAG,EAAE;AAA+B,CAAC,CAAC;AASrE,MAAMC,mBAAmB,GAAG,MAAOC,MAA2B,IAA4B;EAC/F,MAAM;IAAEC,OAAO;IAAEC,QAAQ;IAAEC,YAAY;IAAEC;EAAQ,CAAC,GAAGJ,MAAM;EAE3D,IAAIK,qBAAqB,CAACH,QAAQ,EAAEC,YAAY,CAAC,EAAE;IACjD,OAAOG,yBAAyB,CAACL,OAAO,EAAEC,QAAQ,EAAEC,YAAY,CAAC;EACnE;EAEA,IAAII,qBAAqB,CAACL,QAAQ,EAAEC,YAAY,CAAC,EAAE;IACjD,MAAMK,QAAQ,GAAG,MAAMC,yBAAyB,CAACR,OAAO,EAAEE,YAAY,CAAC;IACvE,IAAIK,QAAQ,EAAE;MACZ,OAAOA,QAAQ;IACjB;EACF;EAEA,IAAI,IAAAE,8CAAsB,EAACR,QAAQ,EAAEE,OAAO,CAAC,6CAA6C,CAAC,EAAE;IAC3F,OAAOO,oBAAY,CAACC,IAAI,CAAC,CAAC;EAC5B;EAEA,MAAMC,WAAW,GAAG,MAAMC,kBAAkB,CAACb,OAAO,CAAC;EACrD,IAAI,CAACY,WAAW,EAAE;IAChB,OAAO,IAAAE,gCAAe,EAACb,QAAQ,EAAEC,YAAY,CAAC;EAChD;EACA,IAAIU,WAAW,CAACT,OAAO,EAAE;IACvB,OAAOO,oBAAY,CAACC,IAAI,CAAC;MACvBR,OAAO,EAAES,WAAW,CAACT,OAAO;MAC5BH,OAAO,EAAE;QACPG,OAAO,EAAES,WAAW,CAACG;MACvB;IACF,CAAC,CAAC;EACJ;EACA,OAAOL,oBAAY,CAACC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAACK,OAAA,CAAAlB,mBAAA,GAAAA,mBAAA;AAEF,MAAMmB,mCAAmC,GAAG;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAMC,gBAAgB,GAAGA,CAC9BC,GAA8B,EAC9BC,cAAc,GAAG,KAAK,KACyB;EAC/C,MAAM1B,MAAM,GAAGC,uBAAc,CAACC,KAAK,CAAC;IAAEC,GAAG,EAAE;EAA+B,CAAC,CAAC;EAC5E,MAAMwB,OAAO,GAAGC,gBAAa,CAACC,2BAA2B,CAACJ,GAAG,CAAC;EAC9D,IAAI,CAACC,cAAc,EAAE;IACnB1B,MAAM,CAAC8B,IAAI,CAACP,mCAAmC,CAAC;EAClD;EACA,OAAO,IAAAQ,sBAAa,EAACJ,OAAO,EAAEK,uBAAc,CAAC;AAC/C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA9CAV,OAAA,CAAAE,gBAAA,GAAAA,gBAAA;AA+CO,MAAML,kBAAkB,GAAG,MAAOM,GAA8B,IAA+C;EACpH,MAAMQ,cAAc,GAAGL,gBAAa,CAACC,2BAA2B,CAACJ,GAAG,CAAC;EACrE,IAAIS,eAAe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","ignoreList":[]}
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v9.2.14-alpha.34330679131
1
+ /** @license Frontegg v9.2.14
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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@frontegg/nextjs",
3
3
  "libName": "FronteggNextJs",
4
- "version": "9.2.14-alpha.34330679131",
4
+ "version": "9.2.14",
5
5
  "author": "Frontegg LTD",
6
6
  "license": "MIT",
7
7
  "repository": {
package/sdkVersion.js CHANGED
@@ -5,6 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _default = exports.default = {
8
- version: '9.2.14-alpha.34330679131'
8
+ version: '9.2.14'
9
9
  };
10
10
  //# sourceMappingURL=sdkVersion.js.map
package/sdkVersion.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdkVersion.js","names":["version"],"sources":["../../../packages/nextjs/src/sdkVersion.ts"],"sourcesContent":["export default { version: '9.2.14-alpha.34330679131' };\n"],"mappings":";;;;;;iCAAe;EAAEA,OAAO,EAAE;AAA2B,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"sdkVersion.js","names":["version"],"sources":["../../../packages/nextjs/src/sdkVersion.ts"],"sourcesContent":["export default { version: '9.2.14' };\n"],"mappings":";;;;;;iCAAe;EAAEA,OAAO,EAAE;AAAS,CAAC","ignoreList":[]}