Почему сеанс входа в систему не "прилипает" при входе в систему с использованием окна "ionic serve", но работает, когда я указываю браузер на папку www?

Я использую Ionic для создания системы входа в систему поверх Codeigniter/Ion_Auth/codeigniter-restclient, и когда я пытаюсь войти с "ионного сервера", логин работает, но следующий запрос api к методу logged_in() возвращает false.

То же самое работает правильно, когда я указываю браузер на папку www.

Итак, вот шаг за шагом:

  • запустить ионную службу

  • вы видите форму входа (http://localhost:8100/#/app/login)

  • введите адрес электронной почты и пройдите

  • остальное api возвращает "login successful"

  • $state.go('app.profile') работает и перенаправляется на http://localhost:8100/#/app/profile

  • REST get api/logged_in возвращает false и я перенаправляюсь на страницу входа

Если я сделаю то же самое в обычном браузере, шаг 1 станет: откройте браузер и перейдите в http://localhost:8888/App/www/#/app/login, на шаге 6 REST получите api/logged_in, возвращает true и я не перенаправляюсь на страницу входа в систему, я остаюсь на странице профиля.

Код тот же. Поэтому я предполагаю, что, возможно, ion_auth не получает файлы cookie, которые он хочет, или сеанс сбрасывается. На данный момент я не уверен, в чем проблема. Это мой первый проект Ionic/App, поэтому мне может не хватать что-то о правильном способе аутентификации из мобильного приложения с использованием кода, который работает в браузерах.

Спасибо

UPDATE: Похоже, что при использовании окна "ионного сервера" каждый запрос к API запускает новый сеанс. Новый сеанс хранится в базе данных, а ion_auth проверяет logged_in на последнем, который не содержит данных для входа.

Ответ 1

вы принимали REST api и файлы cookie и сеансы. Cookies и сеансы не идут с философией REST. Вот почему.

Позвольте мне рассказать вам, как мы справляемся с этой проблемой в нашем проекте. Основной способ узнать, какой пользователь запрашивает и имеет ли он права доступа, - это значение заголовка "Авторизация". Вы можете использовать Basic Authentication, Barer или любой другой.

Обычно мы предпочитаем систему авторизации на основе токенов. Когда логин успешно завершен, сервер отправляет токен. В ионном приложении мы сохраняем его с помощью factory, называемого SessionService. Поэтому всякий раз, когда пользователь входит в систему, маркер хранится и используется для каждого запроса. Но токен будет потерян, если пользователь закроет приложение. Поэтому мы можем хранить его в локальном хранилище. Затем пользователь может быть перенаправлен на панель управления до тех пор, пока пользователь не выйдет из системы.

app.factory("SessionService", function($window){
    var user={};

    if ($window.localStorage['user']!=undefined){
        user=JSON.parse($window.localStorage['user']);
        console.log(user);
    }

    return{
        isLoggedIn:function(){
            return !isEmpty(user);
        },
        logout:function(){
            console.log("logout")
            user={};
            $window.localStorage.clear();
        },
        setUser:function(data){
            user=data;
            $window.localStorage['user']= JSON.stringify(user);
        }, 
        getUser:function(){
            return user;
        }
    }
})

Теперь в каждом веб-запросе вы можете вызвать SessionService.getUser().token при настройке заголовка Authorization.

UPDATE:

Несмотря на то, что использование файлов cookie не рекомендуется, вы можете легко использовать его в своем приложении.

Если вы отправляете запрос с CORS, angular не отправляет файлы cookie с запросом. Один из способов решить эту проблему - отправить withCredentials: true с каждым запросом:

$http({withCredentials: true, ...}).get(...)

Подробнее об этом .

Надеюсь, это поможет!