2017-05-13 2 views
0

Ich benutze die Node-Rest-Client-Bibliothek, um meine Rest-API aufzurufen, auf der eine Python-Flashin-App auf einem Testserver ausgeführt wird. Der Knoten Setup- und Anfragecode ist unten.Standardauthentifizierung funktioniert nicht im Node-Rest-Client-Knoten

Wenn ich einen Benutzer Token an den Request-Header es Worte in Ordnung, aber in dem Ruf fügen Sie die Benutzer-Token mit grundlegender auth meines Python-System Authentifizierung erfolgreich zu erhalten, und das Token mit einem 200-Status zurückkehrt, aber der Kolben-Server dann ändere dies zu einer 400 schlechten Anfrage. Es funktioniert gut, den Anruf mit Postman zu machen.

Fehlt etwas in meinen beiden Konfigurationsobjekten für node-rest-client?

Prost.

var options_auth = { 
    user: "bob", 
    password: "password", 
    mimetypes: { 
     json: ["application/json", "application/json;charset=utf-8"] 
    } 
}; 

var Client = require('node-rest-client').Client; 
var client = new Client(options_auth); 
var method = "/authtoken"; 

var args = { 
    headers: { 
     "Content-Type": "application/json", 
     "api-key": "asf89a7assa98d7sd98d98ds", 
     //"token": "dsf98s7dsf98dsf7sd98f7dsf", 
     "Accept": "application/json" 
    }, 
    responseConfig: { 
     timeout: 1000 //response timeout 
    } 
}; 

client.get(Api.url+method, args, function (data, response) { 
    // parsed response body as js object 
    // raw response 
    //console.log(response); 

    if(Buffer.isBuffer(data)){ 
     data = data.toString('utf8'); 
    } 
    console.log(data); 

    var stringData = data.toString('utf8'); 

    console.log("String data = "+stringData); 

}).on('error', function (err) { 
    console.error('Something went wrong with the http client', err); 
}); 

Auch entdeckte diese Unterschiede zwischen den Request-Header vom Server empfangen:

// Node Request fails: 400 
    'headers': EnvironHeaders([ 
     ('Authorization', u'Basic XXXXXXXXXXXXXX=='), 
     ('Vga-Api-Key', u'xxxxxxxxxxxxxxxxxxxxxxxx'), 
     ('Content-Length', u'0'), 
     ('Connection', u'close'), 
     ('Host', u'127.0.0.1:8080'), 
     ('Accept', u'*/*'), 
     ('Content-Type', u'application/json')]), 

    // Postman Request works: 200 
    'headers': EnvironHeaders([ 
     ('Authorization', u'Basic XXXXXXXXXXXXXX=='), 
     ('Vga-Api-Key', u'xxxxxxxxxxxxxxxxxxxxxxxx'), 
    * ('Content-Length', u''), 
    * ('Connection', u'keep-alive'), 
     ('Host', u'127.0.0.1:8080'), 
    * ('Cache-Control', u'no-cache'), 
     ('Accept', u'*/*'), 
     ('Content-Type', u''), 
    * ('Accept-Encoding', u'gzip, deflate')]), 

Antwort

1

Das Problem ist Ihre Einstellung des Headers Content-Type: application/json und die wahrscheinliche Berufung in den Server von request.get_json() direkt oder indirekt über die (veraltete) request.json Eigenschaft.

Wenn get_json() aufgerufen wird, überprüft Flask, ob eine JSON-Nutzlast im Hauptteil der Anforderung gesendet wurde, und analysiert sie, falls vorhanden. Das ist in Ordnung, wenn die Anfrage tatsächlich JSON im Hauptteil enthält, aber eine GET-Anfrage nicht. In diesem Fall, wenn die JSON-Erwartung nicht erfüllt ist, löst der Server einen Fehler BadRequest aus und gibt eine HTTP 400-Fehlerantwort aus.

Von dem, was Sie gezeigt haben, muss Ihre Anfrage nicht JSON sein, da der Autorisierungsbenutzername und das Passwort im Header Authorization: Basic xxxxxxxx übergeben werden.

Die einfachste und beste Möglichkeit, das Problem zu beheben, besteht darin, den Inhaltstypheader einfach wegzulassen.

Alternativ können Sie Flask nicht beschweren, wenn es keine JSON-Daten zu analysieren gibt, indem silent=True zu get_json übergeben, aber dies nur Papiere über das Problem und ist keine gute Idee.

+0

Hallo, nein, ich übergebe nichts in der Anfrage Körper also nicht JSON auf der Flasche Seite extrahieren. Eigentlich habe ich gerade den Inhalt hinzugefügt, um das Problem zu beheben :-) – Jon

+0

Eigentlich habe ich gerade eine Version bekommen, indem ich einige Aktionen auf der Kolbenseite entfernt habe, die für jetzt unnötig waren, und es hat funktioniert - ich habe eine andere Funktion ausprobiert, die den Benutzer extrahiert Daten und es hat gut funktioniert. Also vielleicht war es eine Art Timing-Problem? Es ist komisch und vielleicht werde ich wieder auf dieses Problem stoßen, aber für den Moment funktioniert es. Ich würde nicht sagen, dass ich es gelöst hatte, ich habe das Problem vorerst nur beiseite geschoben. Außerdem bin ich neu bei Node, aber ich sehe keinen großen Gewinn bei der Verwendung von Node-Rest-Client gegenüber dem Standard-HTTP-Client. – Jon

+0

@Jon: Was hast du entfernt? – mhawke

Verwandte Themen