2016-03-31 4 views
5

Für unsere AWS-API-Endpunkte verwenden wir AWS_IAM-Autorisierung und möchten einen Aufruf von Swagger UI durchführen. Um einen erfolgreichen Anruf zu tätigen, müssen 2 Header 'Authorization' und 'x-amz-date' vorhanden sein. Um "Autorisierung" zu bilden, verwenden wir following steps from aws doc. Wir müssen 'x-amz-date' bei jedem Aufruf ändern, um die Autorisierung zu durchlaufen. Die Frage ist: Wie schreibe Skript in Swagger, um Anfrage zu unterzeichnen, die jedes Mal vor Anfrage an aws senden? (Wir wissen, wie Sie beide Header einmal vor dem Laden der Swagger-Seite angeben, aber dieser Prozess sollte erneut ausgeführt werden vor jedem Aufruf).So berechnen Sie AWS-Signatur V4 in Swagger vor Anforderung

Vielen Dank im Voraus.

+0

Wir API-Gateway sowie Swagger verwenden die APIs zu definieren und auch, um herauszufinden versucht, wie sowohl die JS SDK Prahlerei-codegen zu erzeugen (sieht so aus, als ob die API-Gateway-Konsole eine Funktion oder eine benutzerdefinierte Vorlage mit dem sigv4-Code im Vorlagencode enthält) und bettet dann diese sigv4-Extra-Soße in den swagger-docs-JS-Code ein, dh in 'ApiClient.js'' applyAuthToRequest' . –

+0

Ich nehme an, das swagger doc generation tool funktioniert in ähnlicher Weise wie swagger codegen, das zusätzliche (dh: bustache) Templates ermöglicht, um die Ausgabe mit verschiedenen Markups, Skripten, etc. anzupassen? –

+0

eine Option zu raten wäre, 'swagger-ui' (https://github.com/swagger-api/swagger-ui) zu forcieren und die selbe sigv4-Magie dort einzubeziehen? –

Antwort

3

Es gibt eingebaute Unterstützung in swagger-js, requestInterceptor s hinzuzufügen, um genau dies zu tun. Das Projekt swagger-ui benutzt swagger-js unter der Haube.

Sie einfach eine Anfrage Abfangjäger wie solche erstellen:

requestInterceptor: { 
    apply: function (request) { 
    // modify the request object here 
    return request; 
    } 
} 

und wenden es auf Ihre Prahlerei Instanz zur Erstellung:

window.swaggerUi = new SwaggerUi({ 
    url: url, 
    dom_id: "swagger-ui-container", 
    requestInterceptor: requestInterceptor, 

Hier können Sie Header im request Objekt festlegen können (beachten Sie, dies ist nicht das Standard JavaScript http Anfrage Objekt, überprüfen Sie es für Details). Aber Sie haben hier Zugriff auf alle Header, so dass Sie sie nach Bedarf berechnen und injizieren können.

0

Sie können MonkeyPatching von AWS SDK in SwaggerJS (und damit SwaggerUI) ziemlich einfach. Siehe here

Ich habe eine leicht modifizierte SwaggerUI here. Mit einigen AWS-Anmeldeinformationen und einer API-ID wird die Swagger-Definition abgerufen, in SwaggerUI angezeigt und Sie können die API dann mit sigv4 aufrufen.

Die Authorizer Implementierung sieht wie folgt aus:

var AWSSigv4RequestSigner = function(credentialProvider, aws) { 
    this.name = "sigv4"; 
    this.aws = aws; 
    this.credentialProvider = credentialProvider; 
}; 

AWSSigv4RequestSigner.prototype.apply = function(options, authorizations) { 
    var serviceName = "execute-api"; 

    //If we are loading the definition itself, then we need to sign for apigateway. 
    if (options && options.url.indexOf("apigateway") >= 0) { 
    serviceName = "apigateway"; 
    } 

    if(serviceName == "apigateway" || (options.operation && options.operation.authorizations && options.operation.authorizations[0].sigv4)) 
    { 
    /** 
    * All of the below is an adapter to get this thing into the right form for the AWS JS SDK Signer 
    */ 
    var parts = options.url.split('?'); 
    var host = parts[0].substr(8, parts[0].indexOf("/", 8) - 8); 
    var path = parts[0].substr(parts[0].indexOf("/", 8)); 
    var querystring = parts[1]; 

    var now = new Date(); 
    if (!options.headers) 
    { 
    options.headers = []; 
    } 

    options.headers.host = host; 
    if(serviceName == "apigateway") 
    { 
     //For the swagger endpoint, apigateway is strict about content-type 
     options.headers.accept = "application/json"; 
    } 

    options.pathname = function() { 
     return path; 
    }; 
    options.methodIndex = options.method; 
    options.search = function() { 
     return querystring ? querystring : ""; 
    }; 
    options.region = this.aws.config.region || 'us-east-1'; 

    //AWS uses CAPS for method names, but swagger does not. 
    options.method = options.methodIndex.toUpperCase(); 

    var signer = new this.aws.Signers.V4(options, serviceName); 


    //Actually add the Authorization header here 
    signer.addAuthorization(this.credentialProvider, now); 

    //SwaggerJS/yourbrowser complains if these are still around 
    delete options.search; 
    delete options.pathname; 
    delete options.headers.host; 
    return true; 
    } 
    return false; 
}; 
Verwandte Themen