@splirit
html5, css3, js, jquery, knockoutjs, php, mysql

Как проверять авторизацию при старте в Angular?

Добрый день.
Подскажите, как правильно реализовать проверку аутентификации пользователя при старте приложения? Использую на бекенде jwt для создания токена. При логине получаю токен и храню его и данные о юзере в session storage, но при закрытии-открытии браузера нужно проверять подлинность токена на бекенде. Хочу это делать в блоке run но как это сделать что бы не дать возможность работать с приложением до проверка аутентификации? Вдруг юзер стартонет не с первой страницы, а с "закрытой". Нужно что-то типа resolve в state
  • Вопрос задан
  • 823 просмотра
Пригласить эксперта
Ответы на вопрос 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
примерно так в методе ран модуля
function run($rootScope, auth) {
// ...
        var noAuth = ['page.login','page.404'];
        $rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
            var isAuth = auth.isAuth();
            if (toState.name === 'page.login' && isAuth) {
                event.preventDefault();
                $rootScope.$state.go('app.home');
            }
            else if (!(toState.name in noAuth)  && !isAuth) {
                event.preventDefault();
                $rootScope.$state.go('page.login');
            }
        });
    };


храню jwt в локальном хранилище, у него есть expired, то есть можно проверять в геттере, если пользователь подменил вручную, то сервер отдаст 401
function sessionservice($localStorage) {
        var service = {
            setAccessToken: setAccessToken,
            clearAccessToken: clearAccessToken,
            getAccessToken: getAccessToken,
            getTokenInfo: getAccessTokenOpenInfo
        };

        return service;

        function setAccessToken(tokenData) {
            $localStorage.auth = tokenData;
            if ($localStorage.auth.expires_in)
                $localStorage.auth.expires_in = $localStorage.auth.expires_in * 10e3 + Date.now();
        }
        function clearAccessToken() {
            delete $localStorage.auth;
        }
        function getAccessToken() {
            if (!$localStorage.auth || !$localStorage.auth.expires_in || $localStorage.auth.expires_in < Date.now()) {
                clearAccessToken();
                return undefined;
            }
            else
                return $localStorage.auth.access_token;
        }
        function getAccessTokenOpenInfo() {
            var token = getAccessToken();
            return !token ? undefined : JSON.parse(atob(token.split('.')[1]));
        }
    }

function authinterceptor($q, $rootScope, session) {
        var request = function (config) {
            config.headers = config.headers || {};
            var token = session.getAccessToken();
            if (token) {
                config.headers.Authorization = 'Bearer ' + token;
            }
            return config || $q.when(config);
        };
        var responseError = function (rejection) {
            if (rejection.status === 401) {
                session.clearAccessToken();
                $rootScope.$state.go('page.login');
            }
            return $q.reject(rejection);
        };
        return {
            request: request,
            responseError: responseError
        };
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
28 нояб. 2024, в 11:20
50000 руб./за проект
28 нояб. 2024, в 10:57
50000 руб./за проект
28 нояб. 2024, в 10:52
10000 руб./за проект