2016-03-31 4 views
5

Для наших конечных точек API AWS мы используем авторизацию AWS_IAM и хотим позвонить из интерфейса Swagger. Чтобы сделать успешный звонок, должно быть указано «Авторизация» заголовков 2 и «x-amz-date». Чтобы сформировать «Авторизация», мы используем following steps from aws doc. Мы должны изменить «x-amz-date» с каждым звонком, чтобы пройти авторизацию. Вопрос: Как написать скрипт в Swagger для подписывания запроса, который запускается каждый раз до запрос отправить в aws? (Мы знаем, как указывать оба заголовка один раз перед загрузкой страницы Swagger, но этот процесс должен быть повторно запущен перед каждым вызовом).Как рассчитать AWS-подпись V4 в Swagger перед запросом

Заранее спасибо.

+0

Мы используем API шлюза, а также Swagger определить API, а также пытались выяснить, как и генерировать SDK JS с помощью чванство-CodeGen (похоже, что консоль API Gateway имеет функцию или настраиваемый шаблон, который включает код sigv4 в шаблонизированном коде), а затем вставлять этот дополнительный соус sigv4 в JS-код sagv4, т. е. на случай переключения ApiClient.js 'applyAuthToRequest' , –

+0

Я полагаю, что инструмент генерации dag-файлов для чаргов работает аналогично кодеку swagger, который позволяет создавать дополнительные (то есть: усы) шаблоны для настройки вывода с разной разметкой, скриптами и т. Д.? –

+0

Предполагая, что один из вариантов был бы вилкой 'swagger-ui' (https://github.com/swagger-api/swagger-ui) и включать в себя ту же магию sigv4? –

ответ

3

Существует встроенная поддержка в swagger-js, чтобы добавить requestInterceptor s, чтобы сделать именно это. Проект swagger-ui использует swagger-js под капотом.

Просто создайте запрос перехватчик, как например:

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

и применить его к экземпляру развязность по созданию:

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

Здесь вы можете установить заголовки в request объекта (обратите внимание, что это а не стандарт javascript http request object, проверьте его для деталей). Но у вас есть доступ ко всем заголовкам здесь, поэтому вы можете рассчитывать и вводить их по мере необходимости.

0

Вы можете довольно легко подписать monkeypatch из AWS SDK в SwaggerJS (и, следовательно, SwaggerUI). См. here

У меня есть слегка модифицированный SwaggerUI here. Учитывая некоторые учетные данные AWS и идентификатор API, он вытащит определение Swagger, отобразит его в SwaggerUI, а затем вы можете вызвать API с помощью sigv4.

Реализация Authorizer выглядит следующим образом:

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; 
}; 
Смежные вопросы