@frontegg/nextjs 7.0.18 → 7.0.19-alpha.6082670827
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 +9 -0
- package/api/index.d.ts +8 -3
- package/api/index.js +18 -4
- package/api/index.js.map +1 -1
- package/index.js +1 -1
- package/package.json +3 -3
- package/sdkVersion.js +1 -1
- package/sdkVersion.js.map +1 -1
- package/utils/fetchUserData/index.js +3 -2
- package/utils/fetchUserData/index.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
## [7.0.19](https://github.com/frontegg/frontegg-nextjs/compare/v7.0.18...v7.0.19) (2023-9-5)
|
|
4
|
+
|
|
5
|
+
- Releasing the new Security Center Page, which will replace the current Security Page. Currently exposed on Early Access with limited availability by a feature flag.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### NextJS Wrapper 7.0.19:
|
|
9
|
+
- FR-13346 - Support me authorization
|
|
1
10
|
# Change Log
|
|
2
11
|
|
|
3
12
|
## [7.0.18](https://github.com/frontegg/frontegg-nextjs/compare/v7.0.17...v7.0.18) (2023-8-28)
|
package/api/index.d.ts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import { ILoginResponse, GetCurrentUserTenantsResponse, IPublicSettingsResponse } from '@frontegg/rest-api';
|
|
1
|
+
import { ILoginResponse, GetCurrentUserTenantsResponse, IPublicSettingsResponse, IGetUserAuthorizationResponse } from '@frontegg/rest-api';
|
|
2
2
|
/**
|
|
3
3
|
*
|
|
4
4
|
* @param headers
|
|
5
5
|
*/
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const getMe: (headers: Record<string, string>) => Promise<ILoginResponse | undefined>;
|
|
7
7
|
/**
|
|
8
8
|
*
|
|
9
9
|
* @param headers
|
|
10
10
|
*/
|
|
11
11
|
export declare const getTenants: (headers: Record<string, string>) => Promise<GetCurrentUserTenantsResponse | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @param headers
|
|
15
|
+
*/
|
|
16
|
+
export declare const getMeAuthorization: (headers: Record<string, string>) => Promise<IGetUserAuthorizationResponse | undefined>;
|
|
12
17
|
export declare const getPublicSettings: (headers: Record<string, string>) => Promise<IPublicSettingsResponse | undefined>;
|
|
13
18
|
declare const _default: {
|
|
14
19
|
loadPublicKey: () => Promise<any>;
|
|
15
20
|
refreshTokenEmbedded: (headers: Record<string, string>) => Promise<Response>;
|
|
16
21
|
refreshTokenHostedLogin: (headers: Record<string, string>, refresh_token: string) => Promise<Response>;
|
|
17
|
-
|
|
22
|
+
getMe: (headers: Record<string, string>) => Promise<ILoginResponse | undefined>;
|
|
18
23
|
getTenants: (headers: Record<string, string>) => Promise<GetCurrentUserTenantsResponse | undefined>;
|
|
19
24
|
getPublicSettings: (headers: Record<string, string>) => Promise<IPublicSettingsResponse | undefined>;
|
|
20
25
|
};
|
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.
|
|
7
|
+
exports.getTenants = exports.getPublicSettings = exports.getMeAuthorization = exports.getMe = exports.default = void 0;
|
|
8
8
|
var _config = _interopRequireDefault(require("../config"));
|
|
9
9
|
var _urls = require("./urls");
|
|
10
10
|
var _utils = require("./utils");
|
|
@@ -52,7 +52,7 @@ const refreshTokenHostedLogin = async (headers, refresh_token) => {
|
|
|
52
52
|
*
|
|
53
53
|
* @param headers
|
|
54
54
|
*/
|
|
55
|
-
const
|
|
55
|
+
const getMe = async headers => {
|
|
56
56
|
const headersToSend = (0, _utils.buildRequestHeaders)(headers);
|
|
57
57
|
const res = await (0, _utils.Get)({
|
|
58
58
|
url: `${_config.default.baseUrl}/frontegg${_restApi.fronteggUsersUrl}`,
|
|
@@ -65,7 +65,7 @@ const getUsers = async headers => {
|
|
|
65
65
|
*
|
|
66
66
|
* @param headers
|
|
67
67
|
*/
|
|
68
|
-
exports.
|
|
68
|
+
exports.getMe = getMe;
|
|
69
69
|
const getTenants = async headers => {
|
|
70
70
|
const res = await (0, _utils.Get)({
|
|
71
71
|
url: `${_config.default.baseUrl}/frontegg${_restApi.fronteggTenantsV3Url}`,
|
|
@@ -73,7 +73,21 @@ const getTenants = async headers => {
|
|
|
73
73
|
});
|
|
74
74
|
return (0, _utils.parseHttpResponse)(res);
|
|
75
75
|
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
*
|
|
79
|
+
* @param headers
|
|
80
|
+
*/
|
|
76
81
|
exports.getTenants = getTenants;
|
|
82
|
+
const getMeAuthorization = async headers => {
|
|
83
|
+
const res = await (0, _utils.Get)({
|
|
84
|
+
//TODO: replace this with rest/api route
|
|
85
|
+
url: `${_config.default.baseUrl}/frontegg/identity/resources/users/v1/me/authorization`,
|
|
86
|
+
headers: (0, _utils.buildRequestHeaders)(headers)
|
|
87
|
+
});
|
|
88
|
+
return (0, _utils.parseHttpResponse)(res);
|
|
89
|
+
};
|
|
90
|
+
exports.getMeAuthorization = getMeAuthorization;
|
|
77
91
|
const getPublicSettings = async headers => {
|
|
78
92
|
const res = await (0, _utils.Get)({
|
|
79
93
|
//TODO: export the route url from rest-api and import from there
|
|
@@ -87,7 +101,7 @@ var _default = {
|
|
|
87
101
|
loadPublicKey,
|
|
88
102
|
refreshTokenEmbedded,
|
|
89
103
|
refreshTokenHostedLogin,
|
|
90
|
-
|
|
104
|
+
getMe,
|
|
91
105
|
getTenants,
|
|
92
106
|
getPublicSettings
|
|
93
107
|
};
|
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","
|
|
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","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} from '@frontegg/rest-api';\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 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};\n"],"mappings":"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"}
|
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontegg/nextjs",
|
|
3
3
|
"libName": "FronteggNextJs",
|
|
4
|
-
"version": "7.0.
|
|
4
|
+
"version": "7.0.19-alpha.6082670827",
|
|
5
5
|
"author": "Frontegg LTD",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"lint-json": "eslint -c .eslintrc.json -o ./lint-report.json --format json --no-color ./src/**/*.{ts,tsx}"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@frontegg/js": "6.
|
|
31
|
-
"@frontegg/react-hooks": "6.
|
|
30
|
+
"@frontegg/js": "6.138.0",
|
|
31
|
+
"@frontegg/react-hooks": "6.138.0",
|
|
32
32
|
"http-proxy": "^1.18.1",
|
|
33
33
|
"iron-session": "^6.3.1",
|
|
34
34
|
"jose": "^4.12.2"
|
package/sdkVersion.js
CHANGED
package/sdkVersion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkVersion.js","names":["version","exports","default","_default"],"sources":["../../../packages/nextjs/src/sdkVersion.ts"],"sourcesContent":["export default { version: '7.0.
|
|
1
|
+
{"version":3,"file":"sdkVersion.js","names":["version","exports","default","_default"],"sources":["../../../packages/nextjs/src/sdkVersion.ts"],"sourcesContent":["export default { version: '7.0.19-alpha.6082670827' };\n"],"mappings":";;;;;;eAAe;EAAEA,OAAO,EAAE;AAA0B,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAC,QAAA"}
|
|
@@ -31,15 +31,16 @@ async function fetchUserData(options) {
|
|
|
31
31
|
authorization: `Bearer ${accessToken}`
|
|
32
32
|
});
|
|
33
33
|
logger.debug('Retrieving user data...');
|
|
34
|
-
const [baseUserResult, tenantsResult] = await Promise.allSettled([(0, _api.
|
|
34
|
+
const [baseUserResult, tenantsResult, meAuthorizationResult] = await Promise.allSettled([(0, _api.getMe)(headers), (0, _api.getTenants)(headers), (0, _api.getMeAuthorization)(headers)]);
|
|
35
35
|
logger.debug('Retrieved user data:', 'baseUserResult: ', baseUserResult.status, 'tenantsResult:', tenantsResult.status);
|
|
36
36
|
const baseUser = baseUserResult.status === 'fulfilled' ? baseUserResult.value : null;
|
|
37
37
|
const tenantsResponse = tenantsResult.status === 'fulfilled' ? tenantsResult.value : null;
|
|
38
|
+
const meAuthorizationResponse = meAuthorizationResult.status === 'fulfilled' ? meAuthorizationResult.value : null;
|
|
38
39
|
if (!baseUser || !tenantsResponse) {
|
|
39
40
|
logger.info('No base user or tenants found');
|
|
40
41
|
return {};
|
|
41
42
|
}
|
|
42
|
-
const user = (0, _extends2.default)({}, session.user, baseUser, {
|
|
43
|
+
const user = (0, _extends2.default)({}, session.user, baseUser, meAuthorizationResponse, {
|
|
43
44
|
expiresIn: (0, _common.calculateExpiresInFromExp)(session.user.exp)
|
|
44
45
|
});
|
|
45
46
|
logger.info('Retrieved all user data successfully');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_api","require","_common","_fronteggLogger","_interopRequireDefault","fetchUserData","options","getSession","getHeaders","logger","fronteggLogger","child","tag","session","info","accessToken","reqHeaders","headers","_extends2","default","authorization","debug","baseUserResult","tenantsResult","Promise","allSettled","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_api","require","_common","_fronteggLogger","_interopRequireDefault","fetchUserData","options","getSession","getHeaders","logger","fronteggLogger","child","tag","session","info","accessToken","reqHeaders","headers","_extends2","default","authorization","debug","baseUserResult","tenantsResult","meAuthorizationResult","Promise","allSettled","getMe","getTenants","getMeAuthorization","status","baseUser","value","tenantsResponse","meAuthorizationResponse","user","expiresIn","calculateExpiresInFromExp","exp","tenants","activeTenant","e"],"sources":["../../../../../packages/nextjs/src/utils/fetchUserData/index.ts"],"sourcesContent":["import { AllUserData, FronteggNextJSSession } from '../../types';\nimport { getTenants, getMe, getMeAuthorization } from '../../api';\nimport { calculateExpiresInFromExp } from '../common';\nimport fronteggLogger from '../fronteggLogger';\n\ntype FetchUserDataOptions = {\n getSession: () => Promise<FronteggNextJSSession | undefined | null>;\n getHeaders: () => Promise<Record<string, string | string[] | undefined>>;\n};\n\nexport default async function fetchUserData(options: FetchUserDataOptions): Promise<AllUserData> {\n const { getSession, getHeaders } = options;\n\n const logger = fronteggLogger.child({ tag: 'fetchUserData.getAllUserData' });\n try {\n const session = await getSession();\n if (!session) {\n logger.info('No session found');\n return {};\n }\n\n const { accessToken } = session;\n const reqHeaders = await getHeaders();\n const headers = { ...reqHeaders, authorization: `Bearer ${accessToken}` };\n\n logger.debug('Retrieving user data...');\n const [baseUserResult, tenantsResult, meAuthorizationResult] = await Promise.allSettled([\n getMe(headers),\n getTenants(headers),\n getMeAuthorization(headers),\n ]);\n logger.debug(\n 'Retrieved user data:',\n 'baseUserResult: ',\n baseUserResult.status,\n 'tenantsResult:',\n tenantsResult.status\n );\n\n const baseUser = baseUserResult.status === 'fulfilled' ? baseUserResult.value : null;\n const tenantsResponse = tenantsResult.status === 'fulfilled' ? tenantsResult.value : null;\n const meAuthorizationResponse = meAuthorizationResult.status === 'fulfilled' ? meAuthorizationResult.value : null;\n\n if (!baseUser || !tenantsResponse) {\n logger.info('No base user or tenants found');\n return {};\n }\n\n const user = {\n ...session.user,\n ...baseUser!,\n ...meAuthorizationResponse,\n expiresIn: calculateExpiresInFromExp(session.user.exp),\n };\n\n logger.info('Retrieved all user data successfully');\n\n const { tenants, activeTenant } = tenantsResponse;\n return { user, session, tenants, activeTenant };\n } catch (e: any) {\n // logger.error(e.message, e);\n return {};\n }\n}\n"],"mappings":";;;;;;;;AACA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAC,sBAAA,CAAAH,OAAA;AAOe,eAAeI,aAAaA,CAACC,OAA6B,EAAwB;EAC/F,MAAM;IAAEC,UAAU;IAAEC;EAAW,CAAC,GAAGF,OAAO;EAE1C,MAAMG,MAAM,GAAGC,uBAAc,CAACC,KAAK,CAAC;IAAEC,GAAG,EAAE;EAA+B,CAAC,CAAC;EAC5E,IAAI;IACF,MAAMC,OAAO,GAAG,MAAMN,UAAU,EAAE;IAClC,IAAI,CAACM,OAAO,EAAE;MACZJ,MAAM,CAACK,IAAI,CAAC,kBAAkB,CAAC;MAC/B,OAAO,CAAC,CAAC;IACX;IAEA,MAAM;MAAEC;IAAY,CAAC,GAAGF,OAAO;IAC/B,MAAMG,UAAU,GAAG,MAAMR,UAAU,EAAE;IACrC,MAAMS,OAAO,OAAAC,SAAA,CAAAC,OAAA,MAAQH,UAAU;MAAEI,aAAa,EAAG,UAASL,WAAY;IAAC,EAAE;IAEzEN,MAAM,CAACY,KAAK,CAAC,yBAAyB,CAAC;IACvC,MAAM,CAACC,cAAc,EAAEC,aAAa,EAAEC,qBAAqB,CAAC,GAAG,MAAMC,OAAO,CAACC,UAAU,CAAC,CACtF,IAAAC,UAAK,EAACV,OAAO,CAAC,EACd,IAAAW,eAAU,EAACX,OAAO,CAAC,EACnB,IAAAY,uBAAkB,EAACZ,OAAO,CAAC,CAC5B,CAAC;IACFR,MAAM,CAACY,KAAK,CACV,sBAAsB,EACtB,kBAAkB,EAClBC,cAAc,CAACQ,MAAM,EACrB,gBAAgB,EAChBP,aAAa,CAACO,MAAM,CACrB;IAED,MAAMC,QAAQ,GAAGT,cAAc,CAACQ,MAAM,KAAK,WAAW,GAAGR,cAAc,CAACU,KAAK,GAAG,IAAI;IACpF,MAAMC,eAAe,GAAGV,aAAa,CAACO,MAAM,KAAK,WAAW,GAAGP,aAAa,CAACS,KAAK,GAAG,IAAI;IACzF,MAAME,uBAAuB,GAAGV,qBAAqB,CAACM,MAAM,KAAK,WAAW,GAAGN,qBAAqB,CAACQ,KAAK,GAAG,IAAI;IAEjH,IAAI,CAACD,QAAQ,IAAI,CAACE,eAAe,EAAE;MACjCxB,MAAM,CAACK,IAAI,CAAC,+BAA+B,CAAC;MAC5C,OAAO,CAAC,CAAC;IACX;IAEA,MAAMqB,IAAI,OAAAjB,SAAA,CAAAC,OAAA,MACLN,OAAO,CAACsB,IAAI,EACZJ,QAAQ,EACRG,uBAAuB;MAC1BE,SAAS,EAAE,IAAAC,iCAAyB,EAACxB,OAAO,CAACsB,IAAI,CAACG,GAAG;IAAC,EACvD;IAED7B,MAAM,CAACK,IAAI,CAAC,sCAAsC,CAAC;IAEnD,MAAM;MAAEyB,OAAO;MAAEC;IAAa,CAAC,GAAGP,eAAe;IACjD,OAAO;MAAEE,IAAI;MAAEtB,OAAO;MAAE0B,OAAO;MAAEC;IAAa,CAAC;EACjD,CAAC,CAAC,OAAOC,CAAM,EAAE;IACf;IACA,OAAO,CAAC,CAAC;EACX;AACF"}
|