-
-
Notifications
You must be signed in to change notification settings - Fork 7.3k
Description
Bug Report Checklist
- Have you provided a full/minimal spec to reproduce the issue?
- Have you validated the input using an OpenAPI validator (example)?
- Have you tested with the latest master to confirm the issue still exists?
- Have you searched for related issues/PRs?
- What's the actual output vs expected output?
- [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description
I would like to give to the users of our API the possibility to choose among different types of authentication mechanisms; however, if I define APIKeyQuery and APIKeyHeader simultaneously within one security section and use scala-sttp generator, the generated code will create a method with two identical parameters
def entitiesGet(apiKey: String, apiKey: String)(
): Request[Either[ResponseException[String, Exception], String], Any] =
basicRequest
.method(Method.GET, uri"$baseUrl/entities/")
.contentType("application/json")
.header("X-Api-Key", apiKey)
.response(asJson[String])which will cause compilation errors:
[error] [E1] openapi/src/main/scala/org/openapitools/client/api/DefaultApi.scala
[error] apiKey is already defined as value apiKey
[error] L34: def entitiesGet(apiKey: String, apiKey: String)(
[error] ^
[error] [E2] openapi/src/main/scala/org/openapitools/client/api/DefaultApi.scala
[error] ambiguous reference to overloaded definition,
[error] both value apiKey of type String
[error] and value apiKey of type String
[error] match expected type ?
[error] L39: .header("X-Api-Key", apiKey)
[error] ^
Furthermore, as you may have noticed, there's no logic to assign the two apiKey parameters as header and query param.
As a counter example, I tried using the java generator, and the code
- does compile
- recognizes the presence of two auth methods and sets them up properly
public ApiClient() {
init();
initHttpClient();
// Setup authentications (key: authentication name, value: authentication).
authentications.put("APIKeyHeader", new ApiKeyAuth("header", "X-Api-Key"));
authentications.put("APIKeyQuery", new ApiKeyAuth("query", "api_key"));
// Prevent the authentications from being modified.
authentications = Collections.unmodifiableMap(authentications);
}- forwards the proper auth names from within the public method call
public okhttp3.Call entitiesGetCall(final ApiCallback _callback) throws ApiException {
String basePath = null;
// omitted for brevity
String localVarPath = "/entities/";
// omitted for brevity
String[] localVarAuthNames = new String[] { "APIKeyHeader", "APIKeyQuery" };
return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback);
}openapi-generator version
tested latest openapi-generator from master (but disabled openapi-generator-gradle-plugin because it causes compilation errors on my machine)
OpenAPI declaration file content or url
link to public Gist for openapi.json
Generation Details
java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar generate \
-i testgen/openapi.json \
-c testgen/config.yaml \
-o testgen/out \
-g scala-sttpconfig.yaml :
generatorName: "scala-sttp"
additionalProperties:
jsonLibrary: "circe"Steps to reproduce
git clone https://github.com/OpenAPITools/openapi-generatorcd openapi-generator./mvnw clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true- create a folder
testgen, and save openapi.json from my Gist and config.yaml in there
now you can execute
java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar generate \
-i testgen/openapi.json \
-c testgen/config.yaml \
-o testgen/out \
-g scala-sttpRelated issues/PRs
Suggest a fix
Similar to what happens with the Java counterpart, there should be an Authentication object that represents the authorizations defined in the openapi spec and, when a sttp Request is applied to it, the Authentication object will enrich it with all the auth defined.