@frontegg/redux-store 4.40.1 → 4.42.2
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/audits/index.js +2 -2
- package/auth/LoginState/index.d.ts +5 -1
- package/auth/LoginState/interfaces.d.ts +5 -0
- package/auth/LoginState/saga.d.ts +1 -1
- package/auth/index.d.ts +2 -0
- package/auth/index.js +69 -5
- package/auth/interfaces.d.ts +4 -0
- package/auth/reducer.d.ts +2 -0
- package/connectivity/index.js +2 -2
- package/{constants-f7891ee3.js → constants-4d9682b2.js} +2 -1
- package/constants.d.ts +1 -0
- package/helpers.d.ts +2 -0
- package/index.js +2 -2
- package/node/audits/index.js +1 -1
- package/node/auth/index.js +67 -3
- package/node/connectivity/index.js +1 -1
- package/node/{constants-b305f261.js → constants-52e37c08.js} +2 -0
- package/node/index.js +2 -2
- package/node/{saga-508b308b.js → saga-633c17d2.js} +1 -1
- package/node/subscriptions/index.js +1 -1
- package/node/toolkit/index.js +2 -2
- package/node/vendor/index.js +2 -2
- package/package.json +2 -2
- package/{saga-afaced62.js → saga-b6529ffb.js} +1 -1
- package/subscriptions/index.js +2 -2
- package/toolkit/index.js +2 -2
- package/vendor/index.js +4 -4
package/audits/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { b as auditsStoreName } from '../constants-
|
|
2
|
-
export { b as auditsStoreName } from '../constants-
|
|
1
|
+
import { b as auditsStoreName } from '../constants-4d9682b2.js';
|
|
2
|
+
export { b as auditsStoreName } from '../constants-4d9682b2.js';
|
|
3
3
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
|
4
4
|
import { takeEvery, select as select$1, put, call, all } from 'redux-saga/effects';
|
|
5
5
|
import { api } from '@frontegg/rest-api';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ILogin, ILoginWithMfa, IPasswordlessPostLogin, IPasswordlessPreLogin, IPostLogin, IPreLogin, IRecoverMFAToken } from '@frontegg/rest-api';
|
|
2
|
-
import { LoginState } from './interfaces';
|
|
2
|
+
import { HostedLoginCallback, LoginState } from './interfaces';
|
|
3
3
|
import { WithCallback } from '../../interfaces';
|
|
4
4
|
import { IVerifyInviteToken } from '@frontegg/rest-api';
|
|
5
5
|
declare const loginState: LoginState;
|
|
@@ -71,6 +71,8 @@ declare const reducers: {
|
|
|
71
71
|
};
|
|
72
72
|
declare const actions: {
|
|
73
73
|
requestAuthorize: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[(boolean | undefined)?], boolean, string, never, never>;
|
|
74
|
+
requestHostedLoginAuthorize: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
|
|
75
|
+
handleHostedLoginCallback: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[HostedLoginCallback], HostedLoginCallback, string, never, never>;
|
|
74
76
|
afterAuthNavigation: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
|
|
75
77
|
preLogin: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[WithCallback<IPreLogin & {
|
|
76
78
|
recaptchaToken?: string | undefined;
|
|
@@ -100,6 +102,8 @@ declare type DispatchedActions = {
|
|
|
100
102
|
setLoginState: (state: Partial<LoginState>) => void;
|
|
101
103
|
resetLoginState: () => void;
|
|
102
104
|
requestAuthorize: (payload?: boolean) => void;
|
|
105
|
+
requestHostedLoginAuthorize: () => void;
|
|
106
|
+
handleHostedLoginCallback: (payload: HostedLoginCallback) => void;
|
|
103
107
|
afterAuthNavigation: () => void;
|
|
104
108
|
preLogin: (payload: WithCallback<IPreLogin & {
|
|
105
109
|
recaptchaToken?: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CallEffect } from 'redux-saga/effects';
|
|
2
|
-
import { ILoginResponse, ISamlMetadata
|
|
2
|
+
import { IAllowedToRememberMfaDevice, ILoginResponse, ISamlMetadata } from '@frontegg/rest-api';
|
|
3
3
|
import { AuthState } from '../interfaces';
|
|
4
4
|
import { LoginStep } from './interfaces';
|
|
5
5
|
export declare function afterAuthNavigation(): Generator<import("redux-saga/effects").SelectEffect | CallEffect<true>, void, {
|
package/auth/index.d.ts
CHANGED
|
@@ -170,6 +170,8 @@ declare const _default: {
|
|
|
170
170
|
loginViaSocialLogin: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("@frontegg/rest-api").ILoginViaSocialLogin], import("@frontegg/rest-api").ILoginViaSocialLogin, string, never, never>;
|
|
171
171
|
setSocialLoginError: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("@frontegg/rest-api").ISetSocialLoginError], import("@frontegg/rest-api").ISetSocialLoginError, string, never, never>;
|
|
172
172
|
requestAuthorize: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[(boolean | undefined)?], boolean, string, never, never>;
|
|
173
|
+
requestHostedLoginAuthorize: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
|
|
174
|
+
handleHostedLoginCallback: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("./LoginState/interfaces").HostedLoginCallback], import("./LoginState/interfaces").HostedLoginCallback, string, never, never>;
|
|
173
175
|
afterAuthNavigation: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
|
|
174
176
|
preLogin: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("../interfaces").WithCallback<import("@frontegg/rest-api").IPreLogin & {
|
|
175
177
|
recaptchaToken?: string | undefined;
|
package/auth/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
|
2
|
-
import { a as authStoreName, F as FRONTEGG_AFTER_AUTH_REDIRECT_URL } from '../constants-
|
|
3
|
-
export { a as authStoreName } from '../constants-
|
|
4
|
-
import { __rest } from 'tslib';
|
|
2
|
+
import { a as authStoreName, F as FRONTEGG_AFTER_AUTH_REDIRECT_URL, H as HOSTED_LOGIN_VERIFIER_KEY } from '../constants-4d9682b2.js';
|
|
3
|
+
export { a as authStoreName } from '../constants-4d9682b2.js';
|
|
4
|
+
import { __awaiter, __rest } from 'tslib';
|
|
5
5
|
import { takeLeading, put, select, call, takeEvery, delay as delay$1, all, retry, takeLatest } from 'redux-saga/effects';
|
|
6
6
|
import { AuthStrategyEnum, api, ContextHolder } from '@frontegg/rest-api';
|
|
7
7
|
export { AuthStrategyEnum } from '@frontegg/rest-api';
|
|
8
|
-
import { l as loadVendorPublicInfo } from '../saga-
|
|
8
|
+
import { l as loadVendorPublicInfo } from '../saga-b6529ffb.js';
|
|
9
9
|
import { v4 } from 'uuid';
|
|
10
10
|
|
|
11
11
|
const resetStateByKey = (key, initialState) => (state) => (Object.assign(Object.assign({}, state), { [key]: initialState[key] }));
|
|
@@ -65,6 +65,8 @@ const reducers$e = {
|
|
|
65
65
|
};
|
|
66
66
|
const actions$f = {
|
|
67
67
|
requestAuthorize: createAction(`${authStoreName}/requestAuthorize`, (payload = false) => ({ payload })),
|
|
68
|
+
requestHostedLoginAuthorize: createAction(`${authStoreName}/requestHostedLoginAuthorize`),
|
|
69
|
+
handleHostedLoginCallback: createAction(`${authStoreName}/handleHostedLoginCallback`, (payload) => ({ payload })),
|
|
68
70
|
afterAuthNavigation: createAction(`${authStoreName}/afterAuthNavigation`),
|
|
69
71
|
preLogin: createAction(`${authStoreName}/preLogin`, (payload) => ({ payload })),
|
|
70
72
|
postLogin: createAction(`${authStoreName}/postLogin`, (payload) => ({ payload })),
|
|
@@ -479,7 +481,8 @@ const initialState = Object.assign({ routes: {
|
|
|
479
481
|
socialLoginCallbackUrl: '/account/social/success',
|
|
480
482
|
signUpUrl: '/account/sign-up',
|
|
481
483
|
oidcRedirectUrl: '/account/oidc/callback',
|
|
482
|
-
magicLinkCallbackUrl: '/account/login/magic-link'
|
|
484
|
+
magicLinkCallbackUrl: '/account/login/magic-link',
|
|
485
|
+
hostedLoginRedirectUrl: '/oauth/callback'
|
|
483
486
|
}, onRedirectTo: () => { } }, reinitializeState);
|
|
484
487
|
|
|
485
488
|
const { reducer, actions: sliceActions } = createSlice({
|
|
@@ -505,6 +508,24 @@ function omitProps(props, keys) {
|
|
|
505
508
|
});
|
|
506
509
|
return newProps;
|
|
507
510
|
}
|
|
511
|
+
function generateCodeChallenge(codeVerifier) {
|
|
512
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
513
|
+
const digest = yield crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));
|
|
514
|
+
// @ts-ignore
|
|
515
|
+
return btoa(String.fromCharCode(...new Uint8Array(digest)))
|
|
516
|
+
.replace(/=/g, '')
|
|
517
|
+
.replace(/\+/g, '-')
|
|
518
|
+
.replace(/\//g, '_');
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
function createRandomString(length = 16) {
|
|
522
|
+
let text = '';
|
|
523
|
+
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
524
|
+
for (let i = 0; i < length; i++) {
|
|
525
|
+
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
526
|
+
}
|
|
527
|
+
return text;
|
|
528
|
+
}
|
|
508
529
|
const readFileAsText = (file) => new Promise((resolve, reject) => {
|
|
509
530
|
const reader = new FileReader();
|
|
510
531
|
reader.readAsText(file);
|
|
@@ -1098,6 +1119,47 @@ function* requestAuthorize({ payload: firstTime }) {
|
|
|
1098
1119
|
yield all(calls);
|
|
1099
1120
|
yield put(actions.setState({ isLoading: false }));
|
|
1100
1121
|
}
|
|
1122
|
+
function* requestHostedLoginAuthorize() {
|
|
1123
|
+
const { routes, baseUrl, clientId, onRedirectTo } = yield select((state) => (Object.assign({ routes: state.auth.routes, onRedirectTo: state.auth.onRedirectTo }, state.root.context)));
|
|
1124
|
+
// Generate the relevant params for the redirect
|
|
1125
|
+
const nonce = createRandomString();
|
|
1126
|
+
const code_verifier = createRandomString();
|
|
1127
|
+
const code_challenge = yield call(generateCodeChallenge, code_verifier);
|
|
1128
|
+
// We are saving the verifier in session storage to be able to validate the response
|
|
1129
|
+
sessionStorage.setItem(HOSTED_LOGIN_VERIFIER_KEY, code_verifier);
|
|
1130
|
+
const redirectUrl = `${window.location.origin}${routes.hostedLoginRedirectUrl}`;
|
|
1131
|
+
// Hard coded for now
|
|
1132
|
+
const oauthUrl = `${baseUrl}/oauth/authorize`;
|
|
1133
|
+
const params = {
|
|
1134
|
+
response_type: 'code',
|
|
1135
|
+
client_id: clientId || 'INVALID-CLIENT-ID',
|
|
1136
|
+
scope: 'openid email profile',
|
|
1137
|
+
redirect_uri: redirectUrl,
|
|
1138
|
+
code_challenge: code_challenge,
|
|
1139
|
+
code_challenge_method: 'S256',
|
|
1140
|
+
nonce,
|
|
1141
|
+
};
|
|
1142
|
+
const searchParams = new URLSearchParams(params);
|
|
1143
|
+
const url = `${oauthUrl}?${searchParams.toString()}`;
|
|
1144
|
+
onRedirectTo(url, { refresh: true });
|
|
1145
|
+
}
|
|
1146
|
+
function* handleHostedLoginCallback({ payload }) {
|
|
1147
|
+
// Hard coded for now
|
|
1148
|
+
const code_verifier = sessionStorage.getItem(HOSTED_LOGIN_VERIFIER_KEY) || 'INVALID-CODE-VERIFIER';
|
|
1149
|
+
const routes = yield select((state) => state.auth.routes);
|
|
1150
|
+
const redirectUrl = `${window.location.origin}${routes.hostedLoginRedirectUrl}`;
|
|
1151
|
+
const body = {
|
|
1152
|
+
code: payload.code,
|
|
1153
|
+
redirect_uri: redirectUrl,
|
|
1154
|
+
code_verifier,
|
|
1155
|
+
grant_type: 'authorization_code',
|
|
1156
|
+
};
|
|
1157
|
+
const user = yield call(api.auth.exchangeOAuthTokens, body);
|
|
1158
|
+
// TODO: Validate nonce and aud
|
|
1159
|
+
yield put(actions.setState({ user, isAuthenticated: true }));
|
|
1160
|
+
yield put(actions.loadTenants());
|
|
1161
|
+
yield afterAuthNavigation();
|
|
1162
|
+
}
|
|
1101
1163
|
function* passwordlessPreLogin(_a) {
|
|
1102
1164
|
var _b = _a.payload, { callback } = _b, payload = __rest(_b, ["callback"]);
|
|
1103
1165
|
try {
|
|
@@ -1330,6 +1392,8 @@ function* silentLogout({ payload }) {
|
|
|
1330
1392
|
}
|
|
1331
1393
|
function* loginSagas() {
|
|
1332
1394
|
yield takeLeading(actions.requestAuthorize, requestAuthorize);
|
|
1395
|
+
yield takeLeading(actions.requestHostedLoginAuthorize, requestHostedLoginAuthorize);
|
|
1396
|
+
yield takeLeading(actions.handleHostedLoginCallback, handleHostedLoginCallback);
|
|
1333
1397
|
yield takeLeading(actions.preLogin, preLogin);
|
|
1334
1398
|
yield takeLeading(actions.postLogin, postLogin);
|
|
1335
1399
|
yield takeLeading(actions.login, login);
|
package/auth/interfaces.d.ts
CHANGED
package/auth/reducer.d.ts
CHANGED
|
@@ -144,6 +144,8 @@ declare const actions: {
|
|
|
144
144
|
loginViaSocialLogin: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("@frontegg/rest-api").ILoginViaSocialLogin], import("@frontegg/rest-api").ILoginViaSocialLogin, string, never, never>;
|
|
145
145
|
setSocialLoginError: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("@frontegg/rest-api").ISetSocialLoginError], import("@frontegg/rest-api").ISetSocialLoginError, string, never, never>;
|
|
146
146
|
requestAuthorize: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[(boolean | undefined)?], boolean, string, never, never>;
|
|
147
|
+
requestHostedLoginAuthorize: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
|
|
148
|
+
handleHostedLoginCallback: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import(".").HostedLoginCallback], import(".").HostedLoginCallback, string, never, never>;
|
|
147
149
|
afterAuthNavigation: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
|
|
148
150
|
preLogin: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("../interfaces").WithCallback<import("@frontegg/rest-api").IPreLogin & {
|
|
149
151
|
recaptchaToken?: string | undefined;
|
package/connectivity/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as connectivityStoreName } from '../constants-
|
|
2
|
-
export { c as connectivityStoreName } from '../constants-
|
|
1
|
+
import { c as connectivityStoreName } from '../constants-4d9682b2.js';
|
|
2
|
+
export { c as connectivityStoreName } from '../constants-4d9682b2.js';
|
|
3
3
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
|
4
4
|
import { __rest } from 'tslib';
|
|
5
5
|
import { takeEvery, takeLatest, put, all, call, select } from 'redux-saga/effects';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const FRONTEGG_AFTER_AUTH_REDIRECT_URL = 'FRONTEGG_AFTER_AUTH_REDIRECT_URL';
|
|
2
|
+
const HOSTED_LOGIN_VERIFIER_KEY = 'HOSTED_LOGIN_VERIFIER_KEY';
|
|
2
3
|
const authStoreName = 'auth';
|
|
3
4
|
const connectivityStoreName = 'connectivity';
|
|
4
5
|
const auditsStoreName = 'auditLogs';
|
|
5
6
|
const subscriptionsStoreName = 'subscriptions';
|
|
6
7
|
const vendorStoreName = 'vendor';
|
|
7
8
|
|
|
8
|
-
export { FRONTEGG_AFTER_AUTH_REDIRECT_URL as F, authStoreName as a, auditsStoreName as b, connectivityStoreName as c, subscriptionsStoreName as s, vendorStoreName as v };
|
|
9
|
+
export { FRONTEGG_AFTER_AUTH_REDIRECT_URL as F, HOSTED_LOGIN_VERIFIER_KEY as H, authStoreName as a, auditsStoreName as b, connectivityStoreName as c, subscriptionsStoreName as s, vendorStoreName as v };
|
package/constants.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const FRONTEGG_AFTER_AUTH_REDIRECT_URL = "FRONTEGG_AFTER_AUTH_REDIRECT_URL";
|
|
2
|
+
export declare const HOSTED_LOGIN_VERIFIER_KEY = "HOSTED_LOGIN_VERIFIER_KEY";
|
|
2
3
|
export declare const authStoreName = "auth";
|
|
3
4
|
export declare const connectivityStoreName = "connectivity";
|
|
4
5
|
export declare const auditsStoreName = "auditLogs";
|
package/helpers.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export declare function omitProps<T>(props: any, keys: string[]): T;
|
|
2
2
|
export declare function generateActionCreator(storeName: string): <Payload>(key: string, withPayload?: boolean | undefined) => import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[Payload], Payload, string, never, never> | import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
|
|
3
|
+
export declare function generateCodeChallenge(codeVerifier: any): Promise<string>;
|
|
4
|
+
export declare function createRandomString(length?: number): string;
|
|
3
5
|
export declare const readFileAsText: (file: File) => Promise<string>;
|
package/index.js
CHANGED
|
@@ -5,9 +5,9 @@ export { CheckoutEvent, CheckoutStatus, PaymentMethodType, PaymentProvider, Subs
|
|
|
5
5
|
export { default as vendor } from './vendor/index.js';
|
|
6
6
|
export { createFronteggStore } from './toolkit/index.js';
|
|
7
7
|
export { AuthStrategyEnum } from '@frontegg/rest-api';
|
|
8
|
-
export { b as auditsStoreName, a as authStoreName, c as connectivityStoreName, s as subscriptionsStoreName, v as vendorStoreName } from './constants-
|
|
8
|
+
export { b as auditsStoreName, a as authStoreName, c as connectivityStoreName, s as subscriptionsStoreName, v as vendorStoreName } from './constants-4d9682b2.js';
|
|
9
9
|
export { a as actions, d as defaultItemsPerPage, i as initialState, r as reducer, b as sagas, s as storeName } from './saga-7a267fe0.js';
|
|
10
|
-
export { a as vendorActions, i as vendorInitialState, r as vendorReducers, s as vendorSagas } from './saga-
|
|
10
|
+
export { a as vendorActions, i as vendorInitialState, r as vendorReducers, s as vendorSagas } from './saga-b6529ffb.js';
|
|
11
11
|
export { bindActionCreators, combineReducers, configureStore, createSelector, createSlice, getDefaultMiddleware } from '@reduxjs/toolkit';
|
|
12
12
|
export { all, call, delay, put, select, takeEvery, takeLatest } from 'redux-saga/effects';
|
|
13
13
|
export { default as createSagaMiddleware } from 'redux-saga';
|
package/node/audits/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var constants = require('../constants-
|
|
5
|
+
var constants = require('../constants-52e37c08.js');
|
|
6
6
|
var toolkit = require('@reduxjs/toolkit');
|
|
7
7
|
var effects = require('redux-saga/effects');
|
|
8
8
|
var restApi = require('@frontegg/rest-api');
|
package/node/auth/index.js
CHANGED
|
@@ -4,10 +4,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var toolkit = require('@reduxjs/toolkit');
|
|
6
6
|
var restApi = require('@frontegg/rest-api');
|
|
7
|
-
var constants = require('../constants-
|
|
7
|
+
var constants = require('../constants-52e37c08.js');
|
|
8
8
|
var tslib = require('tslib');
|
|
9
9
|
var effects = require('redux-saga/effects');
|
|
10
|
-
var saga = require('../saga-
|
|
10
|
+
var saga = require('../saga-633c17d2.js');
|
|
11
11
|
var uuid = require('uuid');
|
|
12
12
|
|
|
13
13
|
const resetStateByKey = (key, initialState) => (state) => (Object.assign(Object.assign({}, state), { [key]: initialState[key] }));
|
|
@@ -67,6 +67,8 @@ const reducers$e = {
|
|
|
67
67
|
};
|
|
68
68
|
const actions$f = {
|
|
69
69
|
requestAuthorize: toolkit.createAction(`${constants.authStoreName}/requestAuthorize`, (payload = false) => ({ payload })),
|
|
70
|
+
requestHostedLoginAuthorize: toolkit.createAction(`${constants.authStoreName}/requestHostedLoginAuthorize`),
|
|
71
|
+
handleHostedLoginCallback: toolkit.createAction(`${constants.authStoreName}/handleHostedLoginCallback`, (payload) => ({ payload })),
|
|
70
72
|
afterAuthNavigation: toolkit.createAction(`${constants.authStoreName}/afterAuthNavigation`),
|
|
71
73
|
preLogin: toolkit.createAction(`${constants.authStoreName}/preLogin`, (payload) => ({ payload })),
|
|
72
74
|
postLogin: toolkit.createAction(`${constants.authStoreName}/postLogin`, (payload) => ({ payload })),
|
|
@@ -481,7 +483,8 @@ const initialState = Object.assign({ routes: {
|
|
|
481
483
|
socialLoginCallbackUrl: '/account/social/success',
|
|
482
484
|
signUpUrl: '/account/sign-up',
|
|
483
485
|
oidcRedirectUrl: '/account/oidc/callback',
|
|
484
|
-
magicLinkCallbackUrl: '/account/login/magic-link'
|
|
486
|
+
magicLinkCallbackUrl: '/account/login/magic-link',
|
|
487
|
+
hostedLoginRedirectUrl: '/oauth/callback'
|
|
485
488
|
}, onRedirectTo: () => { } }, reinitializeState);
|
|
486
489
|
|
|
487
490
|
const { reducer, actions: sliceActions } = toolkit.createSlice({
|
|
@@ -507,6 +510,24 @@ function omitProps(props, keys) {
|
|
|
507
510
|
});
|
|
508
511
|
return newProps;
|
|
509
512
|
}
|
|
513
|
+
function generateCodeChallenge(codeVerifier) {
|
|
514
|
+
return tslib.__awaiter(this, void 0, void 0, function* () {
|
|
515
|
+
const digest = yield crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));
|
|
516
|
+
// @ts-ignore
|
|
517
|
+
return btoa(String.fromCharCode(...new Uint8Array(digest)))
|
|
518
|
+
.replace(/=/g, '')
|
|
519
|
+
.replace(/\+/g, '-')
|
|
520
|
+
.replace(/\//g, '_');
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
function createRandomString(length = 16) {
|
|
524
|
+
let text = '';
|
|
525
|
+
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
526
|
+
for (let i = 0; i < length; i++) {
|
|
527
|
+
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
528
|
+
}
|
|
529
|
+
return text;
|
|
530
|
+
}
|
|
510
531
|
const readFileAsText = (file) => new Promise((resolve, reject) => {
|
|
511
532
|
const reader = new FileReader();
|
|
512
533
|
reader.readAsText(file);
|
|
@@ -1100,6 +1121,47 @@ function* requestAuthorize({ payload: firstTime }) {
|
|
|
1100
1121
|
yield effects.all(calls);
|
|
1101
1122
|
yield effects.put(actions.setState({ isLoading: false }));
|
|
1102
1123
|
}
|
|
1124
|
+
function* requestHostedLoginAuthorize() {
|
|
1125
|
+
const { routes, baseUrl, clientId, onRedirectTo } = yield effects.select((state) => (Object.assign({ routes: state.auth.routes, onRedirectTo: state.auth.onRedirectTo }, state.root.context)));
|
|
1126
|
+
// Generate the relevant params for the redirect
|
|
1127
|
+
const nonce = createRandomString();
|
|
1128
|
+
const code_verifier = createRandomString();
|
|
1129
|
+
const code_challenge = yield effects.call(generateCodeChallenge, code_verifier);
|
|
1130
|
+
// We are saving the verifier in session storage to be able to validate the response
|
|
1131
|
+
sessionStorage.setItem(constants.HOSTED_LOGIN_VERIFIER_KEY, code_verifier);
|
|
1132
|
+
const redirectUrl = `${window.location.origin}${routes.hostedLoginRedirectUrl}`;
|
|
1133
|
+
// Hard coded for now
|
|
1134
|
+
const oauthUrl = `${baseUrl}/oauth/authorize`;
|
|
1135
|
+
const params = {
|
|
1136
|
+
response_type: 'code',
|
|
1137
|
+
client_id: clientId || 'INVALID-CLIENT-ID',
|
|
1138
|
+
scope: 'openid email profile',
|
|
1139
|
+
redirect_uri: redirectUrl,
|
|
1140
|
+
code_challenge: code_challenge,
|
|
1141
|
+
code_challenge_method: 'S256',
|
|
1142
|
+
nonce,
|
|
1143
|
+
};
|
|
1144
|
+
const searchParams = new URLSearchParams(params);
|
|
1145
|
+
const url = `${oauthUrl}?${searchParams.toString()}`;
|
|
1146
|
+
onRedirectTo(url, { refresh: true });
|
|
1147
|
+
}
|
|
1148
|
+
function* handleHostedLoginCallback({ payload }) {
|
|
1149
|
+
// Hard coded for now
|
|
1150
|
+
const code_verifier = sessionStorage.getItem(constants.HOSTED_LOGIN_VERIFIER_KEY) || 'INVALID-CODE-VERIFIER';
|
|
1151
|
+
const routes = yield effects.select((state) => state.auth.routes);
|
|
1152
|
+
const redirectUrl = `${window.location.origin}${routes.hostedLoginRedirectUrl}`;
|
|
1153
|
+
const body = {
|
|
1154
|
+
code: payload.code,
|
|
1155
|
+
redirect_uri: redirectUrl,
|
|
1156
|
+
code_verifier,
|
|
1157
|
+
grant_type: 'authorization_code',
|
|
1158
|
+
};
|
|
1159
|
+
const user = yield effects.call(restApi.api.auth.exchangeOAuthTokens, body);
|
|
1160
|
+
// TODO: Validate nonce and aud
|
|
1161
|
+
yield effects.put(actions.setState({ user, isAuthenticated: true }));
|
|
1162
|
+
yield effects.put(actions.loadTenants());
|
|
1163
|
+
yield afterAuthNavigation();
|
|
1164
|
+
}
|
|
1103
1165
|
function* passwordlessPreLogin(_a) {
|
|
1104
1166
|
var _b = _a.payload, { callback } = _b, payload = tslib.__rest(_b, ["callback"]);
|
|
1105
1167
|
try {
|
|
@@ -1332,6 +1394,8 @@ function* silentLogout({ payload }) {
|
|
|
1332
1394
|
}
|
|
1333
1395
|
function* loginSagas() {
|
|
1334
1396
|
yield effects.takeLeading(actions.requestAuthorize, requestAuthorize);
|
|
1397
|
+
yield effects.takeLeading(actions.requestHostedLoginAuthorize, requestHostedLoginAuthorize);
|
|
1398
|
+
yield effects.takeLeading(actions.handleHostedLoginCallback, handleHostedLoginCallback);
|
|
1335
1399
|
yield effects.takeLeading(actions.preLogin, preLogin);
|
|
1336
1400
|
yield effects.takeLeading(actions.postLogin, postLogin);
|
|
1337
1401
|
yield effects.takeLeading(actions.login, login);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var constants = require('../constants-
|
|
5
|
+
var constants = require('../constants-52e37c08.js');
|
|
6
6
|
var toolkit = require('@reduxjs/toolkit');
|
|
7
7
|
var tslib = require('tslib');
|
|
8
8
|
var effects = require('redux-saga/effects');
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const FRONTEGG_AFTER_AUTH_REDIRECT_URL = 'FRONTEGG_AFTER_AUTH_REDIRECT_URL';
|
|
4
|
+
const HOSTED_LOGIN_VERIFIER_KEY = 'HOSTED_LOGIN_VERIFIER_KEY';
|
|
4
5
|
const authStoreName = 'auth';
|
|
5
6
|
const connectivityStoreName = 'connectivity';
|
|
6
7
|
const auditsStoreName = 'auditLogs';
|
|
@@ -8,6 +9,7 @@ const subscriptionsStoreName = 'subscriptions';
|
|
|
8
9
|
const vendorStoreName = 'vendor';
|
|
9
10
|
|
|
10
11
|
exports.FRONTEGG_AFTER_AUTH_REDIRECT_URL = FRONTEGG_AFTER_AUTH_REDIRECT_URL;
|
|
12
|
+
exports.HOSTED_LOGIN_VERIFIER_KEY = HOSTED_LOGIN_VERIFIER_KEY;
|
|
11
13
|
exports.auditsStoreName = auditsStoreName;
|
|
12
14
|
exports.authStoreName = authStoreName;
|
|
13
15
|
exports.connectivityStoreName = connectivityStoreName;
|
package/node/index.js
CHANGED
|
@@ -10,8 +10,8 @@ var vendor_index = require('./vendor/index.js');
|
|
|
10
10
|
var saga = require('./saga-b0d1a607.js');
|
|
11
11
|
var toolkit_index = require('./toolkit/index.js');
|
|
12
12
|
var restApi = require('@frontegg/rest-api');
|
|
13
|
-
var constants = require('./constants-
|
|
14
|
-
var saga$1 = require('./saga-
|
|
13
|
+
var constants = require('./constants-52e37c08.js');
|
|
14
|
+
var saga$1 = require('./saga-633c17d2.js');
|
|
15
15
|
var toolkit = require('@reduxjs/toolkit');
|
|
16
16
|
var effects = require('redux-saga/effects');
|
|
17
17
|
var createSagaMiddleware = require('redux-saga');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var effects = require('redux-saga/effects');
|
|
4
4
|
var restApi = require('@frontegg/rest-api');
|
|
5
|
-
var constants = require('./constants-
|
|
5
|
+
var constants = require('./constants-52e37c08.js');
|
|
6
6
|
var toolkit = require('@reduxjs/toolkit');
|
|
7
7
|
|
|
8
8
|
const reducers = {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var constants = require('../constants-
|
|
5
|
+
var constants = require('../constants-52e37c08.js');
|
|
6
6
|
var toolkit = require('@reduxjs/toolkit');
|
|
7
7
|
var effects = require('redux-saga/effects');
|
|
8
8
|
var restApi = require('@frontegg/rest-api');
|
package/node/toolkit/index.js
CHANGED
|
@@ -12,9 +12,9 @@ var saga = require('../saga-b0d1a607.js');
|
|
|
12
12
|
var connectivity_index = require('../connectivity/index.js');
|
|
13
13
|
var subscriptions_index = require('../subscriptions/index.js');
|
|
14
14
|
var vendor_index = require('../vendor/index.js');
|
|
15
|
-
require('../constants-
|
|
15
|
+
require('../constants-52e37c08.js');
|
|
16
16
|
require('tslib');
|
|
17
|
-
require('../saga-
|
|
17
|
+
require('../saga-633c17d2.js');
|
|
18
18
|
require('uuid');
|
|
19
19
|
|
|
20
20
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
package/node/vendor/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var saga = require('../saga-
|
|
6
|
-
var constants = require('../constants-
|
|
5
|
+
var saga = require('../saga-633c17d2.js');
|
|
6
|
+
var constants = require('../constants-52e37c08.js');
|
|
7
7
|
require('redux-saga/effects');
|
|
8
8
|
require('@frontegg/rest-api');
|
|
9
9
|
require('@reduxjs/toolkit');
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontegg/redux-store",
|
|
3
3
|
"libName": "FronteggReduxStore",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.42.2",
|
|
5
5
|
"author": "Frontegg LTD",
|
|
6
6
|
"main": "./node/index.js",
|
|
7
7
|
"module": "./index.js",
|
|
8
8
|
"types": "./index.d.ts",
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@frontegg/rest-api": "2.10.
|
|
10
|
+
"@frontegg/rest-api": "2.10.47",
|
|
11
11
|
"@reduxjs/toolkit": "^1.5.0",
|
|
12
12
|
"redux-saga": "^1.1.0",
|
|
13
13
|
"tslib": "^2.3.1",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { takeEvery, put } from 'redux-saga/effects';
|
|
2
2
|
import { api } from '@frontegg/rest-api';
|
|
3
|
-
import { v as vendorStoreName } from './constants-
|
|
3
|
+
import { v as vendorStoreName } from './constants-4d9682b2.js';
|
|
4
4
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
|
5
5
|
|
|
6
6
|
const reducers = {
|
package/subscriptions/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { s as subscriptionsStoreName } from '../constants-
|
|
2
|
-
export { s as subscriptionsStoreName } from '../constants-
|
|
1
|
+
import { s as subscriptionsStoreName } from '../constants-4d9682b2.js';
|
|
2
|
+
export { s as subscriptionsStoreName } from '../constants-4d9682b2.js';
|
|
3
3
|
import { createSlice, createAction, combineReducers } from '@reduxjs/toolkit';
|
|
4
4
|
import { takeEvery, select, put, call, delay, all } from 'redux-saga/effects';
|
|
5
5
|
import { ISubscriptionStatus, PaymentMethodType as PaymentMethodType$1, api, ProviderType } from '@frontegg/rest-api';
|
package/toolkit/index.js
CHANGED
|
@@ -11,9 +11,9 @@ import connectivityStore from '../connectivity/index.js';
|
|
|
11
11
|
import subscriptionsStore from '../subscriptions/index.js';
|
|
12
12
|
import vendorStore from '../vendor/index.js';
|
|
13
13
|
import { s as storeName, i as initialState$1, r as reducer, b as sagas } from '../saga-7a267fe0.js';
|
|
14
|
-
import '../constants-
|
|
14
|
+
import '../constants-4d9682b2.js';
|
|
15
15
|
import 'tslib';
|
|
16
|
-
import '../saga-
|
|
16
|
+
import '../saga-b6529ffb.js';
|
|
17
17
|
import 'uuid';
|
|
18
18
|
|
|
19
19
|
const initialState = {
|
package/vendor/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { s as sagas, i as initialState, r as reducer, a as actions } from '../saga-
|
|
2
|
-
export { a as vendorActions, i as vendorInitialState, r as vendorReducers, s as vendorSagas } from '../saga-
|
|
3
|
-
import { v as vendorStoreName } from '../constants-
|
|
4
|
-
export { v as vendorStoreName } from '../constants-
|
|
1
|
+
import { s as sagas, i as initialState, r as reducer, a as actions } from '../saga-b6529ffb.js';
|
|
2
|
+
export { a as vendorActions, i as vendorInitialState, r as vendorReducers, s as vendorSagas } from '../saga-b6529ffb.js';
|
|
3
|
+
import { v as vendorStoreName } from '../constants-4d9682b2.js';
|
|
4
|
+
export { v as vendorStoreName } from '../constants-4d9682b2.js';
|
|
5
5
|
import 'redux-saga/effects';
|
|
6
6
|
import '@frontegg/rest-api';
|
|
7
7
|
import '@reduxjs/toolkit';
|