Ionic 3 - Angular 4.3 HttpClientModule не может авторизоваться с помощью сервисов Drupal 7.0 3

Я пытаюсь разработать приложение Ionic, которое взаимодействует с Drupal Services 3, используя аутентификацию.

В почтальоне я могу воспроизвести логин, а затем, после того, как cookie установлен, использовать X-CSRF-Token для подключения к другим пользовательским сервисам. В Ionic я получаю 401 (Несанкционированный: проверка CSRF не удалась). После нескольких отладок я обнаружил, что это не связано с CORS или чем-либо еще; кажется, что файл cookie, отправленный во втором вызове, отличается от того, который я получаю при первом вызове.

У меня CORS установлен в drupal с этим конфигом:

*|<mirror>|POST,GET,PUT|Content-Type,X-CSRF-Token,Authentication, Origin|true

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

  1. LoginPage выполняет вход в систему, получает токен и cookie (session_name + '=' + session_id)

  2. При успешном завершении значения сохраняются в хранилище

  3. Домашняя страница загружена, значения сохранены извлечены (проверено, что они являются правильными значениями) и сделан второй вызов
  4. Второй вызов говорит, что проверка CSRF не удалась

Я заметил (используя Chrome Developer Tools), что во втором вызове отправленный файл cookie отличается от ожидаемого, что может объяснить, почему он не работает, но я не знаю, откуда этот файл cookie. Можно увидеть это на изображениях один и два.

Я также заметил, что есть два вызова для каждой службы: параметры и сам вызов (предположим, это нормально).

Изображение 1

Изображение 2

Код для HomePage это:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import 'rxjs/add/operator/map';
import { Storage } from '@ionic/storage';

@Component({
    selector: 'page-home',
    templateUrl: 'home.html'
})
export class HomePage {
    games : any

    constructor(public navCtrl: NavController, private httpClient: HttpClient, private storage: Storage) {

            this.init();


    }
    init(){
        this.storage.get('token').then((token) => { 
            this.storage.get('cookie').then((cookie) => {
                this.getGames(token, cookie);
            });
        });
    }
    getGames(token: any, cookie: any){
        let link = "https://trueeke.es/api/base/game";
        var  options = { withCredentials: true, headers: new HttpHeaders({'Content-Type' : 'application/json',"X-CSRF-Token" : token})};
        this.httpClient.post(link, { 'gid': 3 }, options)
        .subscribe(data => {
            console.log(data);
            //this.games = data;
        }, error => {
            console.log("Oooops!");
        });
    }
    gameClicked(i){
        console.log(i);
    }
}

Код для LoginPage это:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import 'rxjs/add/operator/map';
import { Storage } from '@ionic/storage';
import { HomePage } from '../home/home';


@Component({
    selector: 'page-login',
    templateUrl: 'login.html'
})
export class LoginPage {

    constructor(public navCtrl: NavController, private httpClient: HttpClient , private storage: Storage) {
        this.login();
    }
    login(){
        let login_link = "https://trueeke.es/api/user/login";
        let username = 'david';
        let password = 'XXXXXXXXX'; 
        let login_data = { 
            username : username, 
            password: password 
        };
        var  options = { headers: new HttpHeaders({}) };

        this.httpClient.post(login_link, login_data)
        .subscribe(
            data => {
                var response =  data;
                this.storage.set('token', response['token']);
                console.log('token: ' + response['token']);
                this.storage.set('cookie', response['session_name'] + '=' + response['sessid']);
                console.log('cookie: ' + response['session_name'] + '=' + response['sessid']);
                this.storage.get('token').then((token) => { 
                this.navCtrl.setRoot(HomePage, {}, {animate: true, direction: 'forward'});
            });
        }, error => {

            console.log("Oooops!");
        });

    }
}

0 ответов

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