Spring-boot-oauth2-with-jwt
Spring Boot-JWTを使用したOAuth2
この章では、Spring Boot SecurityメカニズムとJWTを使用したOAuth2について詳しく学習します。
認可サーバー
承認サーバーは、Web APIセキュリティの最高のアーキテクチャコンポーネントです。 承認サーバーは、アプリとHTTPエンドポイントがアプリケーションの機能を識別できるようにする集中認証ポイントとして機能します。
リソースサーバー
リソースサーバーは、クライアントにアクセストークンを提供して、リソースサーバーのHTTPエンドポイントにアクセスするアプリケーションです。 HTTPエンドポイント、静的リソース、および動的Webページを含むライブラリのコレクションです。
OAuth2
OAuth2は、アプリケーションWebセキュリティがクライアントからリソースにアクセスできるようにする承認フレームワークです。 OAuth2アプリケーションを構築するには、許可タイプ(認証コード)、クライアントID、およびクライアントシークレットに焦点を合わせる必要があります。
JWTトークン
JWTトークンはJSON Webトークンであり、2者間で保護されたクレームを表すために使用されます。 JWTトークンについて詳しくは、https://jwt.io/[www.jwt.io/]をご覧ください。
次に、JWTトークンを使用して、承認サーバー、リソースサーバーの使用を可能にするOAuth2アプリケーションを構築します。
以下の手順を使用して、データベースにアクセスすることにより、JWTトークンでSpring Boot Securityを実装できます。
まず、ビルド構成ファイルに次の依存関係を追加する必要があります。
Mavenユーザーは、pom.xmlファイルに次の依存関係を追加できます。
Gradleユーザーは、build.gradleファイルに次の依存関係を追加できます。
どこで、
- Spring Boot Starter Security -Spring Securityを実装します
- Spring Security OAuth2 -OAUTH2構造を実装して、承認サーバーとリソースサーバーを有効にします。
- Spring Security JWT -Webセキュリティ用のJWTトークンを生成
- Spring Boot Starter JDBC -データベースにアクセスして、ユーザーが利用可能かどうかを確認します。
- Spring Boot Starter Web -HTTPエンドポイントを書き込みます。
- * H2データベース*-認証および承認のためのユーザー情報を保存します。
完全なビルド構成ファイルを以下に示します。
次に、メインのSpring Bootアプリケーションで、@ EnableAuthorizationServerアノテーションと@EnableResourceServerアノテーションを追加して、同じアプリケーションで認証サーバーとリソースサーバーとして機能するようにします。
また、次のコードを使用して単純なHTTPエンドポイントを記述し、JWTトークンを使用してSpring SecurityでAPIにアクセスできます。
次のコードを使用して、認証用のユーザー情報を保存するPOJOクラスを定義します。
ここで、次のコードを使用して、Spring Boot認証用にorg.springframework.security.core.userdetails.Userクラスを拡張するCustomUserクラスを定義します。
@Repositoryクラスを作成して、データベースからユーザー情報を読み取り、それをカスタムユーザーサービスに送信し、付与された権限「ROLE_SYSTEMADMIN」を追加することもできます。
org.springframework.security.core.userdetails.UserDetailsServiceを拡張するカスタムユーザー詳細サービスクラスを作成して、図のようにDAOリポジトリクラスを呼び出すことができます。
次に、@ securityクラスを作成してWebセキュリティを有効にし、パスワードエンコーダー(BCryptPasswordEncoder)を定義し、AuthenticationManager Beanを定義します。 セキュリティ構成クラスは、WebSecurityConfigurerAdapterクラスを拡張する必要があります。
ここで、OAuth2構成クラスを定義して、クライアントID、クライアントシークレットを追加し、トークン署名者キーと検証者キーのJwtAccessTokenConverter、秘密キーと公開キーを定義し、スコープでトークンの有効性のClientDetailsServiceConfigurerを構成します。
次に、opensslを使用して秘密鍵と公開鍵を作成します。
秘密鍵を生成するには、次のコマンドを使用できます。
使用できます公開鍵の生成には、以下のコマンドを使用します。
1.5以降のSpring Bootのバージョンでは、application.propertiesファイルに以下のプロパティを追加して、OAuth2リソースフィルターの順序を定義します。
YAMLファイルのユーザーは、YAMLファイルに以下のプロパティを追加できます。
次に、クラスパスリソース src/main/resources/directory の下にschema.sqlおよびdata.sqlファイルを作成して、アプリケーションをH2データベースに接続します。
schema.sqlファイルは次のとおりです-
data.sqlファイルは次のとおりです-
注意-パスワードは、データベーステーブルにBcrypt Encoderの形式で保存する必要があります。
次のMavenまたはGradleコマンドを使用して、実行可能JARファイルを作成し、Spring Bootアプリケーションを実行できます。
Mavenの場合、以下に示すコマンドを使用できます-
「BUILD SUCCESS」の後、ターゲットディレクトリの下にJARファイルがあります。
Gradleの場合、次のようにコマンドを使用できます-
「BUILD SUCCESSFUL」の後、build/libsディレクトリの下にJARファイルがあります。
さて、ここに示すコマンドを使用してJARファイルを実行します-
アプリケーションはTomcatポート8080で開始されます。
次に、POSTMANを介してPOSTメソッドのURLを押して、OAUTH2トークンを取得します。
今、次のようにリクエストヘッダーを追加します-
- 許可-クライアントIDとクライアントシークレットを使用した基本認証。
- コンテンツタイプ-application/x-www-form-urlencoded
今、次のようにリクエストパラメータを追加します-
- grant_type =パスワード
- ユーザー名=ユーザー名
- パスワード=パスワード
今、APIをヒットし、示されているようにaccess_tokenを取得します-
次に、示されているように、要求ヘッダーにベアラーアクセストークンを使用してリソースサーバーAPIをヒットします。
次に、以下に示すように出力を見ることができます-