Android アプリケーションでのチャレンジ・ハンドラーの実装

improve this page | report issue

概説

保護リソースへのアクセスを試みると、クライアントにはサーバー (セキュリティー検査) から、クライアントが対処する必要がある 1 つ以上のチャレンジを含んだリストが返信されます。
このリストは、JSON オブジェクトとして届けられ、セキュリティー検査名とともにオプションで追加データの JSON がリストされています。

{
  "challenges": {
    "SomeSecurityCheck1":null,
    "SomeSecurityCheck2":{
      "some property": "some value"
    }
  }
}

その後、クライアントは、セキュリティー検査ごとにチャレンジ・ハンドラーを登録しなければなりません。
チャレンジ・ハンドラーによって、そのセキュリティー検査特定のクライアント・サイドの動作が定義されます。

チャレンジ・ハンドラーの作成

チャレンジ・ハンドラーは、MobileFirst Server によって送信されるチャレンジを処理するクラスです。例えば、ログイン画面を表示したり、資格情報を収集したり、それらを元のセキュリティー検査に送信したりします。

この例の場合、セキュリティー検査は PinCodeAttempts であり、これは CredentialsValidationSecurityCheck の実装で定義したものです。 このセキュリティー検査によって送信されるチャレンジには、ログインを試行できる残りの回数 (remainingAttempts) と、オプションで errorMsg が含まれます。

SecurityCheckChallengeHandler を継承する Java クラスを作成します。

public class PinCodeChallengeHandler extends SecurityCheckChallengeHandler {

}

チャレンジの処理

SecurityCheckChallengeHandler プロトコルが求める最小要件は、コンストラクターおよび handleChallenge メソッドを実装することです。このメソッドは、ユーザーに対して資格情報を求めるプロンプトを出します。 handleChallenge メソッドは、JSONObject としてチャレンジを受け取ります。

コンストラクター・メソッドを追加します。

public PinCodeChallengeHandler(String securityCheck) {
    super(securityCheck);
}

この handleChallenge の例では、PIN コードの入力をユーザーに要求するアラートが出されます。

@Override
public void handleChallenge(JSONObject jsonObject) {
    Log.d("Handle Challenge", jsonObject.toString());
    Log.d("Failure", jsonObject.toString());
    Intent intent = new Intent();
    intent.setAction(Constants.ACTION_ALERT_MSG);
    try{
        if (jsonObject.isNull("errorMsg")){
            intent.putExtra("msg", "This data requires a PIN code.\n Remaining attempts: " + jsonObject.getString("remainingAttempts"));
            broadcastManager.sendBroadcast(intent);
        } else {
            intent.putExtra("msg", jsonObject.getString("errorMsg") + "\nRemaining attempts: " + jsonObject.getString("remainingAttempts"));
            broadcastManager.sendBroadcast(intent);
        }
    } catch (JSONException e){
        e.printStackTrace();
    }
}

alertMsg の実装がサンプル・アプリケーションに組み込まれています。

資格情報が正しくない場合、フレームワークによって再度 handleChallenge が呼び出されます。

チャレンジ応答の送信

UI から資格情報が収集されたら、SecurityCheckChallengeHandlersubmitChallengeAnswer(JSONObject answer) メソッドを使用して、セキュリティー検査に応答を返信します。 この例の場合、PinCodeAttempts は、提供された PIN コードを含んでいる pin というプロパティーを必要とします。

submitChallengeAnswer(new JSONObject().put("pin", pinCodeTxt.getText()));

チャレンジのキャンセル

UI で「キャンセル」ボタンがクリックされたときなど、フレームワークに対して、このチャレンジを完全に破棄するように指示する必要が生じる場合があります。

これを実現するには、SecurityCheckChallengeHandlercancel() メソッドを使用します。

失敗の処理

一部のシナリオでは、失敗がトリガーされる可能性があります (例えば、最大試行回数に達したときなど)。 これらを処理するには、SecurityCheckChallengeHandlerhandleFailure メソッドを実装します。
パラメーターとして渡される JSONObject の構造は、失敗の性質に大きく依存します。

@Override
public void handleFailure(JSONObject jsonObject) {
    Log.d("Failure", jsonObject.toString());
    Intent intent = new Intent();
    intent.setAction(Constants.ACTION_ALERT_ERROR);
    try {
        if (!jsonObject.isNull("failure")) {
            intent.putExtra("errorMsg", jsonObject.getString("failure"));
            broadcastManager.sendBroadcast(intent);
        } else {
            intent.putExtra("errorMsg", "Unknown error");
            broadcastManager.sendBroadcast(intent);
        }
    } catch (JSONException e){
        e.printStackTrace();
    }
}

alertError の実装がサンプル・アプリケーションに組み込まれています。

成功の処理

一般的に、成功の場合は、アプリケーションの残りの処理を続行できるように、フレームワークによって自動的に処理されます。

オプションで、SecurityCheckChallengeHandlerhandleSuccess メソッドを実装すると、フレームワークがチャレンジ・ハンドラー・フローを閉じる前に、何かの処理を行うようにできます。 この場合も、パラメーターとして渡される JSONObject オブジェクトのコンテンツおよび構造は、セキュリティー検査が送信する内容に依存します。

PinCodeAttempts サンプル・アプリケーションの場合、JSONObject に追加のデータは含まれていないため、handleSuccess は実装されていません。

チャレンジ・ハンドラーの登録

チャレンジ・ハンドラーが正しいチャレンジを listen するためには、フレームワークに対して、チャレンジ・ハンドラーと特定のセキュリティー検査名を関連付けるように指示する必要があります。

そのためには、以下のようにセキュリティー検査を指定してチャレンジ・ハンドラーを初期設定します。

PinCodeChallengeHandler pinCodeChallengeHandler = new PinCodeChallengeHandler("PinCodeAttempts", this);

次に、チャレンジ・ハンドラー・インスタンスを登録する必要があります。

WLClient client = WLClient.createInstance(this);
client.registerChallengeHandler(pinCodeChallengeHandler);

注: WLClient インスタンスの作成とチャレンジ・ハンドラーの登録は、アプリケーション・ライフサイクル全体の中で 1 回のみ実行します。 Android Application クラスを使用してこれを行うことをお勧めします。

サンプル・アプリケーション

サンプルの PinCodeAndroid は、WLResourceRequest を使用して銀行の残高を照会する Android アプリケーションです。
このメソッドは、PIN コードと、最大 3 回までの試行によって保護されています。

ここをクリック して SecurityAdapters Maven プロジェクトをダウンロードします。
ここをクリック して Android プロジェクトをダウンロードします。

サンプルの使用法

サンプルの README.md ファイルの指示に従ってください。

サンプル・アプリケーション

Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.
Last modified on March 15, 2018