2016-03-31 11 views
5

Đối với điểm cuối API AWS của chúng tôi, chúng tôi sử dụng ủy quyền AWS_IAM và muốn thực hiện cuộc gọi từ giao diện người dùng Swagger. Để thực hiện cuộc gọi thành công, phải có 2 tiêu đề 'Ủy quyền' và 'x-amz-date'. Để tạo 'Ủy quyền', chúng tôi sử dụng following steps from aws doc. Chúng ta phải thay đổi 'x-amz-date' với mọi cuộc gọi đi qua ủy quyền. Câu hỏi đặt ra là: Làm thế nào để viết kịch bản trong Swagger để ký yêu cầu, chạy mỗi lần trước khi yêu cầu gửi đến aws? (Chúng tôi biết cách chỉ định cả hai tiêu đề một lần trước khi tải trang Swagger, nhưng quá trình này phải được chạy lại trước mỗi cuộc gọi).Cách tính chữ ký AW4 V4 trong Swagger trước khi yêu cầu

Xin cảm ơn trước.

+0

Chúng tôi đang sử dụng API Gateway cũng như Swagger để xác định các API và tôi cũng đã cố gắng để tìm ra cách để cả hai tạo ra SDK JS sử dụng vênh vang-codegen (trông giống như giao diện điều khiển API Gateway có một tính năng hoặc mẫu tùy chỉnh bao gồm mã sigv4 trong mã templated) và sau đó nhúng nước sốt thêm sigv4 vào mã JS của tài liệu swagger, ví dụ: trên trường hợp chuyển đổi 'ApiClient.js'' applyAuthToRequest' . –

+0

Tôi cho rằng công cụ tạo tài liệu vênh vang hoạt động theo cách tương tự để vênh vang codegen cho phép các mẫu bổ sung (tức là: ria mép) để tùy chỉnh đầu ra với các đánh dấu, tập lệnh, v.v. khác nhau? –

+0

đoán một tùy chọn sẽ là ngã ba 'swagger-ui' (https://github.com/swagger-api/swagger-ui) và bao gồm cùng một ma thuật sigv4 ở đó? –

Trả lời

3

Có hỗ trợ tích hợp trong swagger-js để thêm requestInterceptor để thực hiện việc này. Dự án swagger-ui sử dụng các chữ số lồi dưới mui xe.

Đơn giản chỉ cần tạo ra một đánh chặn yêu cầu như ví dụ:

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

và áp dụng nó để dụ vênh vang của bạn trên tạo:

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

Ở đây bạn có thể đặt tiêu đề trong đối tượng request (lưu ý, đây là không phải là đối tượng yêu cầu tiêu chuẩn javascript http, kiểm tra để biết chi tiết). Nhưng bạn có quyền truy cập vào tất cả các tiêu đề ở đây, vì vậy bạn có thể tính toán và tiêm chúng khi cần thiết.

0

Bạn có thể dễ dàng đăng nhập khỉ từ SDK AWS vào SwaggerJS (và do đó SwaggerUI). Xem here

Tôi có một chút thay đổi SwaggerUI here. Với một số thông tin AWS và ID API, nó sẽ kéo xuống định nghĩa Swagger, hiển thị nó trong SwaggerUI, và sau đó bạn có thể gọi API bằng sigv4.

Việc thực hiện ủy quyền trông như thế này:

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; 
}; 
Các vấn đề liên quan