Как интегрировать OAuth с Swagger Codegen

#java #api #swagger #swagger-codegen

#java #API #swagger #swagger-codegen

Вопрос:

Я использую веб-сайт Swagger Generator для генерации кода для API на Java. Спецификации API являются общедоступными и доступны здесь . Как вы можете видеть, похоже, что в JSON нет никакой конфигурации аутентификации, но API фактически использует аутентификацию OAuth с использованием «Microsoft Identity Platform» в качестве полномочий и использует идентификатор приложения и секрет для получения JWT. Я могу получить токен в Java, используя внешние библиотеки, но я хотел бы максимально интегрировать процесс в Swagger.

Импортируя в генератор предыдущий JSON, очевидно, что авторизация не настроена, и все вызовы API завершаются с ошибкой. Я изменил JSON и добавил эти параметры:

   "securityDefinition":{
      "civnext_oauth":{
         "type":"oauth2",
         "authorizationUrl":"https://login.microsoftonline.com/............./oauth2/token",
         "flow":"application",
         "scopes":{
            "write:protocollo":"Modify Protocolli",
            "read:protocollo":"Read Protocolli"
         }
      }
   },
 

И затем для каждого пути, который я добавил

        "security":{
           "civnext_oauth":[
              "write:protocollo",
              "read:protocollo"
           ]
        },
 

Я сгенерировал все файлы и правильно импортировал их в свой проект, но мне все еще не удалось протестировать аутентифицированный вызов API.
В частности:

Я не знаю, верны ли мои изменения в JSON и правильна ли это процедура. Я что-то упустил? Я делаю что-то не так? Я не знаю правильного способа обработки вызовов аутентификации и API в Java после генерации кода. Прямо сейчас я делаю так:

 String authority = "https://login.microsoftonline.com/............./oauth2/token";
ExecutorService service = Executors.newFixedThreadPool(1);
AuthenticationContext context = new AuthenticationContext(authority, true, service);
        
Future<AuthenticationResult> future = context.acquireToken(
  "api_resource_path", 
  new ClientCredential(
    "app_id", 
    "secret"), 
  null);
        
AuthenticationResult result = future.get(); 
    
OAuth authentication = new OAuth();
authentication.setAccessToken(result.getAccessToken());
        
ApiClient apiClient = new ApiClient();      
apiClient.getAuthentications().put("oauth2", authentication);
apiClient.setBasePath("basepath");
apiClient.setAccessToken(result.getAccessToken());
        
ProtocolloApi api = new ProtocolloApi();
api.setApiClient(apiClient);
Call call = api.protocolloGetTipoPostaCall("1.0", null, null);
Response response = call.execute();
System.out.println(response.toString());
 

Но поскольку мне не хватает опыта и документации, это просто импровизация.
Можете ли вы мне помочь?

С наилучшими пожеланиями, Джаммарко

Комментарии:

1. Генератор OpenAPI (ответвление сообщества Swagger Codegen), похоже, имеет лучшую поддержку OAuth в клиенте Java (jersey2). Возможно, вы захотите попробовать, чтобы убедиться, что он лучше соответствует вашим требованиям.