2016-09-27 5 views
10

私は現在、私のjersey2 restサービスで遊んでいます。与えられたサービス(記述、型式など)のより良い概観のために、私はswagger(swagger-jersey2-jaxrs)を大量に使用します。 私はサービス記述(swagger.json)を生成することができました。私はswagger UIを使ってそれらを表示して調べることができます。Swagger Codegen CLI Javaクライアント - 使用方法右

私はこれらのサービスを利用するためにクライアントを作成する必要があります。私はあなたのクライアントと多くの異なる言語(私の場合はjava)を生成する素晴らしいツールであるaccrooss swagger codegen cliに来ました。私は使用中のAPIクライアントとモデルを生成することができます。

ここで私は最初の問題に遭遇しました。 RESTサービスとswaggerの記述は、http basic auth protectedです。私はdocumentationを読んで、基本的な認証を使う可能性があるというヒントをくれました。この時点では、私の視点からは、分娩は非常に貧弱であることに言及しなければならない。それは言う:

-a、--auth は、スガーガー定義をリモートでフェッチするときに承認ヘッダーを追加します。 URLでエンコードされたname:ヘッダの文字列を、複数の値を区切るコンマで渡します。

まず、httpヘッダーのような文字列を渡すことですが、うまくいきませんし、swagger cliで基本認証を使用する方法もグーグルでは明確な回答者にはなりませんでした。私は(CLI 2.1.2を使用しています)多くの試行錯誤の後、私は最終的に適切なフォーマットに達しました。例:

java -jar swagger-codegen-cli-2.1.2.jar generate -a " YWRtaW46YWRtaW4 = "-i http://localhost:8080/webproject/restapi/swagger.json -l java -o restclient

ここで、YWRtaW46YWRtaW4 =は、私の場合、admin:adminのbase64でエンコードされた値です。

これまでのところとても良いです。生成されたJavaクライアントは、基本認証も使用する必要があります。私はApiClientのメソッドを見て、setUsernameとsetPasswordを見つけました。私は、この方法は基本的な認証を使用するクライアントを育てるが、運がないと思った。

私は、生成されたクラス、特にApiClientといくつかの生成されたApiServiceクラスについて詳しく調べました。 私はsetUsernameとするsetPasswordが原因で以下の効果がないことが判明:同時にHashMapのは、以下のように定義される

/** 
    * Helper method to set username for the first HTTP basic authentication. 
    */ 
    public void setUsername(String username) { 
    for (Authentication auth : authentications.values()) { 
     if (auth instanceof HttpBasicAuth) { 
     ((HttpBasicAuth) auth).setUsername(username); 
     return; 
     } 
    } 
    throw new RuntimeException("No HTTP basic authentication configured!"); 
    } 

// Setup authentications (key: authentication name, value: authentication). 
authentications = new HashMap<String, Authentication>(); 
// Prevent the authentications from being modified. 
authentications = Collections.unmodifiableMap(authentications); 

認証ハッシュマップは不変となり、しかし、なぜ?何をしているのですか?

1)ラインはCollections.unmodifiableMap(認証)を認証ので、ハ​​ッシュマップは再び

2変更可能になりコメントアウト):さらに、私はfollwingなかったので、必要な認証オブジェクトを生成ApiClinet内部には、ヘルパー・メソッドはありません必要な認証オブジェクトてmanualy

HttpBasicAuth authentication = new HttpBasicAuth(); 
authentication.setUsername("admin"); 
authentication.setPassword("admin"); 

3を作成する)apiClients認証ハッシュマップに認証オブジェクトを追加します。

ApiClient apiClient = new ApiClient(); 
apiClient.setBasePath(basePath); 
apiClient.getAuthentications().put("basic", authentication); 

4)invokeApiメソッドを変更する(ApiClient。ApiServicesは、以下のようなapiClientメソッドを呼び出すためのJava)

public String invokeAPI(String path, String method, Map<String, String> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String accept, String contentType, String[] authNames) throws ApiException { 
String authNames2[] = {"basic"}; 
updateParamsForAuth(authNames2, queryParams, headerParams); 
//updateParamsForAuth(authNames, queryParams, headerParams); 
... 

ステップ4は必要である:

String[] authNames = new String[] { }; 
String response = apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames); 

他の可能な解決策は、すべてapiServiceのように認証のハッシュマップAUFキーを定義することであろう。

String[] authNames = new String[] { "basic" }; 

期待が、私は、これは自動生成された残りのクライアントの背後にある考え方であることを考えるカントとしてすべての作品のすべての変更を行った後。 私の質問は:私はいくつかのポイントが不足しているか、私は開発中のベータ版ソリューションのより多くのクライアント(この場合はjava)を生成したスワッガーを考える必要がありますか? 私は正しいと思いますが、私は全体的なフレームワーク(jersey2サポート、openapi、swaggerui、codegen)は素晴らしいことだと思います。開発者の努力に感謝しますが、私はcodegenを正しく使用したいと思います。このようにして生成されたApiClientとApiServicesをカスタマイズする必要があります。

答えて

8

問題は、使用するセキュリティの種類(a.k.a.セキュリティ定義)、またはどのセキュリティ定義がどのエンドポイントに適用されるかについての仕様には言及していません。

スウェーガー仕様はhereですが、全体的な話は分かりません。

あなたがする必要があるのは、1.セキュリティ定義を設定します。ここに、単純な基本的なHTTP認証定義があります。

securityDefinitions: 
    basic: 
    type: basic 
    description: HTTP Basic Authentication. 

2.このセキュリティ定義をエンドポイントで使用します。

paths: 
    /: 
    get: 
     security: 
     - basic: [] 
     responses: 
     200: 
      description: OK 

次に、お客様のスガーガークライアントコードを再生成してください。不変マップを正しく設定し、authNames配列を設定する必要があります。

関連する問題