Handle session expiration. Closes #11
This commit is contained in:
parent
bb02473b11
commit
9d73eeba15
@ -87,6 +87,16 @@ export function loginUserFailure(error) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const LOGIN_USER_EXPIRED = "LOGIN_USER_EXPIRED";
|
||||||
|
export function loginUserExpired(error) {
|
||||||
|
return {
|
||||||
|
type: LOGIN_USER_EXPIRED,
|
||||||
|
payload: {
|
||||||
|
error: error
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export const LOGIN_USER_REQUEST = "LOGIN_USER_REQUEST";
|
export const LOGIN_USER_REQUEST = "LOGIN_USER_REQUEST";
|
||||||
export function loginUserRequest() {
|
export function loginUserRequest() {
|
||||||
return {
|
return {
|
||||||
|
@ -7,8 +7,8 @@ export class RequireAuthentication extends Component {
|
|||||||
this.checkAuth(this.props.isAuthenticated);
|
this.checkAuth(this.props.isAuthenticated);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUpdate () {
|
componentWillUpdate (newProps) {
|
||||||
this.checkAuth(this.props.isAuthenticated);
|
this.checkAuth(newProps.isAuthenticated);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkAuth (isAuthenticated) {
|
checkAuth (isAuthenticated) {
|
||||||
|
@ -5,6 +5,8 @@ import X2JS from "x2js";
|
|||||||
import { assembleURLAndParams } from "../utils";
|
import { assembleURLAndParams } from "../utils";
|
||||||
import { i18nRecord } from "../models/i18n";
|
import { i18nRecord } from "../models/i18n";
|
||||||
|
|
||||||
|
import { loginUserExpired } from "../actions/auth";
|
||||||
|
|
||||||
export const API_VERSION = 350001; /** API version to use. */
|
export const API_VERSION = 350001; /** API version to use. */
|
||||||
export const BASE_API_PATH = "/server/xml.server.php"; /** Base API path after endpoint. */
|
export const BASE_API_PATH = "/server/xml.server.php"; /** Base API path after endpoint. */
|
||||||
|
|
||||||
@ -35,7 +37,7 @@ function _parseToJSON (responseText) {
|
|||||||
|
|
||||||
function _checkAPIErrors (jsonData) {
|
function _checkAPIErrors (jsonData) {
|
||||||
if (jsonData.error) {
|
if (jsonData.error) {
|
||||||
return Promise.reject(jsonData.error.__cdata + " (" + jsonData.error.code + ")");
|
return Promise.reject(jsonData.error);
|
||||||
} else if (!jsonData) {
|
} else if (!jsonData) {
|
||||||
// No data returned
|
// No data returned
|
||||||
return Promise.reject(new i18nRecord({
|
return Promise.reject(new i18nRecord({
|
||||||
@ -218,9 +220,24 @@ export default store => next => reduxAction => {
|
|||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
if (failureDispatch) {
|
if (failureDispatch) {
|
||||||
if (error instanceof Error) {
|
const errorMessage = error.__cdata + " (" + error._code + ")";
|
||||||
|
// Error object from the API
|
||||||
|
if (error._code && error.__cdata) {
|
||||||
|
if (401 == error._code) {
|
||||||
|
// This is an error meaning no valid session was
|
||||||
|
// passed. We must perform a new handshake.
|
||||||
|
store.dispatch(loginUserExpired(errorMessage));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Else, form error message and continue
|
||||||
|
error = errorMessage;
|
||||||
|
}
|
||||||
|
// Else if exception was thrown
|
||||||
|
else if (error instanceof Error) {
|
||||||
|
// Form error message and continue
|
||||||
error = error.message;
|
error = error.message;
|
||||||
}
|
}
|
||||||
|
// Dispatch a failure event
|
||||||
store.dispatch(failureDispatch(error));
|
store.dispatch(failureDispatch(error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import Cookies from "js-cookie";
|
import Cookies from "js-cookie";
|
||||||
|
|
||||||
import {LOGIN_USER_REQUEST, LOGIN_USER_SUCCESS, LOGIN_USER_FAILURE, LOGOUT_USER} from "../actions";
|
import { LOGIN_USER_REQUEST, LOGIN_USER_SUCCESS, LOGIN_USER_FAILURE, LOGIN_USER_EXPIRED, LOGOUT_USER } from "../actions";
|
||||||
import { createReducer } from "../utils";
|
import { createReducer } from "../utils";
|
||||||
import { i18nRecord } from "../models/i18n";
|
import { i18nRecord } from "../models/i18n";
|
||||||
import { tokenRecord, stateRecord } from "../models/auth";
|
import { tokenRecord, stateRecord } from "../models/auth";
|
||||||
@ -72,6 +72,12 @@ export default createReducer(initialState, {
|
|||||||
"error": payload.error
|
"error": payload.error
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
[LOGIN_USER_EXPIRED]: (state, payload) => {
|
||||||
|
return new stateRecord({
|
||||||
|
"isAuthenticated": false,
|
||||||
|
"error": payload.error
|
||||||
|
});
|
||||||
|
},
|
||||||
[LOGOUT_USER]: () => {
|
[LOGOUT_USER]: () => {
|
||||||
return new stateRecord({
|
return new stateRecord({
|
||||||
info: new i18nRecord({
|
info: new i18nRecord({
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user