Drupal REST return 301 после входа из ионного приложения

У меня есть веб-приложение на базе drupal 7, и я хочу создать ионное приложение, связанное с этим веб-приложением, с помощью REST.

Действие входа работает хорошо, но после входа в систему я всегда получаю статус 301 Moved Permamently, независимо от того, что я звоню из REST.

Но когда я делаю то же самое, используя ARC или POSTMASTER, все работает хорошо. Я могу успешно войти в систему, получить токен и выйти без проблем.

Я думаю, причина не в том, чтобы правильно установить заголовок. Когда я использую ARC или POSTMASTER, мой запрос содержит Cookie с session_name и sessid, полученные от drupal во время входа в систему.
Также я не могу установить X-CSRF-Token в заголовке.
Но когда я пытаюсь установить его на угловой, ничего не меняется по запросу [заголовки не установлены].

Мой логин контроллер на ионные (угловые):

var login = function(name, pw) {    
    return $q(function(resolve, reject) {

        var data = "username="+name+"&password="+pw;
        var config = {
            headers : {
                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
            }
        }

        $http.post('http://example.com/user/login.json', data, config)
            .then(
                function(response){
                // success callback
                storeUserCredentials(name + '.' + response.data.token, response.data.session_name, response.data.sessid);
                storeUserRole(response.data.user.roles);

                resolve('Login success.');
                }, 
                function(response){
                    // failure callback
                    //console.log('error '+response);
                    reject('Login Failed.');
                }
        );

    });
};

Мой контроллер выхода на ионные (угловые):

var logout = function() {

    var data = "username="+name+"&password="+pw;
    var config = {
        headers : {
            'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
            'X-CSRF-Token': token,
            'Cookie':session_name + '=' + sessid
        }
    }

    $http.post('http://example.com/user/logout.json', data, config)
        .then(
            function(response){
                // success callback
                destroyUserCredentials();
            }, 
            function(response){
                // failure callback
                destroyUserCredentials();
        }
    );
};

1 ответ

Эта техника работает для меня

Я храню "минимальный" объект конфигурации в качестве отправной точки. Этот объект создан с использованием ответа от /services/session/token как data В следующих:

localStorageService.set('HTTP_CONFIG', {
    headers: {
      'Content-type': 'application/json',
      'Accept': 'application/json',
      'X-CSRF-Token': data
    }
});

В отличие от многих примеров в Интернете, я считаю ненужным устанавливать куки вручную. На самом деле, попытка установить куки часто приводит к ошибкам. В этом примере я буду использовать локальное хранилище для создания копий конфигурации http.


Далее я выясняю, залогинен я или нет.

var tokenConfig = localStorageService.get('HTTP_CONFIG');
tokenConfig.url = APP_CONFIG.REST_API + '/system/connect.json';
tokenConfig.method = 'POST';
tokenConfig.data = {};
$http(tokenConfig) ...

Я просто продолжаю таким образом, например:

var loginConfig = localStorageService.get('HTTP_CONFIG');
loginConfig.method = 'POST';
loginConfig.url = APP_CONFIG.REST_API + '/user/login';
loginConfig.data = { username: username, password: password };
$http(loginConfig) ...

Я просто продолжаю использовать тот же "минимальный" объект конфигурации http, добавляя свойства по мере необходимости. Это отлично сработало для меня.

Другие вопросы по тегам