REST Apiを含むJavaでのサービスの開発は、Springが登場して風景を変えるまで、必ずしも簡単で生産的ではありませんでした。 それ以来、何年も経過し、コミュニティに新しい枠組みが登場しました。
これらのフレームワークの一つはMicronautでした。 これは、Grailsの背後にある同じ会社であるOCIによって開発され、彼らの目標は、開発者がマイクロサービスとサーバーレスアプリケーションを作成するのを助
昨年人気を博した別のフレームワークであるQuarkusもあります。 RedHatによって開発されたQuarkusは、高速起動とメモリ使用量の削減を実現することを約束しています。
これらのすべての選択肢では、非常に重要な質問があります:これらの三つのフレームワークのそれぞれでサービスを作成するのはどれほど簡単ですか?このチュートリアルでは、Spring、Micronaut、およびQuarkusを使用して安全なRESTアプリケーションを作成し、それらが互いにどのように異なるか、およびニーズに最も適したも
目次
- Java REST APIの前提条件
- ユーザー管理用のOktaアカウントを作成する
- OpenID Connect Debuggerを使用したトークンの生成
- Micronautを使用したJava REST APIのビルド
- Openid Connect Debuggerを使用したJava Rest APIのビルド
- Quarkusを使用したJava REST APIのビルド
ご希望の場合は、このチュートリアルをスクリーンキャストとして見ることができます。 Java
Java REST APIの前提条件
このチュートリアルでは、Maven3+を使用します。 続行する前に、インストールされており、使用可能であることを確認してくださ あなたは確かにGradleを使うこともできますが、YMMV。Oktaアプリケーションによって保護されたOAuth2.0を使用して要求を認証するアプリを構築します。 Oktaアカウントを持っていませんか? 心配しないで、新しいものを作成するのに1分もかかりません。 それだけでなく、OktaはJWT、OAuth2.0、OIDCなどの標準をサポートしています。 Java EE、Spring Boot、Spring Securityなどの有名なフレームワークのサポートを提供しています。 ヘック、私たちもあなたのためにすべてを自動化するMavenプラグインを持っています。ホイールを再発明する必要はありません!
ユーザー管理のためのOktaアカウントを作成します
ターミナルを開き、次のコマンドを実行します。
mvn com.okta:okta-maven-plugin:register
次の情報を入力するよう:
- 名
- 姓
- メール
- 会社
質問に回答すると、新しいアカウントを有効にするためのメールが届きます。 アカウントをアクティブ化した後、次のコマンドを実行します。
mvn com.okta:okta-maven-plugin:spring-boot
このコマンドは、認証コードフローとSpring SecurityのoktaのリダイレP>
それをよりよく覚えておくために、同じアプリを手動で作成することができます:
- Oktaの開発者ホームページに移動し、アカウントにログインします。
- アプリケーションをクリックします>>Web>次に。
次の画面が表示されます。
続行する前に、アプリケーションで次の変更を行います。
- ログイ:
http://localhost:8080/login/oauth2/code/okta
https://oidcdebugger.com/debug
- 許可タイプ許可
- 承認コード
- 暗黙的な(ハイブリッド)
暗黙的な許可タイプ(IDとアクセストークンブラウザでアクセストークンを取得するには。
上記に記載されていないフィールドは、デフォルト値を維持することができます。完了したら、[完了]をクリックします。
完了したら、[完了]をクリックします。 あなたのアプリは準備ができています!次のステップは、それを使用して有効なトークンを生成する方法を学ぶことです。
OpenID Connect Debuggerを使用してトークンを生成
Oktaでは、Apiを使用してクラウド内のユーザーを管理できます。OpenID Connect Debuggerを使用してトークンを生成する
Oktaを使用 また、OAuth2.0とOpenID Connect(別名、OIDC)を使用してアプリケーションを保護することもできます。 OAuth2.0は、アプリケーションにユーザーの資格情報を保存する必要がないことを意味する委任された承認のメカニズムを提供します。 代わりに、それをOAuth2.0プロバイダ(この場合はOkta)に委任できます。 OIDCはoauth2.0の上にidレイヤーを提供しているため、Oktaのような企業は「idプロバイダー」、またはIdpと呼ばれています。アプリをOktaに登録し、アクセスするためのトークンを生成できるようになりました。
登録したログインリダイレクトUriの1つは、OpenID Connect webサイト用です。
あなたの要求はトークンを使用して検証されます。 このトークンを生成するには、OpenID Connect Debuggerを使用します。 このウェブサイトは、Oktaアプリケーションのユーザーの資格情報を簡単に生成する方法を提供します。/p>
https://oidcdebugger.comに移動し、次の情報を入力します。
- URIを承認します。
https://{yourOktaDomain}/oauth2/default/v1/authorize
- リダイレクトURI:
https://oidcdebugger.com/debug
- クライアントID:
{yourOktaClientId}
- スコープ:
openid email profile
- 状態:
dev
- ノンス:(デフォルト値を維持)
- ノンス:(デフォルト値を維持)
- ノンス:(デフォルト値を維持)
- ノンス:(デフォルト値を維持)
- ノンス:(デフォルト値を維持)
openid email profile
- ノンス:(デフォルト値を維持)
- /li>
- レスポンスタイプ:
token
{yourOktaDomain}
の値は、アカウントのホームページの右上隅にあります。
oktaクライアントidを見つけるには、以下の手順に従ってください:
すべてのフィールドを入力したら、要求の送信をクリックします。 Oktaのログインページにリダイレクトされます。
認証に成功すると、OIDCデバッガーに再びリダイレクトされ、生成されたトークンが表示されます:P>
このトークンを使用して、ビルドするサービスに安全にアクセスします。
Oktaアカウントがあり、Oktaアプリケーションを使用してトークンを生成する方法がわかったので、フレームワークの比較を始めましょう!Micronautサービスを開発するための最初のステップは、SDKMANをダウンロードすることです!. SDKMAN! Micronautクライアントをインストールするために使用する複数のSdkの並列バージョンを管理するためのツールです。あなたはSDKMANをダウンロードすることができます! 次のコマンドを実行します:
curl -s https://get.sdkman.io | bash
これで、Micronaut自体をインストールできます。 ターミナルで次のコマンドを実行するだけです。
sdk install micronaut
コマンドの実行が完了すると、コンピュータで最新のMicronautバージョンが利用
あなたは、アプリケーションの開発を開始する準備が整いました!
Javaサービスを開発する
アプリケーションを作成するディレクトリに移動し、次のコマンドを実行します:
mn create-app com.okta.rest.app --build maven
このコマンドは、Micronautプロジェクトの基本的な構造を持つプロジェクトを作成します。 MicronautはデフォルトでGradleを使用しますが、--build maven
を使用しているため、代わりにMavenを使用します。
次のステップは、プロジェクト内にセキュリティライブラリを追加することです。 pom.xml
ファイルを編集し、次の依存関係を追加します。
<dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security</artifactId></dependency><dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security-jwt</artifactId></dependency>
これらの依存関係は、プロジェ すべての依存関係が整ったので、エンドポイントの作成を開始できます。
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
/hello
hello()
@Get
アノテーションは、メソッドがHTTP GET要求を受信することを示しています。 Micronautのデフォルトの戻り値の型はJSONオブジェクトであるため、@Produces
@Secured
です。 このメソッドは、認証されたユーザーのみがアクセスできることをMicronautに伝えます。
セキュリティで保護されたコントローラがありますが、セキュリティ構成はまだ定義されていません。 Oktaアプリケーションに接続するようにMicronautを設定しましょう。P>
src/main/resources/application.yml
application.properties
に名前を変更し、次のセキュリティ設定を追加します。
micronaut.security.enabled=truemicronaut.security.token.jwt.enabled=truemicronaut.security.token.jwt.signatures.jwks.okta.url=https://{yourOktaDomain}/oauth2/default/v1/keys
{yourOktaDomain}
をOktaの値に置き換えますアカウント。
上記の設定では、OAuth2.0を使用してセキュリティを有効にします。 Oauth2.0クライアントがOktaからのものであることを宣言するには、Okta組織の発行者を指定します。また、JSON webトークン、またはJwtの使用も有効にしています。 Oktaから情報を読みたいので、JWT署名を検証するためにJWKS(JSON Web Key Set)を見つけることができる場所を宣言する必要があります。あなたのサービスをテストする時が来ました!
あなたのサービスをテストする時が来ました! 次のコマンドを実行してアプリケーションを起動します。
./mvnw mn:run
アプリを実行して、次のコマンドを実行します。
curl -X GET -I http://localhost:8080/hello
上記のコマンドは、次のような結果を生成します。
curl -X GET -I http://localhost:8080/hello
上記のコマンドは、次のような結果を生成します。
curl -X GET -I http://localhost:8080/hello
上記のコマンドは、次のような結果を生成します。あなたが見ることができるように、要求は通過しませんでした。 これを機能させるには、OIDCデバッガによって取得されたOAuth2.0アクセストークンを渡す必要があります。 シェルのTOKEN
変数にアクセストークンを割り当てます。次のコマンドを実行します。
TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...
次のコマンドを実行します。
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
今、期待どおりに動作します! 今回は、応答としてグリーティングメッセージを受信しています。
Hello, [email protected]!
Micronautが安全なREST APIを作成するために必要なコードはほとん コード行を数えると、〜24%がXML(8行)の依存関係であり、Javaコードはわずか22行のコードであり、セキュリティ構成には3行が必要です。 Micronautの組み込みのOAuth2.0サポートにより、Oktaとの統合が容易になり、oktaのガイドもドキュメントに含まれています。
素晴らしい! 次に、Quarkusを使用して同じアプリを作成する方法を見てみましょう。
QuarkusでJava REST APIを構築する
Quarkusを使用してアプリケーションを開発するには、Mavenをインストールするだけで、他の依存関係は必要ありません。
アプリの作成を始めましょう! 作成するディレクトリに移動し、次のコマンドを実行します。
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"
上記のコマンドは、Quarkus Mavenプラグインを使用してプロジェクトを作成 これは、HelloResource
/hello
パスで要求を受信します。 また、プロジェクトのQuarkusからJWT拡張機能を追加しています。プロジェクトを作成したら、src/java/com/okta/rest/quarkus/HelloResource.java
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() + "!"; }}
上記のクラスは、Micronautで作成したクラスと同じように動作します。 要求で生成されたトークンに基づいてユーザーの情報を読み取り、見つかったユーザーに挨拶メッセージを返します。あなたはまだあなたの発行者とOktaからの鍵でQuarkusを設定していないので、それをしましょう。P>
編集src/main/resources/application.properties
そして、次のコードを追加します。
mp.jwt.verify.publickey.location=https://{yourOktaDomain}/oauth2/default/v1/keysmp.jwt.verify.issuer=https://{yourOktaDomain}/oauth2/default
完了! アプリケーションのQuarkusバージョンをテストする準備が整いました。 プロジェクトフォルダに移動し、次のコマンドを実行します。
./mvnw compile quarkus:dev
上記のコマンドは、アプリケーションを起動します。最初のステップは、正しい資格情報を使用しないときに401 - Unauthorized
を受け取ることを確認することです。
ターミナルで次のコマンドを実行します。
curl -X GET -I http://localhost:8080/hello
期待どおり、結果はHTTP401応答です:P>
HTTP/1.1 401 Unauthorizedwww-authenticate: Bearer {token}Content-Length: 0
OIDCデバッガからのトークンを含むこの同じ要求を実行すると、グリーティングメッセージが返されます。
次のコマンドを実行します。
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
それは魅力のように働きました! 私の場合、結果は次のとおりです。
Hello, [email protected]!
QuarkusはMicronautよりもさらに少ないコード行を必要とします! 依存関係が含まれているアプリを生成し、25行のJavaコードと2行の構成しかありません。 はい、コードの行は愚かな比較ですが、これらのフレームワークが安全なアプリを開発するために非常に少ないコードを必要とする方法も示しています。
二つのダウン、一つは行く! MicronautとQuarkusにアプリを実装できたので、Spring Bootを使用して同じアプリを作成して終了しましょう。Spring BootでJava REST APIをビルドする
Spring Bootには、アプリの作成を開始するための前提条件がないため、プロジェクトの作成から始めましょう!
ターミナルを開き、次のコマンドを実行します:上記のコマンドは、Mavenを使用するSpring Bootアプリケーションを使用してspring-boot
ディレクトリに抽出できます。p>
unzip spring-boot.zip -d spring-boot
ここで、要求を受け取るコントローラを実装します。p>
パッケージを作成し、その中にHelloController
HelloController
クラスを作成します。
クラスを作成します。HelloController
クラスを作成します。
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() + "!"; }}
ここでの設定は、他のフレームワークと非常によく似ています。 クラスに@RestController
注釈を付けて、クラスでリクエストを受け取ることをSpringに知らせることができます。 @GetMapping
/hello
パスでHTTP GET要求を受信します。 認証されたユーザーを取得するには、@AuthenticationPrincipal
注釈を使用します。
他のフレームワークとは異なり、Springはすでに設定からこの情報を制御しているため、このエンドポイントが認証されるように指定する必要はありま最後のステップは、発行者情報を追加することで、Spring SecurityのOIDCサポートが通信する必要があるエンドポイントを自動検出できるようにします。P>
編集src/main/resources/applications.properties
そして、次の設定を追加します。
okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default
それをテストしましょう! Mavenを使用してSpring Bootアプリを起動します。次に、ターミナルを開き、以下のコマンドを実行します。
curl -X GET -I http://localhost:8080/hello
トークンを含めなかったため、応答はHTTP401エラーです。
./mvnw spring-boot:run
トークンを含めなかったため、応答はHTTP401エラーです。
curl -X GET -I http://localhost:8080/hello
応答はHTTP401エラーです。
curl -X GET -I http://localhost:8080/hello
応答はHTTP401エラーです。
curl -X GET -I http://localhost:8080/hello
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
うまくいきました! 他のサービスと同様に、このコマンドの結果は次のようになります。
Hello, [email protected]!
Spring Bootは、必要なコードの最小量でクロックします: Javaの17行と設定の唯一の1行! Springは常に開発者の生活を楽にするのに優れていたので、これは驚くことではありません。
これで終わりです! 3つのフレームワークすべてに基本的なJava REST APIを実装しました!Javaを使用したREST Apiに関する最終的な考え:Micronaut、Quarkus、およびSpring Boot
REST APIの開発に関しては、3つのフレームワークすべてがうまく機能しました。 少しのコードといくつかの設定だけで、OktaとOAuth2.0を使用して安全なアプリケーションを開発することができました。
春は長年にわたって周りされている、それは広く人気があり、その生態系の周りに多くの機能を持っています。 個人的には、私はまだJavaでプログラミングするときに利用可能な最良の選択肢であると信じています。
MicronautとQuarkusは、Javaコミュニティの中で人気が高まり、勢いを増しています。 パフォーマンスの問題に直面している場合、または変更のために痛む場合は、それらのいずれかを試してみて、それがどのように行くかを確認するか
パフォーマンスは、これら三つのフレームワーク間の最も頻繁に強調された比較ポイ サーバーレス環境での高速起動、またはGraalVMでネイティブイメージを作成する機能を探している場合は、MicronautとQuarkusがうまく機能する可能性があります。 楽しみのために、これらの各アプリの起動時間は次のとおりです(3回の試行の平均に基づいています)。
- Micronaut:474ms
- Quarkus:1132ms
- Spring Boot:1014ms
開発のための各フレームワークのMaven目標を実行してから、これらの数値を取得しました。
- マイクロノート:
./mvnw mn:run
- Quarkus:
./mvnw compile quarkus:dev
- 春のブート: これらのコマンドは速度に最適化されていないため、各アプリケーションを
./mvnw package
java -jar
で開始しました。注:これらの数値は、2.4GHz8コアIntel Core i9CPUと64GBのRAMを搭載した2019MacBook Proで計算されました。 OpenJDK15はJAVA_OPTS
設定なしで使用されました。より高速な起動時間を探している場合は、GraalVMを使用できます。 自分でタイミングテストを実行するのではなく、各プロジェクトのドキュメントを見ました。Micronaut:最初のMicronaut Graalアプリケーションの作成に応じて12ms。 - Quarkus:QuarkusとGraalVMによると14ms:Infoqで超音速、亜原子サイズで休止状態を起動します。 Quarkus docsには起動時間は記載されていません。
- Spring Boot:Spring Graal Native0.6.0によると44msがリリースされました。最終的には、選択に関係なく、安全なアプリケーションを生産的に開発することができます。
ソースコードを見てみたいですか? GitHubのokta-java-rest-api-comparison-exampleで見つけることができます。Java、REST Api、およびセキュアアプリケーションについてもっと学びたいですか?
- GraalVMがJavaをバイナリに変換するのを見る
- OAuth2.0Javaガイド:5分でアプリをセキュリティで保護する
- Spring BootとSpring Cloudを使用したJavaマイクロサービス
- JavaとOidc認証を使用したQuarkusアプリを開発する方法
- Spring Securityを使用したシンプルな認証
このような投稿については、@twitterでオクタデフ。 また、定期的に私たちのYouTubeチャンネルにスクリーンキャストを公開!変更履歴:
- 2020年9月23日:Micronaut2.0.2、Quarkus1.8.1、およびSpring Boot2.3.4にアップグレードされました。 GitHubのサンプルアプリのコードの変更を参照してください。 この投稿への変更は、oktadeveloper/okta-blog#423で確認できます。
- 2020年5月21日:
java -jar
の起動時間を追加し、GraalVMで実行しました。 この記事への変更は、oktadeveloper/okta-blog#304で見ることができます。 - 2020年5月20日:Micronaut1.3.5、Quarkus1.4.2、およびSpring Boot2.3.0にアップグレードされました。 GitHubのサンプルアプリのコードの変更を参照してください。 この記事への変更は、oktadeveloper/okta-blog#301で見ることができます。
- 2020年1月30日:Micronautチームからのフィードバックに基づいてMicronautを最適化するように更新されました。 また、3回の試行の平均に基づいて起動時間を再計算しました。 GitHubのサンプルアプリのコードの変更を参照してください。 この記事への変更は、oktadeveloper/okta-blog#176で見ることができます。