このチュートリアルは、Java EE Webアプリケーションにユーザーログインを追加する方法について説明します。ログインして、アカウント用に構成された例を参考にこのクイックタートに従うことをお勧めします。
以下の情報が必要です。Gradleを使用している場合は、次をJava
EEアプリケーションは、Auth0アプリケーションを使ってユーザーを認証するために、いくつかの情報を必要とします。この情報の保管にはデプロイメント記述子である
1
システム要件
このチュートリアルとサンプルプロジェクトは次を使用してテストが完了しています:
- Java 11
2
Auth0を構成する
アプリケーションキーを取得する
Auth0にサインアップしたときには、新しいアプリケーションが作成されたか、すでに作成済みであった可能性があります。Auth0と通信するには、アプリケーションについての詳細が必要になります。これらの詳細は、Auth0 Dashboardのアプリケーションの設定セクションで入手できます。
- Domain (ドメイン)
- Client ID(クライアントID)
- Client Secret(クライアントシークレット)
このページの上部からサンプルをダウンロードした場合は、これらの詳細が入力されます。
Callback URLを構成する
Callback URLはアプリケーション内にあるURLで、Auth0は認証後にユーザーをここにリダイレクトします。アプリのCallback URLはアプリケーションの設定にある**[Allowed Callback URLs(許可されているコールバックURL)]**フィールドに追加する必要があります。このフィールドが設定されていない場合、ユーザーはアプリケーションにログインできず、エラーが返されます。このページの上部からダウンロードしたサンプルプロジェクトに沿って進めている場合には、**[Allowed Callback
URLs(許可されているコールバックURL)]**フィールドに
http://localhost:3000/callback
を追加する必要があります。ログアウトURLを構成する
ログアウトURLはアプリケーション内にあるURLで、Auth0は認可サーバーからのログアウト後にユーザーをここに戻すことができます。これは、returnTo
クエリパラメーターで指定されます。アプリのログアウトURLはアプリケーションの設定にある**[Allowed Logout
URLs(許可されているログアウトURL)]**フィールドに追加する必要があります。このフィールドが設定されていない場合、ユーザーはアプリケーションからログアウトできず、エラーが返されます。このページの上部からダウンロードしたサンプルプロジェクトに沿って進めている場合には、**[Allowed Logout
URLs(許可されているログアウトURL)]**フィールドに
http://localhost:3000/
を追加する必要があります。3
JavaEEにAuth0の使用を構成する
依存関係をセットアップする
Java EEアプリケーションをAuth0と統合するには、以下の依存関係を追加します。- javax.javaee-api :Java EE 8を使ってアプリケーションを作成するために必要なJava EE 8 APIです。実際の統合はアプリケーションコンテナーが提供するため、WARファイルに含める必要はありません。
- javax.security.enterprise :EEアプリケーションでセキュリティ上の懸念に対処できるようにするJava EE 8 Security
APIです。
javax.javaee-api
の依存関係と同様に、統合はアプリケーションコンテナーが提供するため、WARファイルには含まれません。 - auth0-java-mvc-commons :Auth0 Java MVC SDKは、サーバー側のMVC WebアプリケーションにAuth0とJavaを使用できるようにします。これは、アプリケーションがAuth0を使ったユーザー認証で呼び出すべき認可URLを生成します。
pom.xml
に追加します:build.gradle
に追加します:Java EEアプリケーションを構成する
このチュートリアルに付属のサンプルはJSPを使用して作成され、WildFlyアプリケーションサーバーでテストが完了しています。他のアプリケーションコンテナーや技術を使用して作業する場合には、一部の手順を調整する必要があるかもしれません。
web.xml
ファイルを使用できますが、別の安全な場所に保管することもできます。この情報は、ユーザーがアプリケーションにログインできるように、auth0-java-mvc-commons ライブラリーを構成するために使用されます。ライブラリーとその構成オプションについては、ライブラリーのREADMEを参照してください。4
Java EE Securityを構成する
Java EE 8 Security
APIには新たにこれで、ユーザーの資格情報を表すために使用されるカスタムのこれで、呼び出し元プリンシパルと資格情報を表すクラスが定義できました。次に、以下のサンプルは、RS256署名アルゴリズム の使用に最後に、カスタムのこのクラスは
HttpAuthenticationMechanism
インターフェイスが搭載され、アプリケーションがユーザーの資格情報を取得できるようにしています。Basic認証とフォームベースの認証にはデフォルトの実装があり、カスタム認証ストラテジーを構成しやすくしています。Auth0を使用して認証するには、以下のインターフェイスをカスタムで実装します。- HttpAuthenticationMechanism:Auth0から戻されるユーザーの認証ワークフローを処理します(JavaDoc)。
- IdentityStore:ユーザーの資格情報を検証します(JavaDoc)。
- CallerPrincipal:現在のHTTP要求の呼び出し元プリンシパルを表します(JavaDoc)。
- Credential:呼び出し元が認証に使用する資格情報を表します(JavaDoc)。
CallerPrincipal
を作成します:Credential
が実装できるようになりました。これには、プリンシパルについての情報が保管されます:IdentityStore
のカスタム実装を作成します。このクラスはユーザー資格情報の検証に使用されます。credential
がAuth0Credential
の場合はユーザーの呼び出しが認証され有効であるため、正常として、資格情報を使って作成されたCredentialValidationResult
が返されます。Auth0Credential
でない場合には、CredentialValidationResult.NOT_VALIDATED_RESULT
が返されます。これらのすべてを使用するHttpAuthenticationMechanism
インターフェイスを実装する前に、Beanを作成して、Auth0 Java MVC
SDKにある構成済みのAuthenticationController
インスタンスが提供されるようにします。AuthenticationController
はユーザーがログインする認可URLの構築と、ユーザーを認証するトークン交換の処理に使用されます。- Auth0アプリケーションにRS256署名アルゴリズム (新しいAuth0アプリケーション作成時のデフォルト)の使用が構成されている場合には、
JwkProvider
を構成して、トークン署名の検証に使われる公開鍵を取得するようにします。その他の構成オプションについては、jwks-rsa-javaレポジトリを参照してください。 - Auth0アプリケーションにHS256署名アルゴリズム の使用が構成されている場合には、
JwkProvider
を構成する必要はありません。
使用可能な署名アルゴリズムについては、こちらのドキュメントを参照してください。
AuthenticationController
をどのように構成するのかを示しています。HttpAuthenticationMechanism
を実装します。validateRequest
メソッドをオーバーライドします。このメソッドはAuth0アプリケーションに対するすべての要求で呼び出され、コンテナーに認証ステータスを通知します。このサンプルでは、認可コードフローを使用して、認証フロー中に認可コードをトークンと交換します。この要求が/callback
エンドポイントに対するもので、code
要求パラメーターが含まれている場合には、以下にあるいくつかの重要な処理を行います。AuthenticationController
のhandle
メソッドを呼び出して、認可コードをIDトークンおよびアクセストークンと交換する。- IDトークンを使用して、新たに
Auth0Credential
を作成する。 - カスタムの
IdentityStore
実装のvalidate
メソッドを呼び出して、検証結果を取得する。 - アプリケーションコンテナーにログインステータスを通知する。
/callback
でない場合には、httpMessageContext.doNothing()
を返して、要求の処理が続行できるようにします。後ほど、認証のトリガーやWebビューの表示で認証情報をどのように使用するかについて説明します。最後に、認証したユーザーのセッションをコンテナーが作成できるように、@AutoApplySession
アノテーションが追加されたことに注意してください。5
認証をトリガーする
ユーザーがログインできるようにするには、
/login
パスへの要求を処理するサーブレットを作成します。LoginController
は、ユーザーがAuth0で認証できるように、正しい認可URLに要求をリダイレクトします。正しい認可URLの構築には、Auth0AuthenticationConfig
を通して投入された構成値と、Auth0
Java MVC
SDKが提供するAuthenticationController
が使用されます。このサンプルはデフォルトでopenid profile email
スコープを要求して、アプリケーションが基本的なプロファイル情報を認証済みのユーザーから取得できるようにします。これらのスコープについては、OpenID Connectスコープのドキュメントをお読みください。ユーザーが資格情報を入力し、要求されたアクセス権を認可すると、Auth0はcallbackUrl
に対して要求を発行し、IDトークンおよびアクセストークンと交換できるcode
クエリパラメーターを含めます。先ほど説明したように、上記で作成したAuth0HttpAuthenticationMechanism
がこの交換を処理し、アプリケーションコンテナーに認証ステータスを通知できるようにします。そうすることで、/callback
パスへの要求を処理するサーブレットは、ログイン前に要求された元のリソースに要求を転送するか、ホームページにリダイレクトするだけで済みます。6
ユーザー情報を表示する
認証したユーザーのプロファイル情報を取得するには、
Auth0JwtPrincipal
を使用することができます。HomeServlet.java
のサンプルコードでは、IDトークンでクレームを使ってプロファイルデータを要求属性に設定する方法を例示しています。そのプロファイル情報は、ユーザーについての情報を表示するビューで使用できます。7
ログアウトを処理する
ユーザーをログアウトさせるには、アプリケーションセッションを消去して、Auth0からユーザーをログアウトさせる必要があります。これは
LogoutServlet
で処理されます。まず、request.getSession().invalidate()
を呼び出して、セッションを消去します。それから、ログアウトURLを構築して、必ずreturnTo
クエリパラメーターを含めます。ユーザーはログアウト後にこのURLにリダイレクトされます。最後に、アプリケーションのをログアウトURLに応答をリダイレクトします。8
サンプルを実行する
サンプルを構築し実行するには、Mavenゴールに対してwildfly:runを実行し、このアプリケーションをデプロイした組み込みのWildFlyアプリケーションサーバーを起動します。詳細については、WildFly
Maven Pluginのドキュメントを参照してください。LinuxまたはMacOSを使用している場合は、次を行います:Windows:使用しているブラウザーで
http:``//localhost:3000
をポイントします。ログイン リンクを使用して、Auth0テナントにログインまたはサインアップします。ログインに成功すると、ユーザーのプロフィール画像とログインリンクのあるドロップダウンメニューが表示されます。プロファイル リンクをクリックすると、ユーザーのプロファイルページを表示することができます。ドロップダウンメニューにあるログアウト リンクをクリックすると、ログアウトできます。次のステップ
成功です!ここまで来れば、アプリケーションにログイン、ログアウト、ユーザープロファイル情報が備わっているはずです。これでクイックスタートチュートリアルは終了ですが、機能はまだまだたくさんあります。Auth0でできることについて詳しくは、以下をご覧ください。- Auth0 Dashboard - Auth0のテナントやアプリケーションを構成して管理する方法について説明します
- auth0-java-mvc-common SDK - このチュートリアルで使用されているSDKをより詳しく説明します
- Auth0 Marketplace - Auth0の機能性を拡張できる各種の統合を見つけられます