fix: OIDC finalization and refactoring
This commit is contained in:
@@ -1,13 +1,22 @@
|
||||
import { call, put, take } from 'redux-saga/effects';
|
||||
import { apply, call, put, select, take } from 'redux-saga/effects';
|
||||
|
||||
import request from '../request';
|
||||
import requests from '../requests';
|
||||
import selectors from '../../../selectors';
|
||||
import actions from '../../../actions';
|
||||
import api from '../../../api';
|
||||
import i18n from '../../../i18n';
|
||||
import { createOidcManager } from '../../../utils/oidc-manager';
|
||||
import { removeAccessToken } from '../../../utils/access-token-storage';
|
||||
|
||||
export function* initializeCore() {
|
||||
const currentConfig = yield select(selectors.selectConfig); // TODO: add boolean selector?
|
||||
|
||||
let config;
|
||||
if (!currentConfig) {
|
||||
({ item: config } = yield call(api.getConfig)); // TODO: handle error
|
||||
}
|
||||
|
||||
const {
|
||||
user,
|
||||
board,
|
||||
@@ -32,6 +41,7 @@ export function* initializeCore() {
|
||||
|
||||
yield put(
|
||||
actions.initializeCore(
|
||||
config,
|
||||
user,
|
||||
board,
|
||||
users,
|
||||
@@ -74,6 +84,16 @@ export function* logout(invalidateAccessToken = true) {
|
||||
} catch (error) {} // eslint-disable-line no-empty
|
||||
}
|
||||
|
||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
||||
|
||||
if (oidcConfig) {
|
||||
const oidcManager = createOidcManager(oidcConfig);
|
||||
|
||||
try {
|
||||
yield apply(oidcManager, oidcManager.logout);
|
||||
} catch (error) {} // eslint-disable-line no-empty
|
||||
}
|
||||
|
||||
yield put(actions.logout());
|
||||
yield take();
|
||||
}
|
||||
|
||||
@@ -33,15 +33,16 @@ export function* handleLocationChange() {
|
||||
|
||||
switch (pathsMatch.pattern.path) {
|
||||
case Paths.LOGIN:
|
||||
case Paths.OIDC_CALLBACK:
|
||||
yield call(goToRoot);
|
||||
|
||||
break;
|
||||
return;
|
||||
default:
|
||||
}
|
||||
|
||||
const isCoreInitializing = yield select(selectors.selectIsCoreInitializing);
|
||||
const isInitializing = yield select(selectors.selectIsInitializing);
|
||||
|
||||
if (isCoreInitializing) {
|
||||
if (isInitializing) {
|
||||
yield take(ActionTypes.CORE_INITIALIZE);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,8 +4,5 @@ import services from '../services';
|
||||
import EntryActionTypes from '../../../constants/EntryActionTypes';
|
||||
|
||||
export default function* coreWatchers() {
|
||||
yield all([
|
||||
takeEvery(EntryActionTypes.CORE_INITIALIZE, () => services.initializeCore()),
|
||||
takeEvery(EntryActionTypes.LOGOUT, () => services.logout()),
|
||||
]);
|
||||
yield all([takeEvery(EntryActionTypes.LOGOUT, () => services.logout())]);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,9 @@ import ActionTypes from '../../constants/ActionTypes';
|
||||
export default function* loginSaga() {
|
||||
const watcherTasks = yield all(watchers.map((watcher) => fork(watcher)));
|
||||
|
||||
yield take(ActionTypes.AUTHENTICATE__SUCCESS);
|
||||
yield fork(services.initializeLogin);
|
||||
|
||||
yield take([ActionTypes.AUTHENTICATE__SUCCESS, ActionTypes.WITH_OIDC_AUTHENTICATE__SUCCESS]);
|
||||
|
||||
yield cancel(watcherTasks);
|
||||
yield call(services.goToRoot);
|
||||
|
||||
@@ -1,19 +1,25 @@
|
||||
import { call, put } from 'redux-saga/effects';
|
||||
import { apply, call, put, select } from 'redux-saga/effects';
|
||||
import { replace } from '../../../lib/redux-router';
|
||||
|
||||
import selectors from '../../../selectors';
|
||||
import actions from '../../../actions';
|
||||
import api from '../../../api';
|
||||
import { createOidcManager } from '../../../utils/oidc-manager';
|
||||
import { setAccessToken } from '../../../utils/access-token-storage';
|
||||
import Paths from '../../../constants/Paths';
|
||||
|
||||
export function* initializeLogin() {
|
||||
const { item: config } = yield call(api.getConfig); // TODO: handle error
|
||||
|
||||
yield put(actions.initializeLogin(config));
|
||||
}
|
||||
|
||||
export function* authenticate(data) {
|
||||
yield put(actions.authenticate(data));
|
||||
|
||||
let accessToken = data.access_token;
|
||||
let accessToken;
|
||||
try {
|
||||
if (accessToken) {
|
||||
({ item: accessToken } = yield call(api.exchangeOidcToken, accessToken));
|
||||
} else {
|
||||
({ item: accessToken } = yield call(api.createAccessToken, data));
|
||||
}
|
||||
({ item: accessToken } = yield call(api.createAccessToken, data));
|
||||
} catch (error) {
|
||||
yield put(actions.authenticate.failure(error));
|
||||
return;
|
||||
@@ -23,11 +29,50 @@ export function* authenticate(data) {
|
||||
yield put(actions.authenticate.success(accessToken));
|
||||
}
|
||||
|
||||
export function* authenticateWithOidc() {
|
||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
||||
const oidcManager = createOidcManager(oidcConfig);
|
||||
|
||||
yield apply(oidcManager, oidcManager.login);
|
||||
}
|
||||
|
||||
export function* authenticateWithOidcCallback() {
|
||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
||||
const oidcManager = createOidcManager(oidcConfig);
|
||||
|
||||
let oidcToken;
|
||||
try {
|
||||
({ access_token: oidcToken } = yield apply(oidcManager, oidcManager.loginCallback));
|
||||
} catch (error) {
|
||||
yield put(actions.authenticateWithOidc.failure(error));
|
||||
}
|
||||
|
||||
yield put(replace(Paths.LOGIN));
|
||||
|
||||
if (oidcToken) {
|
||||
let accessToken;
|
||||
try {
|
||||
({ item: accessToken } = yield call(api.exchangeToAccessToken, {
|
||||
token: oidcToken,
|
||||
}));
|
||||
} catch (error) {
|
||||
yield put(actions.authenticateWithOidc.failure(error));
|
||||
return;
|
||||
}
|
||||
|
||||
yield call(setAccessToken, accessToken);
|
||||
yield put(actions.authenticateWithOidc.success(accessToken));
|
||||
}
|
||||
}
|
||||
|
||||
export function* clearAuthenticateError() {
|
||||
yield put(actions.clearAuthenticateError());
|
||||
}
|
||||
|
||||
export default {
|
||||
initializeLogin,
|
||||
authenticate,
|
||||
authenticateWithOidc,
|
||||
authenticateWithOidcCallback,
|
||||
clearAuthenticateError,
|
||||
};
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
import { call, put, select, take } from 'redux-saga/effects';
|
||||
import { push } from '../../../lib/redux-router';
|
||||
|
||||
import { authenticateWithOidcCallback } from './login';
|
||||
import selectors from '../../../selectors';
|
||||
import ActionTypes from '../../../constants/ActionTypes';
|
||||
import Paths from '../../../constants/Paths';
|
||||
|
||||
export function* goToLogin() {
|
||||
@@ -27,6 +29,19 @@ export function* handleLocationChange() {
|
||||
yield call(goToLogin);
|
||||
|
||||
break;
|
||||
case Paths.OIDC_CALLBACK: {
|
||||
const isInitializing = yield select(selectors.selectIsInitializing);
|
||||
|
||||
if (isInitializing) {
|
||||
yield take(ActionTypes.LOGIN_INITIALIZE);
|
||||
}
|
||||
|
||||
// TODO: check if OIDC is enabled
|
||||
|
||||
yield call(authenticateWithOidcCallback);
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ export default function* loginWatchers() {
|
||||
takeEvery(EntryActionTypes.AUTHENTICATE, ({ payload: { data } }) =>
|
||||
services.authenticate(data),
|
||||
),
|
||||
takeEvery(EntryActionTypes.WITH_OIDC_AUTHENTICATE, () => services.authenticateWithOidc()),
|
||||
takeEvery(EntryActionTypes.AUTHENTICATE_ERROR_CLEAR, () => services.clearAuthenticateError()),
|
||||
]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user