2017-02-08 2 views
0

Ich bin in der Lage, einen erfolgreichen POSTMAN-Aufruf zu machen: /mfp/api/az/v1/token und /mfpadmin/management-apis/2.0/runtimes/mfp/applicationsMFP 8.0 API funktioniert in POSTMAN, aber nicht von AJAX

Ich nehme das Bearer-Token, das ich von/mfp/api/az/v1/token erhalte, und füge es dem Authorization-Header für/mfp/applications hinzu.

Ich erhalte eine Antwort von 200 und beide erhalten die erwarteten Informationen von jedem API.

ich Anrufe wählen Sie dann die Ajax-Code aus POSTMAN für jeden dieser Arbeits API kopieren:

var getBasic = { 
    "async": true, 
    "crossDomain": true, 
    "url": "https://..../mfp/api/az/v1/token", 
    "method": "POST", 
    "headers": { 
     "authorization": "Basic YXBpYzptZnBhcGlj", 
     "grant_type": "client_credentials", 
     "cache-control": "no-cache", 
     "postman-token": "05a672e5-6141-fd6f-82e2-b282d68dce35", 
     "content-type": "application/x-www-form-urlencoded" 
    }, 
    "data": { 
     "grant_type": "client_credentials", 
     "scope": "settings.read" 
    } 
    } 

    $.ajax(getBasic).done(function (response) { 
    console.log(response); 
    var accessToken = response.access_token; 
    console.log(accessToken); 
    var settings = { 
     "async": true, 
     "crossDomain": true, 
     "url": "https://....:8445/mfpadmin/management-apis/2.0/runtimes/mfp/applications", 
     "method": "GET", 
     "headers": { 
     "authorization": "Bearer " + accessToken, 
     "cache-control": "no-cache" 
     } 
     } 
    console.log(settings); 
    $.ajax(settings).done(function (response) { 
     console.log("response: " + response.totalListSize); 
    }); 

    }); 

Allerdings, wenn ich das ich aus dem/Token aber ich erhalte eine 200-Antwort in meinem WebUI laufen bekomme eine 401 (nicht autorisiert) von meinem/mfp/applications

Warum funktioniert das im Postboten, aber nicht von der Weboberfläche (Chrome)?

+0

Ich denke, du solltest das Zugriffstoken von Code zu erhalten und nicht einfach eine bestehende Token wiederverwenden. Hast du versucht, es per Code zu bekommen? https://mobilefirstplatform.ibmcloud.com/tutorials/de/stiftung/8.0/authentication-and-security/confidential-clients/# Ermitteln eines Zugriffstokens –

+0

Ich erhalte das Bearer-Token mit den getBasic-Details. Wenn dieser Aufruf abgeschlossen ist, erhalte ich das access_token aus der Antwort und gebe es an die Einstellungsvariable (/ mfp/applications) weiter. –

+0

Was meintest du mit "Ich wähle dann, den Ajax-Code vom Postboten zu kopieren"? –

Antwort

0

Der mfpadmin Dienst und seinen Endpunkt, die Sie verwenden (applications) tut nicht ein Zugriffstoken in der Art und Weise erfordern, dass Sie versucht haben, es zu erhalten. Es erfordert den Benutzernamen und das Kennwort für die Konsole. Wenn Sie also die Bearer access-token verwenden, schlägt sie mit fehl, da der Server dies nicht erwartet, um den Zugriff auf den applications Endpunkt zu ermöglichen.

Ich habe folgendes getan:

  1. installiert, um die express und request Knoten Pakete einen Proxy von Arten zu erstellen. Dies ist erforderlich, da Sie nicht einfach einen AJAX-Request an den Server aus dem Browser machen (Sie Fehler aus dem Browser bekommen in Bezug auf Herkunft Anfragen zu überqueren):

    npm init 
    npm install --save express 
    npm install --save request 
    

    ein proxy.js Erstellt (beachten Sie, dass diese Code ist spezifisch für mfpadmin):

    var express = require('express'); 
    var http = require('http'); 
    var request = require('request'); 
    
    var app = express(); 
    var server = http.createServer(app); 
    var mfpServer = "http://localhost:9080"; 
    var port = 9081; 
    
    server.listen(port); 
    app.use('/', express.static(__dirname + '/')); 
    console.log('::: server.js ::: Listening on port ' + port); 
    
    // Reverse proxy, pipes the requests to/from MobileFirst Server 
    app.use('/mfpadmin/*', function(req, res) { 
        var url = mfpServer + req.originalUrl; 
        console.log('::: server.js ::: Passing request to URL: ' + url); 
        req.pipe(request[req.method.toLowerCase()](url)).pipe(res); 
    }); 
    
  2. In einer HTML-Datei Referenz eine Implementierung JS-Datei und jQuery:

    <html> 
        <head> 
         <script src="/jquery-3.1.1.min.js"></script> 
         <script src="/main.js"></script> 
        </head> 
    
        <body> 
    
        </body> 
    </html> 
    
  3. In main.js Datei:

    $.ajax({ 
        "crossDomain": true, 
        "url": "http://localhost:9081/mfpadmin/management-apis/2.0/runtimes/mfp/applications", 
        "method": "GET", 
        "headers": { 
         "authorization": "Basic YWRtaW46YWRtaW4=", 
         "Access-Control-Allow-Origin": "*", 
         "cache-control": "no-cache" 
        }  
    }).done(function(response) { 
        console.log(response); 
    }); 
    

    Basic YWRtaW46YWRtaW4= ist die Darstellung von Basic Auth mit Benutzername und Passwort adminadmin.

Als Antwort erhielt ich folgende JSON. Das Array items enthält die Anwendungen, die derzeit im MobileFirst Server registriert sind.

enter image description here

+0

Muss der node.js-Proxy auch auf unserem Server eingerichtet werden, damit dies funktioniert? –

Verwandte Themen