2016-03-31 11 views
5

AWS APIエンドポイントについては、AWS_IAM認証を使用しており、Swagger UIから電話をかけたいと考えています。呼び出しが成功2つのヘッダーの「認証」と「X-AMZ-日」が存在しなければならないようにするに 。 「認証」を作成するには、following steps from aws docを使用します。 我々は、認可を通過するすべての呼び出しで「はX-AMZ-日付」を変更するために必要があります。 質問は:の前に毎回実行されるリクエストに署名するためにSwaggerでスクリプトを書く方法リクエストはawsに送信されますか? (Swaggerページを読み込む前に両方のヘッダーを一度に指定する方法はわかっていますが、コールの前にこのプロセスをに再実行する必要があります)。リクエスト前にSwaggerでAWSシグネチャV4を計算する方法

ありがとうございます。

+0

私たちは、APIを定義するためにAPIゲートウェイと同様に闊歩を使用していても威張っ-コード生成を使用してJS SDKを生成するために、両方の方法を把握しようとしています(APIゲートウェイのコンソールには、テンプレート付きコードにsigv4コードを含むカスタムテンプレートやテンプレートがあります)、そのsigv4追加ソースをSwagger docsのJSコードに埋め込みます: 'ApiClient.js' on' applyAuthToRequest' switch case 。 –

+0

私は、swagger doc生成ツールは、別のマークアップ、スクリプトなどで出力をカスタマイズするために追加の(つまり:口ひげ)テンプレートを有効にするswagger codegenと同様の方法で動作すると思いますか?一つの選択肢を推測 –

+0

は '威張っ-ui'(https://github.com/swagger-api/swagger-ui)をフォークし、そこに同じsigv4の魔法を含めることでしょうか? –

答えて

3

swagger-jsにはビルトインサポートがあり、これを行うにはrequestInterceptorを追加します。 swagger-uiプロジェクトは、ボンネットの下でswagger-jを使用します。

単純なよう要求インターセプタ作成:あなたは、これがあるrequestオブジェクト(ノートでヘッダーを設定することができます。ここ

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

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

や作成上のご闊歩インスタンスに適用しますない標準 JavaScriptのHTTPリクエストオブジェクト、詳細のためにそれを点検)。しかし、ここではすべてのヘッダーにアクセスできるので、必要に応じて計算して注入することができます。

0

AWS SDKからSwaggerJS(したがってSwaggerUI)に簡単に署名することができます。 here

私はわずかに変更されたSwaggerUI hereを持っています。いくつかのAWSの資格情報とAPIのIDが与えられ、それは、闊歩定義をプルダウンしますSwaggerUIでそれを表示し、あなたはsigv4を使用してAPIを呼び出すことができます。

オーソの実装は次のようになります。

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; 
}; 
関連する問題