例外を処理するときは、例外の種類自体と ErrorCode メンバーを使用して例外を区別できます。 例外には、 MsalClientException、 MsalServiceException、 MsalInteractionRequiredExceptionの 3 種類があり、これらはすべて MsalExceptionから継承されます。
- MsalClientException は、ライブラリまたはデバイス側でエラーが発生したときにスローされます。
- MsalServiceException は、STS サービスからエラー応答が返されたときか、別のネットワーク エラーが発生したときにスローされます。
- 認証を成功させるために UI 操作が必要な場合、MsalInteractionRequiredException がスローされます。
MsalServiceException
MsalServiceException は、STS に要求を返した HTTP ヘッダーを公開します。 ユーザーは、次の方法でアクセスできます。 MsalServiceException.headers()
MsalInteractionRequiredException
AcquireTokenSilently()の呼び出し時に MSAL4J から返される一般的な状態コードの 1 つがInvalidGrantError。 この状態コードは、アプリケーションが認証ライブラリをもう一度呼び出す必要があることを意味しますが、対話型モード (パブリック クライアント アプリケーションには AuthorizationCodeParameters または DeviceCodeParameters を使用)。 これは、認証トークンを発行する前に追加のユーザー操作が必要であるためです。
AcquireTokenSilently が失敗するほとんどの場合、トークン キャッシュに要求に一致するトークンがないためです。 アクセス トークンは 1 時間で期限切れになり、AcquireTokenSilently は更新トークンに基づいて新しいトークンをフェッチしようとします (OAuth2 の用語では、これは "更新トークン" フローです)。 このフローは、テナント管理者がより厳格なログイン ポリシーを構成する場合など、さまざまな理由で失敗する可能性もあります。
この操作は、ユーザーにアクションを実行してもらうことを目的としています。 これらの条件の中には、ユーザーが簡単に解決できる条件 (たとえば、1 回のクリックで使用条件に同意する) と、現在の構成で解決できない条件があります (たとえば、該当するマシンは特定の企業ネットワークに接続する必要があります)。
MSAL は、 reason フィールドを公開します。このフィールドを読んでユーザー エクスペリエンスを向上させることができます。たとえば、パスワードの有効期限が切れたことをユーザーに伝えたり、一部のリソースを使用するために同意する必要があることをユーザーに伝えたりすることができます。 サポートされている値は、InteractionRequiredExceptionReason 列挙型の一部です。
| 理由 | Meaning | 推奨される処理 |
|---|---|---|
| BasicAction | 対話型認証フロー中にユーザーの操作によって条件を解決できます | 対話型パラメーターを使用して acquireToken を呼び出す |
| 追加アクション | 条件は、対話型認証フローの外部で、システムとの追加の修復操作によって解決できます。 | 対話型パラメーターを指定して acquireToken を呼び出し、修復アクションを説明するメッセージを表示します。 呼び出し元のアプリケーションでは、ユーザーが修復アクションを完了する可能性が低い場合に、additional_actionを必要とするフローを非表示にすることができます。 |
| MessageOnly | 現時点では、条件を解決できません。 対話型認証フローを起動すると、条件を説明するメッセージが表示されます。 | 対話型パラメーターを使用して acquireToken を呼び出し、条件を説明するメッセージを表示します。 acquireTokenCall は、ユーザーがメッセージを読んでウィンドウを閉じた後、UserCanceled エラーを返します。 呼び出し元のアプリケーションは、ユーザーがメッセージの恩恵を受ける可能性が低い場合にmessage_onlyになるフローを非表示にすることを選択できます。 |
| 同意が必要です | ユーザーの同意がないか、取り消されています。 | すべての acquireToken を対話型パラメーターで呼び出して、ユーザーが同意できるようにします。 |
| UserPasswordExpired | ユーザーのパスワードの有効期限が切れています。 | ユーザーがパスワードをリセットできるように、対話型パラメーターを使用して acquireToken を呼び出す |
| 同意が必要です | ユーザーの同意がない、または取り消された | ユーザーがパスワードをリセットできるように、対話型パラメーターを使用して acquireToken を呼び出す |
| なし | 詳細は提供されません。 条件は、対話型認証フロー中にユーザーの操作によって解決される場合があります。 | 対話型パラメーターを使用して acquireToken を呼び出す |
コード例
IAuthenticationResult result;
try {
PublicClientApplication application = PublicClientApplication
.builder("clientId")
.b2cAuthority("authority")
.build();
SilentParameters parameters = SilentParameters
.builder(Collections.singleton("scope"))
.build();
result = application.acquireTokenSilently(parameters).join();
}
catch (Exception ex){
if(ex instanceof MsalInteractionRequiredException){
// AcquireToken by either AuthorizationCodeParameters or DeviceCodeParameters
} else{
// Log and handle exception accordingly
}
}