отправка 'userLogoutAction', когда JWT истек, выдает ошибку в 'Menu.js' - PullRequest
0 голосов
/ 26 марта 2019

Для того, чтобы сделать автоматический выход из системы (инициированный приложением реагирования, без взаимодействия с пользователем и вызовами API) из моего приложения реагирования-администрирования (реагирования-администрирования версии 2.8.3), как только истекает срок действия JWT.Я делаю периодическую проверку и отправляю действие userLogout, которое я импортировал из ra-core/authActions, точно так же, как кнопка выхода из системы (ra-ui-materialui/auth/Logout).

К сожалению, ra-ui-materialui/esm/layout/Menu.js выдает ошибку в строке 116 с жалобой нанеопределенное свойство: TypeError: Невозможно прочитать свойство 'pathname' с нулевым значением

return {
  114 |     open: state.admin.ui.sidebarOpen,
  115 |     resources: getResources(state),
> 116 |     pathname: state.router.location.pathname
  117 |   };

С помощью инструментов Chrome Chrome я получаю сообщение о том, что хранилище redux router имеет свойство location, которое является нулевым.

Есть ли лучший способ выйти из системы после истечения срока действия JWT?Если нет, что мне нужно сделать, чтобы действие userLogout заработало?

Может быть, кто-то может объяснить, почему Menu.js кажется тесно связанным с действием userLogout.

Исходный код моего компонента выглядит следующим образом:

import React from 'react'
import { connect } from 'react-redux'
import { userLogout } from 'react-admin'
import { hasValidJWT } from '../authProvider'

class PeriodicAuthCheck extends React.Component {
    constructor(props) {
        super(props)
        // interval in seconds
        this.interval = 60
    }

    authCheck(loginPath, dispatchAction) {
        if (!hasValidJWT()) {
            if (window.location.hash !== `#${loginPath}`) {
                console.log(`JWT has expired, redirecting to ${loginPath}`)
                /*
                  this is my workaround:
                  window.location.replace(`/#${loginPath}`)
                */
                dispatchAction(loginPath)
            }
        }
    }

    componentDidMount() {
        this.authCheck(this.props.loginPath, this.props.logout)
        this.interval = setInterval(this.authCheck, this.interval * 1000, this.props.loginPath, this.props.logout)
    }

    componentWillUnmount() {
        if (this.interval) {
            clearInterval(this.interval)
            this.interval = undefined
        }
    }

    render() {
        return null
    }
}

const mapDispatchToProps = dispatch => {
    return {
        logout: (loginPath) => dispatch(userLogout(loginPath))
    }
}

export default connect(null, mapDispatchToProps)(PeriodicAuthCheck)

Заранее спасибо!Томас

1 Ответ

0 голосов
/ 27 марта 2019

Вы можете обновить httpClient для вашего dataProvider. Для меня это сработало, только если я явно удалил токен и перенаправил браузер в форму входа.

if (401 === responseStatusCode) {
    localStorage.removeItem('token');
    window.location = '/#/login';
}

Это не самое приятное решение, но оно выполнено. Хотелось бы увидеть и другие решения этой проблемы.

...