2
respostas

Testar endpoints que precisam de autorização com o SpringDoc

Prezados, alguém pode me dar uma dica de como fazer?

Pegando gancho em outro tópico, fiz o SwaggerConfigurations da seguinte forma:

public class SwaggerConfigurations {

    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder().group("forumApi").pathsToMatch("/**").build();
    }

    @Bean
    public OpenAPI forumAluraOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("Forum API").description("Projeto de Documentacao de API da Alura")
                        .version("v0.0.1").license(new License().name("Apache 2.0").url("http://springdoc.org")))
                .components(new Components()
                        .addSecuritySchemes("bearer-key", 
                                new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").in(SecurityScheme.In.HEADER).bearerFormat("JWT")))
                .externalDocs(new ExternalDocumentation()
                        .description("SpringShop Wiki Documentation")
                        .url("https://springshop.wiki.github.org/docs"));


    }

}

Mas ainda não tenho como enviar o token de autenticação na minha requisição quando tento testar o endpoint de remoção.

Na documentação do SpringDoc (https://springdoc.org/#how-do-i-add-authorization-header-in-requests), tem a sugestão de adicionar @SecurityRequirement na aplicação (creio que seja na classe principal/main), mas não funcionou da forma descrita.

Sugere adicionar da seguinte forma: @Operation(security = { @SecurityRequirement(name = "bearer-key") })

Mas só consegui dessa forma: @RouterOperation(operation = @Operation(security = @SecurityRequirement(name = "bearer-key")))

2 respostas

Oi,

Pra configurar o token no Spring Doc precisa dessa configuração:

@Bean
public OpenAPI forumAluraOpenAPI() {
    return new OpenAPI()
        .info(new Info().title("Forum API")
        .description("API do Forum da Alura")
        .version("1.0")
        .license(new License().name("Apache 2.0").url("http://forum.alura.com.br")))
        .externalDocs(new ExternalDocumentation()
        .description("Forum API DOCS")
        .url("https://forum.alura.com.br"))
        .components(new Components()
          .addSecuritySchemes("bearer-key",
          new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").in(SecurityScheme.In.HEADER).bearerFormat("JWT")));
}

E no método do controller:

@Transactional
@DeleteMapping("/{id}")
@CacheEvict(value = "listaDeTopicos", allEntries = true)
@SecurityRequirement(name = "bearer-key")
public ResponseEntity<?> deletar(@PathVariable Long id) {
    Optional<Topico> optional = topicoRepository.findById(id);
    if(optional.isPresent()) {
        topicoRepository.deleteById(id);
        return ResponseEntity.ok().build();
    }
    return ResponseEntity.notFound().build();
}

Não funcionou, Rodrigo. Ainda não aparece pra mim um campo pra colocar esse parâmetro do token. Eu dei seguimento nesse curso e assim que eu puder dar uma revisada vou tentar dedicar um tempo pra resolver esse aqui. Posso ter esquecido de fazer alguma coisa antes. Obrigado