2016-03-31 15 views
5

Per gli endpoint API AWS viene utilizzata l'autorizzazione AWS_IAM e si desidera effettuare una chiamata dall'interfaccia utente di Swagger. Per effettuare una chiamata riuscita ci devono essere 2 'Autorizzazione' intestazioni e 'x-amz-data'. Per formare 'Autorizzazione' usiamo following steps from aws doc. Dobbiamo cambiare 'x-amz-date' con ogni chiamata per passare attraverso l'autorizzazione. La domanda è: come scrivere script in Swagger per firmare la richiesta, che viene eseguita ogni volta prima della richiesta invia a aws? (Sappiamo come specificare entrambe le intestazioni una volta prima di caricare la pagina di Swagger, ma questo processo dovrebbe essere ripetuto prima di ogni chiamata).Come calcolare la firma V4 AWS in Swagger prima della richiesta

Grazie in anticipo.

+0

Stiamo usando gateway API così come Swagger per definire le API e sono stati anche cercando di capire come sia generare l'SDK JS con spavalderia-Codegen (sembra che la console Gateway dell'API abbia una funzionalità o un modello personalizzato che include il codice sigv4 nel codice dei modelli) e quindi incorpora quella salsa sigv4 extra nel codice JS di swagger doc, cioè: nel caso di switch "AAAClient.js'" applyAuthToRequest' . –

+0

Suppongo che lo strumento swagger per la generazione di documenti funzioni in modo simile a swegger codegen che abilita modelli aggiuntivi (ad esempio: baffi) per personalizzare l'output con markup, script e così via diversi? –

+0

indovinare un'opzione potrebbe essere la forchetta 'swagger-ui' (https://github.com/swagger-api/swagger-ui) e includere la stessa magia sigv4 lì? –

risposta

3

C'è un supporto integrato in swagger-js per aggiungere requestInterceptor s per fare proprio questo. Il progetto swagger-ui usa swagger-js sotto il cofano.

È sufficiente creare una richiesta di intercettazione, come ad esempio:

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

e applicarlo alla propria istanza spavalderia sulla creazione:

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

Qui è possibile impostare le intestazioni nell'oggetto request (nota, questo è non lo standard javascript http request object, ispezionarlo per i dettagli). Ma puoi accedere a tutte le intestazioni qui, in modo da poterle calcolare e iniettarle se necessario.

0

È possibile eseguire facilmente la registrazione monkeypatch dall'SDK AWS in SwaggerJS (e quindi SwaggerUI). Vedi here

Ho un SwaggerUI leggermente modificato here. Con alcune credenziali AWS e un ID API, verrà abbassata la definizione Swagger, visualizzata in SwaggerUI e quindi sarà possibile chiamare l'API utilizzando sigv4.

L'implementazione Authorizer assomiglia a questo:

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; 
};