EN · DE · RU · FR · ES

#2467: authentication.js

projectforge-webapp/src/actions/authentication.js Тип: JavaScript/React · Роль: Компонент · Исходник: projectforge-webapp/src/actions/authentication.js 85 строк · 73 кода · 3 комментария · 9 пустых
Модуль аутентификации React, управляющий состоянием входа, токенами и сохранением сессии.

Структура кода

Компоненты: USER_LOGIN_BEGIN, USER_LOGIN_SUCCESS, USER_LOGIN_FAILURE

Используемые хуки: rLoginFailure, rLoginBegin, rLoginSuccess, rLoginBegin

Экспорты: USER_LOGIN_BEGIN, USER_LOGIN_SUCCESS, USER_LOGIN_FAILURE, userLoginBegin, userLoginSuccess, userLoginFailure, loadUserStatus, login

Импорты из: ../utilities/rest

Исходный код (сокращённый)

import { getServiceURL, handleHTTPErrors } from '../utilities/rest';

export const USER_LOGIN_BEGIN = 'USER_LOGIN_BEGIN';
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS';
export const USER_LOGIN_FAILURE = 'USER_LOGIN_FAILURE';

export const userLoginBegin = () => ({
    type: USER_LOGIN_BEGIN,
});

export const userLoginSuccess = (user, version, buildTimestamp, alertMessage) => ({
    type: USER_LOGIN_SUCCESS,
    payload: {
        user,
        version,
        buildTimestamp,
        alertMessage,
    },
});

export const userLoginFailure = (error) => ({
    type: USER_LOGIN_FAILURE,
    payload: {
        error,
    },
});

const catchError = (dispatch) => (error) => dispatch(userLoginFailure(error.message));

export const loadUserStatus = () => (dispatch) => {
    dispatch(userLoginBegin());

    return fetch(
        getServiceURL('userStatus'),
        {
            method: 'GET',
            credentials: 'include',
        },
    )
        .then(handleHTTPErrors)
        .then((response) => response.json())
        .then(({ userData, systemData, alertMessage }) => {
            dispatch(userLoginSuccess(
                userData,
                systemData.version,
                systemData.buildTimestamp,
                alertMessage,
            ));
        })
        .catch(() => {
            const { pathname, search } = window.location;
            const href = pathname + search;
            if (!pathname.startsWith('/react/public/login')
                // /react/public/datatransfer/ — особый случай, когда пользователь не авторизован.
                // Форма входа возвращается через передачу данных.
                && !pathname.startsWith('/react/public/datatransfer/')) {
                // установить URL для перенаправления после входа:
                window.location.href = `/react/public/login?url=${encodeURIComponent(href)}`;
            }

            catchError(dispatch)({ message: undefined });
        });
};

export const login = (username, password, keepSignedIn) => (dispatch) => {
    dispatch(userLoginBegin());
    return fetch(
        getServiceURL('/rsPublic/login'),
        {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                username,
                password,
                stayLoggedIn: keepSignedIn,
            }),
            credentials: 'include',
        },
    )
        .then(handleHTTPErrors)
        .then(() => loadUserStatus()(dispatch))
        .catch(catchError(dispatch));
};

История Git

e2061d7db UserPrefDao: подавление лога ошибок для старых TimesheetPrefData. Улучшена обработка входа: перенаправление на исходный URL после входа.
cc0eb7b56 DataTransferPublicPagesRest: не показывать токен доступа в форме входа. Исправлен вход.
7c88abd0f wip обновление зависимостей
bbd81edc3 es-lint, новые версии js.
4f5a06d6f AppVersion удалён. Добавлена информация о Git в ProjectForgeVersion.