vývoj služeb v Javě, včetně REST API, nebyl vždy snadný nebo produktivní, dokud nepřišlo jaro a nezměnilo krajinu. Od té doby uplynulo mnoho let a v komunitě se objevily nové rámce.
jedním z těchto rámců byl Micronaut. Je vyvinut OCI, stejnou společností za Grails, a jejich cílem je pomoci vývojářům vytvářet microservices a serverless aplikací.
existuje také Quarkus, další rámec, který získal popularitu za poslední rok. Vyvinutý společností RedHat, Quarkus slibuje rychlé spuštění a menší využití paměti, dva běžné problémy při vývoji služeb REST v Javě.
se všemi těmito možnostmi je velmi důležitá otázka: jak snadné je vytvořit službu s každým z těchto tří rámců?
V tomto kurzu, budete vytvořit bezpečné ZBYTEK aplikace pomocí Jaře, Micronaut, a Quarkus vidět, jak se liší jeden od druhého, a který z nich nejlépe vyhovuje vašim potřebám.
Obsah
- Předpoklady pro Vaše Java REST API
- Vytvořit Okta Účet pro Správu Uživatelů
- Generovat Tokeny Pomocí OpenID Připojit Ladicí program
- Build Java REST API s Micronaut
- Rozvíjet Vaše Java Služby
- Vybudovat Java REST API s Quarkus
- Build Java REST API s Jarní Boot
- Poslední Myšlenky na REST Api S Javou: Micronaut, Quarkus, a na Jaře Boot
Pokud chcete, můžete sledovat tento návod jako videoukázky. 👇
- předpoklady pro Java REST API
- Vytvořit Okta Účet pro Správu Uživatelů
- generování tokenů pomocí OpenID Connect Debugger
- Vytvořte Java REST API s Micronaut
- Vytvořte službu Java
- Vytvořit Java REST API s Quarkus
- Vytvořte Java REST API s Spring Boot
- Závěrečné myšlenky na REST API s Javou: Micronaut, Quarkus a Spring Boot
předpoklady pro Java REST API
tento tutoriál používá Maven 3+. Před pokračováním se ujistěte, že je nainstalován a je k dispozici k použití. Určitě můžete také použít Gradle, ale YMMV.
budete vytvářet aplikace, které ověřují požadavky pomocí OAuth 2.0, zabezpečené aplikací Okta. Nemáte účet Okta? Nebojte se, vytvoření nového trvá méně než minutu. Nejen to, ale Okta podporuje standardy jako JWT, OAuth 2.0 a OIDC. Poskytujeme podporu pro známé rámce, jako je Java EE, Spring Boot a Spring Security. Sakra, máme dokonce plugin Maven, který automatizuje vše pro vás.
není třeba znovu objevovat kolo!
Vytvořit Okta Účet pro Správu Uživatelů
Otevřít terminál a spusťte následující příkaz:
mvn com.okta:okta-maven-plugin:register
Budete vyzváni k zadání následujících informací:
- jméno
- příjmení
- společnost
jakmile odpovíte na otázky, obdržíte e-mail pro aktivaci zcela nového účtu. Po aktivaci vašeho účtu, spusťte následující příkaz:
mvn com.okta:okta-maven-plugin:spring-boot
Tento příkaz vytvoří aplikaci pro vás s auth code flow a Spring Security přesměrování URI pro Okta.
Chcete-li si to lépe zapamatovat, můžete vytvořit stejnou aplikaci ručně:
- přejděte na domovskou stránku vývojáře Okta a přihlaste se ke svému účtu.
- klikněte na aplikace > přidat aplikaci > Web > další.
zobrazí se následující displej:
Než budete pokračovat, proveďte následující změny v aplikaci:
- Přihlášení přesměrování Uri:
http://localhost:8080/login/oauth2/code/okta
https://oidcdebugger.com/debug
- typ Grantu povoleno
- Autorizační Kód
- Implicitní (Hybridní)
implicitní typ grantu (s ID a Přístupový Token povoleno zaškrtnuto) je nutné získat přístupový token ve vašem prohlížeči.
pole, která nejsou uvedena výše, si mohou ponechat své výchozí hodnoty.
po dokončení klikněte na Hotovo. Vaše aplikace je připravena!
dalším krokem je naučit se generovat platný token pomocí něj.
generování tokenů pomocí OpenID Connect Debugger
Okta umožňuje spravovat své uživatele v cloudu pomocí jeho API. To také umožňuje zabezpečit své aplikace pomocí OAuth 2.0 a OpenID Connect (aka, OIDC). OAuth 2.0 poskytuje mechanismus pro delegovanou autorizaci, což znamená, že nemusíte ukládat přihlašovací údaje uživatele do aplikace. Místo toho to můžete delegovat na poskytovatele OAuth 2.0 (v tomto případě Okta). OIDC poskytuje vrstvu identity nad OAuth 2.0, a proto se společnosti jako Okta nazývají „poskytovatelé identity“ nebo IDP.
svou aplikaci jste zaregistrovali u Okta a nyní můžete vygenerovat token, abyste k ní získali přístup. Jeden z uri přesměrování přihlášení, který jste zaregistrovali, je pro web OpenID Connect.
vaše požadavky budou ověřeny pomocí tokenu. Chcete-li vygenerovat tento token, použijete Debugger OpenID Connect. Tato webová stránka vám poskytne snadný způsob, jak generovat přihlašovací údaje pro uživatele v aplikaci Okta.
Jděte na https://oidcdebugger.com a vyplňte následující informace:
- Povolit URI:
https://{yourOktaDomain}/oauth2/default/v1/authorize
- Přesměrování URI:
https://oidcdebugger.com/debug
- Klient ID:
{yourOktaClientId}
- Rozsah:
openid email profile
- Stát:
dev
- Nonce: (ponecháme výchozí hodnotu)
- Reakce typu:
token
můžete najít hodnotu pro {yourOktaDomain}
v pravém horním rohu vašeho účtu stránky:
najít Okta ID Klienta postupujte podle následujících kroků:
- Aplikace
- Zvolte možnost Mé Webové Aplikace
- Klepněte na položku Obecné
ID Klienta bude k dispozici v Klientovi Pověření sekce:
Po dokončení všech polí, klepněte na tlačítko Odeslat Žádost. Budete přesměrováni na svou přihlašovací stránku Okta.
po úspěšné autentizaci budete znovu přesměrováni na Oidc Debugger, kde můžete vidět vygenerovaný token:
tento token použijete k bezpečnému přístupu ke službám, které chcete vytvořit.
Nyní, když máte účet Okta a víte, jak generovat tokeny pomocí aplikace Okta, začněme porovnávat rámce!
Vytvořte Java REST API s Micronaut
prvním krokem k rozvoji služby Micronaut je stažení SDKMAN!. SDKMANE! je nástroj pro správu paralelních verzí více SDK, které budete používat k instalaci klienta Micronaut.
zde si můžete stáhnout SDKMAN! spuštěním následujícího příkazu:
curl -s https://get.sdkman.io | bash
Nyní můžete nainstalovat Micronaut sám. Stačí spustit následující příkaz v terminálu:
sdk install micronaut
Po příkazu dokončí provádění, budete mít nejnovější Micronaut verze je k dispozici na vašem počítači.
jste připraveni začít vyvíjet aplikaci!
Vytvořte službu Java
přejděte do adresáře, ve kterém chcete vytvořit aplikaci, a proveďte následující příkaz:
mn create-app com.okta.rest.app --build maven
Tento příkaz vytvoří projekt s základní struktura Micronaut projektu. Micronaut používá Gradle ve výchozím nastavení, ale protože používáte --build maven
, použije místo toho Maven.
dalším krokem je přidání bezpečnostních knihoven uvnitř projektu. Upravit pom.xml
soubor a přidejte následující závislosti:
<dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security</artifactId></dependency><dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security-jwt</artifactId></dependency>
Tyto závislosti umožní zabezpečení – konkrétně OAuth 2.0 s JWT – uvnitř vašeho projektu. Nyní, když máte všechny závislosti na místě, můžete začít vytvářet koncový bod.
Vytvořte následující třídy v 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
anotace naznačuje, Micronaut, že tato složka bude přijímat žádosti v /hello
cestu.
třída má pouze jednu metodu s názvem hello()
@Get
anotace ukazuje, že metoda obdrží požadavky HTTP GET. Potřebujete @Produces
protože výchozí typ návratu Micronautu je objekt JSON. Protože vracíte jednoduchý text, musíte tyto informace v metodě explicitně definovat.
Poslední anotace je @Secured
. Jednoduše řekne Micronautovi, že tato metoda je přístupná pouze ověřeným uživatelům.
nyní máte řadič, který je zabezpečen, ale ještě jste nedefinovali konfiguraci zabezpečení. Pojďme nakonfigurovat Micronaut pro připojení k aplikaci Okta.
Přejmenovat src/main/resources/application.yml
application.properties
a přidejte následující nastavení zabezpečení:
micronaut.security.enabled=truemicronaut.security.token.jwt.enabled=truemicronaut.security.token.jwt.signatures.jwks.okta.url=https://{yourOktaDomain}/oauth2/default/v1/keys
Nahradit {yourOktaDomain}
s hodnotou z vašeho Okta účet.
výše uvedená konfigurace umožňuje zabezpečení pomocí OAuth 2.0. Prohlašujete, že váš klient OAuth 2.0 pochází z Okta, zadáním emitenta z vaší organizace Okta.
také povolujete používání webových tokenů JSON nebo JWTs. Protože si chcete přečíst informace z Okta, musíte prohlásit, kde najdete své jwks (JSON Web Key Set) pro ověření podpisů JWT.
je čas vyzkoušet své služby! Spusťte aplikaci spuštěním následujícího příkazu:
./mvnw mn:run
S vaše aplikace spuštěna, spusťte následující příkaz:
curl -X GET -I http://localhost:8080/hello
výše uvedený příkaz bude produkovat výsledek podobný tomuto:
HTTP/1.1 401 UnauthorizedDate: Tue, 8 Jan 2019 15:47:36 GMTtransfer-encoding: chunkedconnection: close
Jak můžete vidět, žádost neprošla. Aby to fungovalo, musíte předat přístupový token OAuth 2.0 získaný Debuggerem Oidc. Přiřaďte přístupový token proměnné TOKEN
ve vašem shellu.
TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...
Spustit příkaz níže:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
Teď to funguje, jak se očekávalo! Tentokrát jsi obdrží uvítací zprávu jako odpověď:
Hello, [email protected]!
můžete vidět, že Micronaut vyžaduje velmi málo kódu vytvořit bezpečné rozhraní REST API. Pokud jste počítali řádky kódu, zjistili byste, že ~24% je závislostí v XML (8 řádků), kód Java je pouze 22 řádků kódu a konfigurace zabezpečení trvá 3 řádky. Vestavěná podpora OAuth 2.0 společnosti Micronaut usnadňuje integraci s Okta a dokonce mají ve své dokumentaci průvodce Okta.
skvělé! Nyní se podívejme, jak vytvořit stejnou aplikaci pomocí Quarkus.
Vytvořit Java REST API s Quarkus
rozvíjet své aplikace pomocí Quarkus potřebujete pouze Maven instalaci, nejsou tam žádné jiné závislosti požadované.
začněme vytvářet vaši aplikaci! Přejděte do adresáře, který chcete vytvořit a spustit následující příkaz:
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"
výše uvedený příkaz vytvoří projekt pomocí Quarkus Maven plugin. Vytvoří zdroj s názvem HelloResource
, který bude přijímat požadavky na cestu /hello
. Do projektu také přidáváte rozšíření JWT od společnosti Quarkus.
jakmile vytvoříte projekt, upravte src/java/com/okta/rest/quarkus/HelloResource.java
a přidejte informace o uživateli do metody 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() + "!"; }}
výše uvedená třída se bude chovat stejně jako ta, kterou jste vytvořili v Micronautu. Přečte informace uživatele na základě tokenu, který byl vygenerován v požadavku, a vrátí uvítací zprávu nalezenému uživateli.
stále jste nenakonfigurovali Quarkus se svým emitentem a klíči z Okta, tak to udělejme.
Upravit src/main/resources/application.properties
a přidejte následující kód:
mp.jwt.verify.publickey.location=https://{yourOktaDomain}/oauth2/default/v1/keysmp.jwt.verify.issuer=https://{yourOktaDomain}/oauth2/default
Hotovo! Verze aplikace Quarkus je připravena k testování. Jděte do vaší složky projektu a spusťte následující příkaz:
./mvnw compile quarkus:dev
výše uvedený příkaz spustí vaši aplikaci.
prvním krokem je ujistit se, že obdržíte 401 - Unauthorized
, pokud nepoužíváte správné přihlašovací údaje.
Spustit následující příkaz v terminálu:
curl -X GET -I http://localhost:8080/hello
Jak se očekávalo, výsledek je HTTP 401 odpověď:
HTTP/1.1 401 Unauthorizedwww-authenticate: Bearer {token}Content-Length: 0
Pokud provedete stejný požadavek, včetně tokenu z debuggeru OIDC, měl by vrátit uvítací zprávu.
Spustit následující příkaz:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
fungovalo To jako kouzlo! V mém případě, výsledek byl:
Hello, [email protected]!
Quarkus vyžaduje i méně řádků kódu, než Micronaut! Generuje aplikaci se závislostmi, má 25 řádků kódu Java a pouze 2 řádky konfigurace. Ano, řádky kódu je hloupé srovnání, ale také ukazuje, jak tyto rámce vyžadují velmi málo kódu pro vývoj bezpečných aplikací.
dva dole, jeden zbývá! Nyní, když jste byli schopni implementovat aplikaci na Micronaut a Quarkus, pojďme dokončit vytvořením stejné aplikace pomocí Spring Boot.
Vytvořte Java REST API s Spring Boot
Spring Boot nemá žádné předpoklady pro zahájení vytváření aplikace, takže začněme vytvořením projektu!
otevřete terminál a proveďte následující příkaz:
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
výše uvedený příkaz vytvoří spring-boot.zip
soubor s Spring Boot aplikaci, která používá Maven. Soubor můžete extrahovat do adresáře spring-boot
pomocí níže uvedeného příkazu.
unzip spring-boot.zip -d spring-boot
Nyní, budete provádět správce, který bude přijímat žádosti.
Vytvořte com.okta.rest.controller
balíček a HelloController
třídu v něm:
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() + "!"; }}
konfigurace je zde velmi podobná ostatním rámcům. Třídu anotujete pomocí @RestController
, abyste jarní informovali, že budete dostávat požadavky na třídu. @GetMapping
obdrží HTTP GET požadavky na cestu /hello
. Pro načtení ověřeného uživatele použijte@AuthenticationPrincipal
anotaci.
Na rozdíl od ostatních rámců nemusíte specifikovat, že tento koncový bod je ověřen, protože jaro již řídí tyto informace ze svých konfigurací.
posledním krokem je přidat emitenta informace, tak na Jaře Bezpečnost je OIDC podpora může automaticky objevit koncové body musí komunikovat.
Upravit src/main/resources/applications.properties
a přidejte následující konfigurace:
okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default
Pojďme vyzkoušet! Spusťte aplikaci Spring Boot pomocí Maven.
./mvnw spring-boot:run
Poté, otevřete terminál a spusťte příkaz níže:
curl -X GET -I http://localhost:8080/hello
odpověď HTTP 401 chyba, protože jste neměl obsahovat 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
Test znovu, nyní předává token:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
fungovalo To! Stejně jako u ostatních služeb, je výsledkem tohoto příkazu je následující:
Hello, [email protected]!
Jarní Boot hodiny v nejméně množství kódu potřebné: 17 řádků Java a pouze 1 řádek Konfigurace! Jaro bylo vždy vynikající při usnadňování života vývojářů, takže to není žádným překvapením.
to je ono! Implementovali jste Základní Java REST API ve všech třech rámcích!
Závěrečné myšlenky na REST API s Javou: Micronaut, Quarkus a Spring Boot
Pokud jde o vývoj REST API, všechny tři rámce odvedly práci dobře. S trochou kódu a nějakou konfigurací jste byli schopni vyvinout bezpečnou aplikaci pomocí Okta a OAuth 2.0.
jaro existuje již mnoho let, je velmi populární a má mnoho funkcí kolem svého ekosystému. Osobně se stále domnívám, že je to nejlepší možnost dostupná při programování v Javě.
Micronaut a Quarkus rostou v popularitě a získávají dynamiku uvnitř Java komunity. Pokud se potýkáte s problémy s výkonem, nebo možná, pokud vás pro změnu bolí, můžete zkusit jednoho z nich a zjistit, jak to jde.
výkon je nejčastěji zvýrazněným srovnávacím bodem mezi těmito třemi rámci. Pokud hledáte pro rychlé spuštění v serverless prostředí, nebo schopnost vytvářet nativní snímky s GraalVM, Micronaut a Quarkus bude pravděpodobně fungovat dobře pro vás. Jen tak pro zábavu, startovací časy pro každý z těchto aplikací jsou následující (na základě průměru ze tří pokusů):
- Micronaut: 474ms
- Quarkus: 1132ms
- Jaro Boot: 1014ms
mám tyto čísla od spuštění každý rámec je Maven cíle pro rozvoj.
- Micronaut:
./mvnw mn:run
- Quarkus:
./mvnw compile quarkus:dev
- Spring Boot:
./mvnw spring-boot:run
Tyto příkazy nejsou optimalizované pro rychlost, tak I balené každá aplikace s ./mvnw package
a začal s java -jar
.
- Micronaut: 596ms
- Quarkus: 658ms
- Jaro Boot: 1878ms
POZNÁMKA: Tato čísla byla vypočtena na 2019 MacBook Pro s 2,4 GHz 8-Core Intel Core i9 CPU a 64 GB RAM. OpenJDK 15 byl použit bez nastavení JAVA_OPTS
.
Pokud hledáte ještě rychlejší časy spuštění, můžete použít GraalVM. Spíše než abych sám prováděl časové testy, podíval jsem se na dokumentaci každého projektu.
- Micronaut: 12ms podle vytvoření vaší první aplikace Micronaut Graal.
- Quarkus: 14ms podle Quarkuse a GraalVM: bootování hibernace nadzvukovou rychlostí, subatomární velikost na InfoQ. Dokumenty Quarkus neuvádějí čas spuštění.
- jarní Boot: 44ms podle Spring Graal Native 0.6.0 vydáno.
nakonec budete moci produktivně vyvinout bezpečnou aplikaci bez ohledu na zvolenou volbu.
Chcete se podívat na zdrojový kód? Najdete ji na Githubu na okta-java-rest-api-comparison-example.
Chcete se dozvědět více o Java, REST API a zabezpečených aplikacích? Zde jsou některé další příspěvky z našeho blogu, že byste mohli najít užitečné:
- Sledujte GraalVM Proměňte Svůj Java Do Binární soubory
- OAuth 2.0 Java Guide: Zabezpečte Své Aplikace v 5 Minut
- Java Microservices s Spring Boot a na Jaře Cloud
- Jak Vytvořit Quarkus Aplikace s Java a OIDC Autentizace
- Jednoduché Ověřování s Jarní Zabezpečení
Pro další příspěvky, jako je tento, sledujte @oktadev na Twitteru. Pravidelně také publikujeme screencasty na našem kanálu YouTube!
Changelog:
- 23. Září 2020: upgradováno na Micronaut 2.0.2, Quarkus 1.8.1 a Spring Boot 2.3.4. Podívejte se na změny kódu v ukázkové aplikaci na Githubu. Změny tohoto příspěvku lze zobrazit v oktadeveloper / okta-blog#423.
- 21. Květen 2020: Přidány časy spuštění pro
java -jar
a běží s GraalVM. Změny tohoto článku lze zobrazit v oktadeveloper / okta-blog#304. - 20. Května 2020: Upgrade na Micronaut 1.3.5, Quarkus 1.4.2, a na Jaře Boot 2.3.0. Podívejte se na změny kódu v ukázkové aplikaci na Githubu. Změny tohoto článku lze zobrazit v oktadeveloper / okta-blog#301.
- Jan 30, 2020: Aktualizováno optimalizovat Micronaut na základě zpětné vazby od Micronaut tým. Také znovu vypočtené časy spuštění na základě průměrně tří pokusů. Podívejte se na změny kódu v ukázkové aplikaci na Githubu. Změny tohoto článku si můžete prohlédnout v oktadeveloper / okta-blog#176.