MSAL.js におけるエラーと例外の処理

この記事では、さまざまな種類のエラーの概要と、一般的なサインイン エラーを処理するための推奨事項について説明します。

MSAL エラー処理の基本

Microsoft Authentication Library (MSAL) の例外は、エンド ユーザーに表示されるのではなく、アプリ開発者がトラブルシューティングを行うために使用されます。 例外メッセージはローカライズされません。

例外とエラーを処理する場合は、例外の種類自体とエラー コードを使用して例外を区別できます。 エラー コードの一覧については、認証と承認のエラー コードMicrosoft Entra参照してください。

サインイン エクスペリエンス中に、同意、条件付きアクセス (MFA、デバイス管理、場所ベースの制限)、トークンの発行と利用、およびユーザー プロパティに関するエラーが発生する場合があります。

次のセクションでは、アプリのエラー処理の詳細について説明します。

MSAL.js でのエラー処理

MSAL.js は、さまざまな種類の一般的なエラーを抽象化して分類するエラー オブジェクトを提供します。 また、エラー メッセージなど、エラーの特定の詳細にアクセスして適切に処理するためのインターフェイスも提供します。

エラー オブジェクト

export class AuthError extends Error {
    // This is a short code describing the error
    errorCode: string;
    // This is a descriptive string of the error,
    // and may also contain the mitigation strategy
    errorMessage: string;
    // Name of the error class
    this.name = "AuthError";
}

エラー クラスを拡張すると、次のプロパティにアクセスできます。

  • AuthError.message: errorMessageと同じです。
  • AuthError.stack: スローされたエラーのスタック トレースです。

エラーの種類

次のエラーの種類を使用できます。

  • AuthError: MSAL.js ライブラリの基本エラー クラス。予期しないエラーにも使用されます。

  • ClientAuthError: クライアント認証に関する問題を示すエラー クラス。 ライブラリから発生するほとんどのエラーは ClientAuthErrors です。 これらのエラーは、ログインが既に進行中の場合のログイン メソッドの呼び出し、ユーザーによるログインの取り消しなどが原因です。

  • ClientConfigurationError:特定のユーザー構成パラメーターが正しくないか見つからないときに、要求が行われる前にスローされる、ClientAuthError を拡張するエラー クラス。

  • ServerError: Error クラスは、認証サーバーによって送信されたエラー文字列を表します。 これらのエラーは、無効な要求形式またはパラメーター、またはサーバーがユーザーの認証または承認を妨げるその他のエラーである可能性があります。

  • InteractionRequiredAuthError: Error クラスは、対話型呼び出しを必要とするサーバー エラーを表すために ServerError を拡張します。 このエラーは、ユーザーが認証/承認のために資格情報または同意を提供するためにサーバーと対話する必要がある場合に、 acquireTokenSilent によってスローされます。 エラー コードには、 "interaction_required"、 "login_required"、および "consent_required"が含まれます。

リダイレクト方法 (loginRedirect、 acquireTokenRedirect) を使用した認証フローでのエラー処理の場合は、次のように、 handleRedirectPromise() メソッドを使用してリダイレクト後に成功または失敗して呼び出されるリダイレクトの約束を処理する必要があります。

const msal = require('@azure/msal-browser');
const myMSALObj = new msal.PublicClientApplication(msalConfig);

// Register Callbacks for redirect flow
myMSALObj.handleRedirectPromise()
    .then(function (response) {
        //success response
    })
    .catch((error) => {
        console.log(error);
    })
myMSALObj.acquireTokenRedirect(request);

ポップアップ エクスペリエンス (loginPopup、 acquireTokenPopup) のメソッドは promise を返すので、promise パターン (.then と .catch) を使用して、次のように処理できます。

myMSALObj.acquireTokenPopup(request).then(
    function (response) {
        // success response
    }).catch(function (error) {
        console.log(error);
    });

対話を必要とするエラー

acquireTokenSilentなどのトークンを取得する非対話型メソッドを使用しようとするとエラーが返されますが、MSAL では警告なしでは実行できませんでした。

次のような原因が考えられます。

  • サインインする必要がある
  • 同意する必要がある
  • 多要素認証エクスペリエンスを使用する必要があります。

修復では、 acquireTokenPopup や acquireTokenRedirectなどの対話型メソッドを呼び出します。

// Request for Access Token
myMSALObj.acquireTokenSilent(request).then(function (response) {
    // call API
}).catch( function (error) {
    // call acquireTokenPopup in case of acquireTokenSilent failure
    // due to interaction required
    if (error instanceof InteractionRequiredAuthError) {
        myMSALObj.acquireTokenPopup(request).then(
            function (response) {
                // call API
            }).catch(function (error) {
                console.log(error);
            });
    }
});

条件付きアクセスと要求の課題

トークンをサイレントで取得すると、アクセスしようとしている API で MFA ポリシーなどの 条件付きアクセス要求チャレンジ が必要な場合、アプリケーションでエラーが発生する可能性があります。

このエラーを処理するパターンは、MSAL を使用して対話形式でトークンを取得することです。 これにより、ユーザーにプロンプトが表示され、必要な条件付きアクセス ポリシーを満たす機会が提供されます。

場合によっては、条件付きアクセスが必要な API を呼び出す際に、API から返されるエラー内でクレーム チャレンジを受け取ることがあります。 たとえば、条件付きアクセス ポリシーでマネージド デバイス (Intune) を使用する場合、エラーは AADSTS53000 のようになります。このリソースや同様のリソースにアクセスするには、デバイスを管理する必要があります 。 この場合、取得トークン呼び出しで要求を渡して、ユーザーが適切なポリシーを満たすように求めることができます。

MSAL.jsを使用して ( acquireTokenSilent を使用して) トークンをサイレントに取得すると、アクセスしようとしている API で MFA ポリシーなどの 条件付きアクセス要求チャレンジ が必要な場合、アプリケーションでエラーが発生する可能性があります。

このエラーを処理するパターンは、次の例のように、 acquireTokenPopup や acquireTokenRedirect などの MSAL.js でトークンを取得するための対話型呼び出しを行います。

myMSALObj.acquireTokenSilent(accessTokenRequest).then(function(accessTokenResponse) {
    // call API
}).catch(function(error) {
    if (error instanceof InteractionRequiredAuthError) {
    
        // extract, if exists, claims from the error object
        if (error.claims) {
            accessTokenRequest.claims = error.claims,
        
        // call acquireTokenPopup in case of InteractionRequiredAuthError failure
        myMSALObj.acquireTokenPopup(accessTokenRequest).then(function(accessTokenResponse) {
            // call API
        }).catch(function(error) {
            console.log(error);
        });
    }
});

トークンを対話形式で取得すると、ユーザーにプロンプトが表示され、必要な条件付きアクセス ポリシーを満たす機会が与えられます。

条件付きアクセスを必要とする API を呼び出すと、API からエラーの要求チャレンジを受け取ることができます。 この場合、エラーで返された要求をclaimsの パラメーターに渡して、適切なポリシーを満たすことができます。

詳細については、 アプリケーションで継続的アクセス評価が有効な API を使用する方法 を参照してください。

他のフレームワークの使用

ID プラットフォームで登録されたシングル ページ アプリケーション (SPA) に Tauri などのツールキットを使用することは、実稼働アプリでは認識されません。 SPA では、運用アプリの https で始まる URL と、ローカル開発用の http://localhost のみがサポートされます。 tauri://localhostなどのプレフィックスは、ブラウザー アプリには使用できません。 この形式は、ブラウザー アプリとは異なり機密コンポーネントがあるため、モバイル アプリまたは Web アプリでのみサポートできます。

エラーと例外の後の再試行

MSAL を呼び出すときに、独自の再試行ポリシーを実装する必要があります。 MSAL では、Microsoft Entra サービスへの HTTP 呼び出しが行われ、エラーが発生することがあります。 たとえば、ネットワークがダウンしたり、サーバーが過負荷になったりする可能性があります。

HTTP 429

サービス トークン サーバー (STS) が多すぎる要求でオーバーロードされると、HTTP エラー 429 が返され、Retry-After 応答フィールドで再試行できるまでの時間に関するヒントが返されます。

次のステップ

問題の診断とデバッグに役立つ MSAL.jsのログ記録 を有効にすることを検討する