desenvolver serviços em Java, incluindo APIs de descanso, nem sempre foi fácil ou produtivo até que a primavera chegou e mudou a paisagem. Passaram-se muitos anos desde então, e surgiram novos quadros na comunidade.um destes quadros foi o Micronaut. É desenvolvido pela OCI, a mesma empresa por trás dos Grais, e seu objetivo é ajudar os desenvolvedores a criar micro-serviços e aplicações sem servidores.
Há também Quarkus, outro framework que ganhou popularidade no último ano. Desenvolvido pela RedHat, o Quarkus promete entregar o arranque rápido e menos uso de memória, dois problemas comuns ao desenvolver serviços de descanso em Java.
Com todas estas escolhas, há uma pergunta muito importante a fazer: como é fácil criar um serviço com cada um destes três frameworks?
neste tutorial, você vai criar uma aplicação de repouso seguro usando Spring, Micronaut e Quarkus para ver como eles diferem um do outro, e qual melhor se adequa às suas necessidades.
Índice
- pré-Requisitos para o Seu Java API REST
- Criar um Octa Conta para o Gerenciamento de Usuário
- Gerar Tokens Usando OpenID Ligar o Depurador
- Criar um Java API REST com Micronaut
- Desenvolver o Seu Serviço Java
- Criar um Java API REST com Quarkus
- Criar um Java API REST com Spring Arranque
- Pensamentos Finais sobre APIs REST Com Java: Micronaut, Quarkus, e a Primavera de Arranque
Se você quiser, você pode assistir a este tutorial de como um screencast. 👇
- pré-requisitos para a sua API Java REST
- crie uma conta Okta para a gestão de utilizadores
- gerar fichas usando o depurador OpenID Connect
- construa uma API Java REST com Micronaut
- desenvolva o seu serviço Java
- crie uma API de repouso Java com Quarkus
- crie uma API de repouso Java com arranque de Primavera
- Final Thoughts on REST APIs With Java: Micronaut, Quarkus, and Spring Boot
pré-requisitos para a sua API Java REST
este tutorial usa Maven 3+. Certifique-se de que está instalado e disponível para usar antes de continuar. Você certamente também pode usar Gradle, mas MMMV.
Você vai construir aplicativos que autenticam pedidos usando OAuth 2.0, garantido por uma aplicação Okta. Não tens uma conta da Okta? Não te preocupes, demora menos de um minuto a criar um novo. Não só isso, mas Okta suporta padrões como JWT, OAuth 2.0, e OIDC. Nós fornecemos suporte para frameworks bem conhecidos como Java EE, Spring Boot, e Spring Security. Heck, nós até temos um plugin Maven que automatiza tudo para você.não há necessidade de reinventar a roda!
crie uma conta Okta para a gestão de utilizadores
abra o seu terminal e execute o seguinte comando:
mvn com.okta:okta-maven-plugin:register
ser-lhe-á pedido para introduzir a seguinte informação:
- primeiro nome
- último nome
- empresa
Depois de responder às perguntas, receberá um e-mail para activar a sua nova conta. Depois de activar a sua conta, execute o seguinte comando:
mvn com.okta:okta-maven-plugin:spring-boot
Este comando cria uma aplicação para si com o fluxo de código auth e o redireccionamento URI da segurança da mola para o Okta.
To remember it better, you can create the same app manually:
- vá para a página inicial do programador do Okta e faça login para a sua conta.
- Clique em Aplicações > Adicionar Aplicativo > Web > Avançar.
verá o seguinte ecrã:
antes de continuar, faça as seguintes alterações na aplicação:
- :
http://localhost:8080/login/oauth2/code/okta
https://oidcdebugger.com/debug
- tipo de Subsídio permitido
- Código de Autorização
- Implícito (Híbrido)
O implícito tipo de bolsa (com o ID e o Token de Acesso permitido verificado) é necessário para obter um token de acesso em seu navegador.
os campos não mencionados acima podem manter os seus valores predefinidos.
Depois de terminar, clique em Pronto. A sua aplicação está pronta!
O próximo passo é aprender a gerar um token válido usando-o.
gerar fichas usando o depurador OpenID Connect
Okta permite-lhe gerir os seus utilizadores na nuvem usando a sua APIs. Ele também permite que você proteja suas aplicações usando OAuth 2.0 e OpenID Connect (também conhecido como OIDC). O OAuth 2.0 fornece um mecanismo para a autorização delegada, o que significa que você não tem que armazenar credenciais de usuário em sua aplicação. Em vez disso, você pode delegar isso a um provedor OAuth 2.0 (Okta, neste caso). OIDC fornece uma camada de identidade em cima do OAuth 2.0 e é por isso que empresas como o Okta são chamadas de “provedores de identidade”, ou IdPs.
você registrou seu aplicativo com Okta e agora pode gerar um token para ter acesso a ele. Um dos URIs de redirecionamento de login que você registrou é para o site do OpenID Connect.
seus pedidos serão validados usando um token. Para gerar este item, irá usar o Depurador de ligação OpenID. Este site irá fornecer – lhe uma maneira fácil de gerar credenciais para os usuários em sua aplicação Okta.
Go to the https://oidcdebugger.com and fill in the following information:
- autorize URI:
https://{yourOktaDomain}/oauth2/default/v1/authorize
- Redirect URI:
https://oidcdebugger.com/debug
- IDENTIFICAÇÃO do Cliente:
{yourOktaClientId}
- Escopo:
openid email profile
- Estado:
dev
- Nonce: (mantenha o valor padrão)
- tipo de Resposta:
token
Você pode encontrar o valor de {yourOktaDomain}
no canto superior direito da sua conta da página inicial:
Para encontrar o seu Octa IDENTIFICAÇÃO de Cliente, siga os passos abaixo:
- Ir para Aplicações
- Seleccione o Meu Web App
- Clique em Geral
O ID do Cliente estará disponível na Credenciais do Cliente secção:
Depois de completar todos os campos, clique em Enviar o Pedido. Você será redirecionado para a sua página de login Okta.
Depois de ter autenticado com sucesso, será redireccionado para o depurador OIDC de novo, onde poderá ver o item gerado:
irá usar este token para aceder de forma segura aos serviços que irá construir.
Agora que você tem uma conta Okta e você sabe como gerar tokens usando sua aplicação Okta, vamos começar a comparar os frameworks!
construa uma API Java REST com Micronaut
o primeiro passo para o desenvolvimento do seu serviço Micronaut é baixar SDKMAN!. SDKMAN! é uma ferramenta para gerenciar versões paralelas de vários SDKs, que você vai usar para instalar o cliente Micronaut.
pode transferir o SDKMAN! executando o seguinte comando:
curl -s https://get.sdkman.io | bash
agora, pode instalar o Micronaut em si. Basta executar o seguinte comando no terminal:
sdk install micronaut
após o comando terminar a execução, terá a última versão do Micronaut disponível no seu computador.você está pronto para começar a desenvolver a aplicação!
desenvolva o seu serviço Java
vá para a pasta onde deseja criar a sua aplicação e execute o seguinte comando:
mn create-app com.okta.rest.app --build maven
Este comando irá criar um projeto com a estrutura básica de um Micronaut projeto. Micronaut usa Gradle por padrão, mas como você está usando --build maven
, ele vai usar Maven em vez disso.
O próximo passo é adicionar as bibliotecas de segurança dentro do projeto. Editar o pom.xml
arquivo e adicione as seguintes dependências:
<dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security</artifactId></dependency><dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security-jwt</artifactId></dependency>
Estas dependências irá ativar a segurança, especificamente OAuth 2.0 com JWT – dentro de seu projeto. Agora que você tem todas as dependências no lugar, você pode começar a criar o seu endpoint.
Crie a seguinte classe de src/main/java/com/okta/rest/controller
:
package com.okta.rest.controller;import io.micronaut.http.MediaType;import io.micronaut.http.annotation.Controller;import io.micronaut.http.annotation.Get;import io.micronaut.http.annotation.Produces;import io.micronaut.security.annotation.Secured;import io.micronaut.security.rules.SecurityRule;import java.security.Principal;@Controller("/hello")public class HelloController { @Get @Secured(SecurityRule.IS_AUTHENTICATED) @Produces(MediaType.TEXT_PLAIN) public String hello(Principal principal) { return "Hello, " + principal.getName() + "!"; }}
@Controller
anotação indica a Micronaut que este componente irá receber pedidos de /hello
caminho.
A classe tem apenas um método, chamado hello()
. The @Get
annotation shows that the method will receive HTTP GET requests. Você precisa de @Produces
porque o tipo de retorno padrão do Micronaut é um objeto JSON. Uma vez que você está retornando texto simples, você precisa definir explicitamente esta informação no método.
A última anotação é @Secured
. Ele simplesmente diz ao Micronaut que este método só é acessível aos usuários autenticados.
Você agora tem um controlador que está seguro, mas você ainda não definiu a configuração de segurança. Vamos configurar o Micronaut para se conectar à sua aplicação Okta.
Mudar o nome src/main/resources/application.yml
application.properties
e adicione a seguinte configuração de segurança:
micronaut.security.enabled=truemicronaut.security.token.jwt.enabled=truemicronaut.security.token.jwt.signatures.jwks.okta.url=https://{yourOktaDomain}/oauth2/default/v1/keys
Substituir {yourOktaDomain}
com o valor do seu Octa conta.
a configuração acima activa a segurança usando OAuth 2.0. Você declara que o seu cliente OAuth 2.0 vem da Okta, especificando o emissor da sua organização Okta.
também está a permitir o uso de fichas web JSON, ou JWTs. Uma vez que você quer ler a informação do Okta, você deve declarar onde você pode encontrar o seu JWKS (conjunto de chaves Web JSON) para validar as assinaturas JWT.está na hora de testar o seu serviço! Iniciar o aplicativo executando o seguinte comando:
./mvnw mn:run
Com o aplicativo em execução, execute o seguinte comando:
curl -X GET -I http://localhost:8080/hello
O comando acima irá produzir um resultado semelhante a este:
HTTP/1.1 401 UnauthorizedDate: Tue, 8 Jan 2019 15:47:36 GMTtransfer-encoding: chunkedconnection: close
Como você pode ver, o pedido de não passar. Para fazê-lo funcionar, você precisa passar no token de acesso OAuth 2.0 obtido pelo depurador OIDC. Atribuir o item de acesso a uma variável
na sua linha de comandos.
TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...
Execute o comando abaixo:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
Agora funciona conforme o esperado! Desta vez está a receber a mensagem de saudação como resposta:
Hello, [email protected]!
pode ver que o Micronaut necessita de muito pouco código para criar uma API de repouso segura. Se você contasse as linhas de código, você descobriria que ~24% são dependências em XML (8 linhas), o código Java é apenas 22 linhas de código, e a configuração de segurança leva 3 linhas. O suporte embutido de OAuth 2.0 do Micronaut torna mais fácil a integração com a Okta e eles até têm um guia para a Okta em sua documentação.óptimo! Agora vamos ver como você cria o mesmo aplicativo usando Quarkus.
crie uma API de repouso Java com Quarkus
para desenvolver a sua aplicação usando o Quarkus, só precisa do Maven instalado, não existem outras dependências necessárias.vamos começar a criar a sua aplicação! Vá à pasta onde a deseja criar e execute o seguinte comando:
mvn io.quarkus:quarkus-maven-plugin:1.8.1.Final:create \ -DprojectGroupId=com.okta.rest \ -DprojectArtifactId=quarkus \ -DclassName="com.okta.rest.quarkus.HelloResource" \ -Dpath="/hello" \ -Dextensions="jwt"
o comando acima cria um projecto com o ‘plugin’ de Quarkus Maven. Ele irá criar um recurso chamado HelloResource
, que vai receber pedidos no caminho /hello
. Você também está adicionando a extensão JWT de Quarkus no projeto.
Depois de criar o projecto, edite src/java/com/okta/rest/quarkus/HelloResource.java
e adicione informação do utilizador ao método hello()
:
package com.okta.rest.quarkus;import io.quarkus.security.Authenticated;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.Context;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.SecurityContext;import java.security.Principal;@Path("/hello")public class HelloResource { @GET @Path("/") @Authenticated @Produces(MediaType.TEXT_PLAIN) public String hello(@Context SecurityContext context) { Principal userPrincipal = context.getUserPrincipal(); return "Hello, " + userPrincipal.getName() + "!"; }}
A classe acima irá comportar-se da mesma forma que a que criou no Micronaut. Ele lê a informação do usuário com base no token que foi gerado no pedido e retorna uma mensagem de saudação para o usuário que é encontrado.
ainda não configurou o Quarkus com o seu emissor e chaves do Okta, por isso vamos fazer isso.
Editar src/main/resources/application.properties
e adicione o código a seguir:
mp.jwt.verify.publickey.location=https://{yourOktaDomain}/oauth2/default/v1/keysmp.jwt.verify.issuer=https://{yourOktaDomain}/oauth2/default
Pronto! A versão Quarkus da sua aplicação está pronta para ser testada. Vá para a sua pasta do projecto e execute o seguinte comando:
./mvnw compile quarkus:dev
o comando acima irá iniciar a sua aplicação.
o primeiro passo é certificar-se de que recebe um 401 - Unauthorized
quando não utiliza as credenciais correctas.
Execute o seguinte comando no terminal:
curl -X GET -I http://localhost:8080/hello
Conforme o esperado, o resultado é uma resposta 401 HTTP:
HTTP/1.1 401 Unauthorizedwww-authenticate: Bearer {token}Content-Length: 0
Se executar este mesmo pedido, incluindo o item do depurador OIDC, deverá devolver a mensagem de saudação.
Execute o seguinte comando:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
Ele trabalhou como um encanto! No meu caso, o resultado foi:
Hello, [email protected]!
Quarkus requer ainda menos linhas de código do que Micronaut! Ele gera um aplicativo com dependências incluídas, tem 25 linhas de código Java, e apenas 2 linhas de configuração. Sim, linhas de código é uma comparação tola, mas também mostra como esses frameworks requerem muito pouco código para desenvolver aplicativos seguros.dois já foram, falta um! Agora que você foi capaz de implementar o aplicativo em Micronaut e Quarkus, vamos terminar criando o mesmo aplicativo usando Spring Boot.
crie uma API de repouso Java com arranque de Primavera
arranque de primavera não tem quaisquer pré-requisitos para começar a criar o seu aplicativo, por isso vamos começar por criar o projecto!
abra o seu terminal e execute o seguinte comando:
curl https://start.spring.io/starter.zip -d language=java \ -d bootVersion=2.3.4.RELEASE \ -d dependencies=web,okta \ -d packageName=com.okta.rest \ -d name=spring-boot \ -d type=maven-project \ -o spring-boot.zip
O comando acima irá criar uma spring-boot.zip
ficheiro com uma Mola de Inicialização de aplicativo que usa o Maven. Pode extrair o ficheiro para uma pastaspring-boot
usando o comando abaixo.
unzip spring-boot.zip -d spring-boot
Agora, irá implementar o controlador que irá receber os pedidos.
crie um ID
pacote e umHelloController
classe nele:
package com.okta.rest.controller;import org.springframework.security.core.annotation.AuthenticationPrincipal;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.security.Principal;@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello(@AuthenticationPrincipal Principal principal) { return "Hello, " + principal.getName() + "!"; }}
a configuração aqui é muito semelhante às outras estruturas. Você anota a classe com @RestController
para que Spring saiba que você receberá pedidos na classe. @GetMapping
irá receber pedidos HTTP GET no/hello
path. Para obter o utilizador autenticado, utiliza o @AuthenticationPrincipal
anotação.
diferente dos outros frameworks, você não precisa especificar que este endpoint é autenticado uma vez que a primavera já controla esta informação a partir de suas configurações.
o último passo é adicionar a informação do emitente, para que o Suporte de OIDC do Spring Security possa descobrir automaticamente os parâmetros com os quais precisa de se comunicar.
Editar src/main/resources/applications.properties
e adicione a seguinte configuração:
okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default
Vamos testá-lo! Inicie a sua aplicação de arranque com o Maven.
./mvnw spring-boot:run
em Seguida, abra um terminal e execute o comando abaixo:
curl -X GET -I http://localhost:8080/hello
A resposta é um erro HTTP 401, desde que você não incluem o token:
HTTP/1.1 401Set-Cookie: JSESSIONID=316DCFD55C302A8D69EFD865411DFA77; Path=/; HttpOnlyWWW-Authenticate: BearerX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockCache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: 0X-Frame-Options: DENYContent-Length: 0Date: Thu, 09 Jan 2020 15:46:34 GMT
Teste novamente, agora de passar o token:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
funcionou! Tal como acontece com os outros serviços, o resultado deste comando é o seguinte:
Hello, [email protected]!
Despertadores de mola no mínimo a quantidade de código necessária: 17 linhas de Java e apenas 1 linha de configuração! Spring sempre foi excelente em tornar a vida dos desenvolvedores mais fácil, então isso não é surpresa.é isso! Você implementou uma API básica de descanso Java em todos os três frameworks!
Final Thoughts on REST APIs With Java: Micronaut, Quarkus, and Spring Boot
When it comes to developing your REST API, all three frameworks did the job well. Com apenas um pouco de código e alguma configuração, você foi capaz de desenvolver uma aplicação segura usando Okta e OAuth 2.0.
A Primavera existe há muitos anos, é amplamente popular, e tem muitas características em torno de seu ecossistema. Pessoalmente, eu ainda acredito que é a melhor opção disponível na programação em Java.Micronaut e Quarkus estão crescendo em popularidade e ganhando impulso dentro da comunidade Java. Se você está enfrentando problemas de desempenho, ou talvez se você está ansioso para uma mudança, você pode dar a um deles uma tentativa e ver como corre.
O desempenho é o ponto de comparação mais frequentemente destacado entre estes três quadros. Se você está procurando uma startup rápida em um ambiente sem servidor, ou a capacidade de criar imagens nativas com GraalVM, Micronaut e Quarkus provavelmente funcionará bem para você. Apenas por diversão, os tempos de inicialização para cada uma dessas aplicações são como segue (com base na média de três tentativas):
- Micronaut: 474ms
- Quarkus: 1132ms
- Primavera de Inicialização: 1014ms
eu tenho esses números da execução de cada quadro do Maven metas para o desenvolvimento.
- Micronaut:
./mvnw mn:run
- Quarkus:
./mvnw compile quarkus:dev
- Primavera de Inicialização:
./mvnw spring-boot:run
Esses comandos não são otimizados para a velocidade, então eu embalados cada aplicação com ./mvnw package
e começou-los com java -jar
.
- Micronaut: 596ms
- Quarkus: 658ms
- Primavera de Inicialização: 1878ms
NOTA: Estes números foram calculados em um 2019 MacBook Pro com 2.4 GHz, 8-Core Intel Core i9 CPU e 64 GB de RAM. OpenJDK 15 was used with no JAVA_OPTS
setting.se está à procura de tempos de arranque ainda mais rápidos, pode usar o GraalVM. Ao invés de fazer testes de tempo eu mesmo, eu olhei para a documentação de cada projeto.
- Micronaut: 12ms de acordo com a criação da sua primeira aplicação de grau de Micronaut.
- Quarkus: 14ms according to Quarkus and GraalVM: Booting Hibernate at Supersonic Speed, Subatomic Size on InfoQ. Os documentos do Quarkus não listam uma hora de arranque.Bota De Mola: 44ms de acordo com o nativo de Graal da Primavera 0.6.0 libertado.
no final, você será capaz de desenvolver produtivamente uma aplicação segura, independentemente da escolha que você faça.
deseja dar uma olhada no código fonte? Você pode encontrá-lo no GitHub em okta-java-rest-api-comparison-example.
você deseja saber mais sobre Java, REST APIs e secure applications? Aqui estão alguns outros posts do nosso blog, que você pode achar úteis:
- Assistir GraalVM Ativar O Java Em Binários
- OAuth 2.0 Java Guia: Seguro Seu Aplicativo em 5 Minutos
- Java Microservices com a Primavera de Inicialização e de Primavera Nuvem
- Como Desenvolver um Quarkus Aplicação com Java e OIDC de Autenticação
- Autenticação Simples com Mola de Segurança
Para mais posts como este, siga @oktadev no Twitter. Também publicamos regularmente screencasts em nosso canal do YouTube!
Changelog:
- 23, 2020: actualizado para Micronaut 2.0.2, Quarkus 1.8.1, e arranque de molas 2.3.4. Veja as alterações de código no aplicativo exemplo no GitHub. Mudanças neste post podem ser vistas no oktadeveloper / okta-blog#423.
- 21 de Maio de 2020: tempos de arranque adicionados para
java -jar
e rodando com GraalVM. Mudanças neste artigo podem ser vistas no oktadeveloper / okta-blog # 304. - ay 20, 2020: upgrade to Micronaut 1.3.5, Quarkus 1.4.2, and Spring Boot 2.3.0. Veja as alterações de código no aplicativo exemplo no GitHub. Mudanças neste artigo podem ser vistas no oktadeveloper / okta-blog # 301. 30 de Janeiro de 2020: atualizado para otimizar o Micronaut com base no feedback da equipe do Micronaut. Também recalculou os tempos de arranque com base numa média de três tentativas. Veja as alterações de código no aplicativo exemplo no GitHub. As alterações a este artigo podem ser vistas no oktadeveloper/okta-blog#176.