Java EEアプリケーションにログインを追加する
このチュートリアルは、Java EE Webアプリケーションにユーザーログインを追加する方法について説明します。ログインして、アカウント用に構成された例を参考にこのクイックタートに従うことをお勧めします。
このチュートリアルとサンプルプロジェクトは次を使用してテストが完了しています:
Java 11
アプリケーションキーを取得する
Auth0にサインアップしたときには、新しいアプリケーションが作成されたか、すでに作成済みであった可能性があります。Auth0と通信するには、アプリケーションについての詳細が必要になります。これらの詳細は、Auth0 Dashboardのアプリケーションの設定セクションで入手できます。

以下の情報が必要です。
Domain (ドメイン)
Client ID(クライアントID)
Client Secret(クライアントシークレット)
Callback URLを構成する
Callback URLはアプリケーション内にあるURLで、Auth0は認証後にユーザーをここにリダイレクトします。アプリのCallback URLはアプリケーションの設定にある[Allowed Callback URLs(許可されているコールバックURL)]フィールドに追加する必要があります。このフィールドが設定されていない場合、ユーザーはアプリケーションにログインできず、エラーが返されます。
ログアウトURLを構成する
ログアウトURLはアプリケーション内にあるURLで、Auth0は認可サーバーからのログアウト後にユーザーをここに戻すことができます。これは、returnTo
クエリパラメーターで指定されます。アプリのログアウトURLはアプリケーションの設定にある[Allowed Logout URLs(許可されているログアウトURL)]フィールドに追加する必要があります。このフィールドが設定されていない場合、ユーザーはアプリケーションからログアウトできず、エラーが返されます。
依存関係をセットアップする
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を生成します。
Mavenを使用している場合は、次の依存関係をpom.xml
に追加します:
<!-- pom.xml -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>mvc-auth-commons</artifactId>
<version>[1.0, 2.0)</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.security.enterprise</groupId>
<artifactId>javax.security.enterprise-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
Was this helpful?
Gradleを使用している場合は、次をbuild.gradle
に追加します:
// build.gradle
providedCompile 'javax:javaee-api:8.0.1'
providedCompile 'javax.security.enterprise:javax.security.enterprise-api:1.0'
implementation 'com.auth0:mvc-auth-commons:1. '
Was this helpful?
Java EEアプリケーションを構成する
Java EEアプリケーションは、Auth0アプリケーションを使ってユーザーを認証するために、いくつかの情報を必要とします。この情報の保管にはデプロイメント記述子であるweb.xml
ファイルを使用できますが、別の安全な場所に保管することもできます。
この情報は、ユーザーがアプリケーションにログインできるように、auth0-java-mvc-commonsライブラリーを構成するために使用されます。ライブラリーとその構成オプションについては、ライブラリーのREADMEを参照してください。
**入力済みの属性を確認する** |
---|
このサンプルを__[Download Sample(サンプルをダウンロード)]__ボタンでダウンロードした場合は、domain 、clientId 、clientSecret の属性が自動的に入力されます。アカウントに複数のAuth0アプリケーションがある場合は特に、値が正しいことを確認してください。 |
Java EE 8 Security APIには新たにHttpAuthenticationMechanism
インターフェイスが搭載され、アプリケーションがユーザーの資格情報を取得できるようにしています。Basic認証とフォームベースの認証にはデフォルトの実装があり、カスタム認証ストラテジーを構成しやすくしています。
Auth0を使用して認証するには、以下のインターフェイスをカスタムで実装します。
HttpAuthenticationMechanism:Auth0から戻されるユーザーの認証ワークフローを処理します(JavaDoc)。
IdentityStore:ユーザーの資格情報を検証します(JavaDoc)。
CallerPrincipal:現在のHTTP要求の呼び出し元プリンシパルを表します(JavaDoc)。
Credential:呼び出し元が認証に使用する資格情報を表します(JavaDoc)。
まず、アプリケーションがAuth0設定を使用できるように、@ApplicationScoped Beanを作成してWebコンテキストから値を取得し、getterを通して利用できるようにします。
次に、現在の要求の呼び出し元を表すカスタムのCallerPrincipal
を作成します:
// src/main/java/com/auth0/example/security/Auth0JwtPrincipal.java
public class Auth0JwtPrincipal extends CallerPrincipal {
private final DecodedJWT idToken;
Auth0JwtPrincipal(DecodedJWT idToken) {
super(idToken.getClaim("name").asString());
this.idToken = idToken;
}
public DecodedJWT getIdToken() {
return this.idToken;
}
}
Was this helpful?
これで、ユーザーの資格情報を表すために使用されるカスタムのCredential
が実装できるようになりました。これには、プリンシパルについての情報が保管されます:
// src/main/java/com/auth0/example/security/Auth0JwtCredential.java
class Auth0JwtCredential implements Credential {
private Auth0JwtPrincipal auth0JwtPrincipal;
Auth0JwtCredential(String token) {
DecodedJWT decodedJWT = JWT.decode(token);
this.auth0JwtPrincipal = new Auth0JwtPrincipal(decodedJWT);
}
Auth0JwtPrincipal getAuth0JwtPrincipal() {
return auth0JwtPrincipal;
}
}
Was this helpful?
これで、呼び出し元プリンシパルと資格情報を表すクラスが定義できました。次に、IdentityStore
のカスタム実装を作成します。このクラスはユーザー資格情報の検証に使用されます。
// src/main/java/com/auth0/example/security/Auth0JwtIdentityStore.java
@ApplicationScoped
public class Auth0JwtIdentityStore implements IdentityStore {
@Override
public CredentialValidationResult validate(final Credential credential) {
CredentialValidationResult result = CredentialValidationResult.NOT_VALIDATED_RESULT;
if (credential instanceof Auth0JwtCredential) {
Auth0JwtCredential auth0JwtCredential = (Auth0JwtCredential) credential;
result = new CredentialValidationResult(auth0JwtCredential.getAuth0JwtPrincipal());
}
return result;
}
}
Was this helpful?
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
を構成する必要はありません。
以下のサンプルは、RS256署名アルゴリズムの使用にAuthenticationController
をどのように構成するのかを示しています。
// src/main/java/com/auth0/example/security/Auth0AuthenticationProvider.java
@ApplicationScoped
public class Auth0AuthenticationProvider {
@Produces
public AuthenticationController authenticationController(Auth0AuthenticationConfig config) {
JwkProvider jwkProvider = new JwkProviderBuilder(config.getDomain()).build();
return AuthenticationController.newBuilder(config.getDomain(), config.getClientId(), config.getClientSecret())
.withJwkProvider(jwkProvider)
.build();
}
}
Was this helpful?
最後に、カスタムのHttpAuthenticationMechanism
を実装します。
// src/main/java/com/auth0/example/security/Auth0AuthenticationMechanism.java
@ApplicationScoped
@AutoApplySession
public class Auth0AuthenticationMechanism implements HttpAuthenticationMechanism {
private final AuthenticationController authenticationController;
private final IdentityStoreHandler identityStoreHandler;
@Inject
Auth0AuthenticationMechanism(AuthenticationController authenticationController, IdentityStoreHandler identityStoreHandler) {
this.authenticationController = authenticationController;
this.identityStoreHandler = identityStoreHandler;
}
@Override
public AuthenticationStatus validateRequest(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
HttpMessageContext httpMessageContext) throws AuthenticationException {
// Exchange the code for the ID token, and notify container of result.
if (isCallbackRequest(httpServletRequest)) {
try {
Tokens tokens = authenticationController.handle(httpServletRequest, httpServletResponse);
Auth0JwtCredential auth0JwtCredential = new Auth0JwtCredential(tokens.getIdToken());
CredentialValidationResult result = identityStoreHandler.validate(auth0JwtCredential);
return httpMessageContext.notifyContainerAboutLogin(result);
} catch (IdentityVerificationException e) {
return httpMessageContext.responseUnauthorized();
}
}
return httpMessageContext.doNothing();
}
private boolean isCallbackRequest(HttpServletRequest request) {
return request.getRequestURI().equals("/callback") && request.getParameter("code") != null;
}
}
Was this helpful?
このクラスはvalidateRequest
メソッドをオーバーライドします。このメソッドはAuth0アプリケーションに対するすべての要求で呼び出され、コンテナーに認証ステータスを通知します。
このサンプルでは、認可コードフローを使用して、認証フロー中に認可コードをトークンと交換します。この要求が/callback
エンドポイントに対するもので、code
要求パラメーターが含まれている場合には、以下にあるいくつかの重要な処理を行います。
AuthenticationController
のhandle
メソッドを呼び出して、認可コードをIDトークンおよびアクセストークンと交換する。IDトークンを使用して、新たに
Auth0Credential
を作成する。カスタムの
IdentityStore
実装のvalidate
メソッドを呼び出して、検証結果を取得する。アプリケーションコンテナーにログインステータスを通知する。
要求されたリソースが/callback
でない場合には、httpMessageContext.doNothing()
を返して、要求の処理が続行できるようにします。後ほど、認証のトリガーやWebビューの表示で認証情報をどのように使用するかについて説明します。
最後に、認証したユーザーのセッションをコンテナーが作成できるように、@AutoApplySession
アノテーションが追加されたことに注意してください。
ユーザーがログインできるようにするには、/login
パスへの要求を処理するサーブレットを作成します。
LoginController
は、ユーザーがAuth0で認証できるように、正しい認可URLに要求をリダイレクトします。正しい認可URLの構築には、Auth0AuthenticationConfig
を通して投入された構成値と、Auth0 Java MVC SDKが提供するAuthenticationController
が使用されます。このサンプルはデフォルトでopenid profile email
スコープを要求して、アプリケーションが基本的なプロファイル情報を認証済みのユーザーから取得できるようにします。これらのスコープについては、OpenID Connectスコープのドキュメントをお読みください。
ユーザーが資格情報を入力し、要求されたアクセス権を認可すると、Auth0はcallbackUrl
に対して要求を発行し、IDトークンおよびアクセストークンと交換できるcode
クエリパラメーターを含めます。先ほど説明したように、上記で作成したAuth0HttpAuthenticationMechanism
がこの交換を処理し、アプリケーションコンテナーに認証ステータスを通知できるようにします。そうすることで、/callback
パスへの要求を処理するサーブレットは、ログイン前に要求された元のリソースに要求を転送するか、ホームページにリダイレクトするだけで済みます。
// src/main/com/auth0/example/web/CallbackServlet.java
@WebServlet(urlPatterns = {"/callback"})
public class CallbackServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String referer = (String) request.getSession().getAttribute("Referer");
String redirectTo = referer != null ? referer : "/";
response.sendRedirect(redirectTo);
}
}
Was this helpful?
認証したユーザーのプロファイル情報を取得するには、Auth0JwtPrincipal
を使用することができます。HomeServlet.java
のサンプルコードでは、IDトークンでクレームを使ってプロファイルデータを要求属性に設定する方法を例示しています。
そのプロファイル情報は、ユーザーについての情報を表示するビューで使用できます。
<!-- src/main/webapp/WEB-INF/jsp/fragments/navbar.jspf -->
<c:choose>
<c:when test="{empty profile}">
<li>
<form action="/login" method="GET">
<input type="submit" value="Login"/>
</form>
</li>
</c:when>
<c:otherwise>
<li>
<a href="#">
<!-- Profile image should be set to the profile picture from the id token -->
<img src="{profile.get('picture').asString()}" alt="Profile picture"/>
</a>
<div>
<!-- Show the user's full name from the id token here -->
<div>"{profile.get('name').asString()}"</div>
<a href="/profile">Profile</a>
<a href="/logout">Log out</a>
</div>
</li>
</c:otherwise>
</c:choose>
Was this helpful?
ユーザーをログアウトさせるには、アプリケーションセッションを消去して、Auth0からユーザーをログアウトさせる必要があります。これはLogoutServlet
で処理されます。
まず、request.getSession().invalidate()
を呼び出して、セッションを消去します。それから、ログアウトURLを構築して、必ずreturnTo
クエリパラメーターを含めます。ユーザーはログアウト後にこのURLにリダイレクトされます。最後に、アプリケーションのをログアウトURLに応答をリダイレクトします。
サンプルを構築し実行するには、Mavenゴールに対してwildfly:runを実行し、このアプリケーションをデプロイした組み込みのWildFlyアプリケーションサーバーを起動します。詳細については、WildFly Maven Pluginのドキュメントを参照してください。
LinuxまたはMacOSを使用している場合は、次を行います:
./mvnw clean wildfly:run
Was this helpful?
Windows:
mvnw.cmd clean wildfly:run
Was this helpful?
使用しているブラウザーでhttp:
//localhost:3000
をポイントします。ログインリンクを使用して、Auth0テナントにログインまたはサインアップします。

ログインに成功すると、ユーザーのプロフィール画像とログインリンクのあるドロップダウンメニューが表示されます。プロファイルリンクをクリックすると、ユーザーのプロファイルページを表示することができます。ドロップダウンメニューにあるログアウトリンクをクリックすると、ログアウトできます。
Next Steps
Excellent work! If you made it this far, you should now have login, logout, and user profile information running in your application.
This concludes our quickstart tutorial, but there is so much more to explore. To learn more about what you can do with Auth0, check out:
- Auth0 Dashboard - Learn how to configure and manage your Auth0 tenant and applications
- auth0-java-mvc-common SDK - Explore the SDK used in this tutorial more fully
- Auth0 Marketplace - Discover integrations you can enable to extend Auth0’s functionality
Sign up for an or to your existing account to integrate directly with your own tenant.