2017-03-24 2 views
0

Wie sende ich CSRF- und Token-Daten in einer HTTP-Anfrage?Angular http.post-Header Ausgabe

Ich verwende Angular, um Json-Daten an einen Drupal-Dienstendpunkt zu senden, aber ich habe Probleme.

// drupal post node 
$scope.post_node = function(){ 
      console.info('Node post ...'); 

      var promise = $http.post('http://mysite/QuestionsGenerator/angularjs-headless/api/v1/node', 
       { 
        "title" : "Node Test", 
        "body" : "Node body contents test#2", 
        "type" : "page" 
       }, 
       { 
        'Content-type' : 'application/json', 
        'Accept' : 'application/json', 
        'X-CSRF-Token' : $cookieStore.get('user_session_token'), 
        'Cookie' : $cookieStore.get('user_session_cookie') 
       } 
      ) 
      .then(
       //   successCallback, 
       function(response){ 
        console.log('Post-node working ...'); 
        $log.info(response); 
       }, 
       //   errorCallback 
       function(response){ 
        console.log('Post-node NOT working ...'); 
        $log.error(response); 
       } 
      ); 

      return promise; 
     } 

    }]); 

den oben stehenden Code verwenden, ich versuche, einen Knoten zu einem Drupal Service Endpunkt schreiben erstellt werden - so muß ich, Körper und Knotentyp für die einen Titel schreiben neuer Knoten

Darüber hinaus habe ich X-CSRF-Token und Plätzchen Informationen zu veröffentlichen, die mit Drupal mein Eckige Benutzer authentifiziert, so kann der Knoten erfolgreich erstellt werden.

Allerdings erhalte ich folgende Fehlermeldung:. Refused to set unsafe header "Cookie" gefolgt von einer Meldung, die der Benutzer sagt, ist nicht angemeldet - ich den Benutzer bestätigen kann, nicht nur existieren, sondern angemeldet

Mein Netzwerk Registerkarte zeigt keine Details Meine Token- oder Cookie-Details beginnen gesendet - was erklären würde, dass der Benutzer nicht authentifiziert wird.

Kann mir jemand helfen zu verstehen, wie ich meine Cookie- und Token-Daten senden kann?

UPDATE

Bitte entschuldigen Sie meine komplette newbness in allen Dingen Angular aber ich versuchte, das Hinzufügen des withcredentials Linie, wie in dem folgenden Code:

var headlessQS = angular.module('headlessQS', ['ngRoute', 'ngCookies']); 

headlessQS.config(function($routeProvider, $httpProvider){ 
    $routeProvider 

     $httpProvider.defaults.withCredentials = true 

    .when('/', { 
     templateUrl: 'pages/main.html', 
     controller: 'mainController' 
    }) 

    .when('/wiris', { 
     templateUrl: 'pages/wiris.html', 
     controller: 'wirisController' 
    }) 

    .when('/signin', { 
     templateUrl: 'pages/signin.html', 
     controller: 'signinController' 
    }) 
}); 

// Controllers 

...... 

Aber ich folgende Fehlermeldung erhalten:

Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.3.0-rc.2/$injector/modulerr?p0=headlessQS&p1=… 

Auch, wenn der Code mit den Zugangsdaten funktioniert, ich meine Token etc Daten wie im folgenden Code hinzufügen:

var promise = $http.post('http://mysite/QuestionsGenerator/angularjs-headless/api/v1/node', 
    { 
     "title" : "Node Test", 
     "body" : "Node body contents test#2", 
     "type" : "page" 
    }, 
    {  
     headers: { 
      'Content-type' : 'application/json', 
      'Accept' : 'application/json', 
      'X-CSRF-Token' : $cookieStore.get('user_session_token'), 
      'Cookie' : $cookieStore.get('user_session_cookie') 
     } 
    } 
) 
.then(
    //   successCallback 

Antwort

0

Wenn Sie $cookies verwenden, und Sie setzen:

$httpProvider.defaults.withCredentials = true; // from main module 

dann Ihre Cookies sollten bei jeder Anfrage gesendet werden.

Standardmäßig liest $http auch ein Token aus einem XSRF-TOKEN Cookie und wendet einen Header X-XSRF-TOKEN auf die Anfrage an.

Wenn Sie versuchen, ein JWT Token als Bearer-Token auf dem Authorization-Header zu senden, schauen Sie in einen HTTP Interceptor mit:

// register the interceptor as a service 
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { 
    return { 
    'request': function(config) { 
     var access_token = tokenService.getAccessToken(); 
      if (access_token) { 
       if (config.url.indexOf(this.myAPIUrl) === 0) { 
        config.headers.Authorization = 'Bearer ' + access_token; 
       } 
      } 
     return config; 
    } 
    }; 
}); 

$httpProvider.interceptors.push('myHttpInterceptor'); 

Hinweis: Sie können auch die HTTP Interceptor verwenden alle HTTP zu erfassen Antworten und Fehler bei HTTP-Anfragen und -Antworten.

+0

Danke für Ihre Antwort Ben. Bitte entschuldigen Sie meine Neuigkeit, aber ich habe keine Ahnung, wo und wie Sie Ihre Vorschläge in meinen Code integrieren können. Glaub mir, ich habe es versucht und bisher nicht geschafft. Können Sie mir bitte meine Richtung anbieten? – sisko

+0

Sie sollten in der Lage sein, die '$ httpProvider' Standardwerte mit einem' .config' Block in Ihrer AngularJS Hauptdatei zu implementieren (höchstwahrscheinlich app.js). –

+0

Ich versuchte diesen Ansatz ohne Erfolg. Ich habe ein Update zu der ursprünglichen Frage hinzugefügt, damit Sie sehen können, was ich meine. Danke für deine fortwährende Hilfe – sisko