Abfrage-Handler in Android-Anwendungen implementieren

improve this page | report issue

Übersicht

Wenn Sie versuchen, auf eine geschützte Ressource zuzugreifen, sendet der Server (die Sicherheitsüberprüfung) eine Liste mit mindestens einer Abfrage an den Client zur Bearbeitung zurück.
Die Liste wird als JSON-Objekt empfangen, in dem die Namen der Sicherheitsüberprüfungen sowie optional weitere JSON-Daten enthalten sind.

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

Der Client muss für jede Sicherheitsüberprüfung einen Abfrage-Handler registrieren.
Der Abfrage-Handler definiert das clientseitige Verhalten für die jeweilige Sicherheitsüberprüfung.

Abfrage-Handler erstellen

Ein Abfrage-Handler ist eine Klasse, die von MobileFirst Server gesendete Abfragen bearbeitet. Er zeigt beispielsweise eine Anmeldeanzeige an, erfasst Berechtigungsnachweise und übermittelt diese an die Sicherheitsüberprüfung.

In diesem Beispiel geht es um die Sicherheitsüberprüfung PinCodeAttempts, die im Abschnitt CredentialsValidationSecurityCheck implementieren definiert wurde. Die von dieser Sicherheitsüberprüfung gesendete Abfrage enthält die verbleibende Anzahl von Anmeldeversuchen (remainingAttempts) und optional eine Fehlernachricht (errorMsg).

Erstellen Sie eine Java-Klasse, die SecurityCheckChallengeHandler erweitert:

public class PinCodeChallengeHandler extends SecurityCheckChallengeHandler {

}

Abfrage bearbeiten

Die Mindestanforderung des Protokolls SecurityCheckChallengeHandler ist die Implementierung eines Konstruktors und einer Methode handleChallenge, die den Benutzer zur Angabe der Berechtigungsnachweise auffordert. Die Methode handleChallenge empfängt die Abfrage als JSONObject.

Fügen Sie eine Konstruktormethode hinzu:

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

Im folgenden handleChallenge-Beispiel wird der Benutzer in einem Alert aufgefordert, den PIN-Code einzugeben:

@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();
    }
}

Die Implementierung von alertMsg ist in der Beispielanwendung enthalten.

Wenn die Berechtigungsnachweise nicht stimmen, können Sie erwarten, dass das Framework erneut handleChallenge aufruft.

Antwort auf die Abfrage übergeben

Wenn die Berechtigungsnachweise auf der Benutzerschnittstelle erfasst wurden, verwenden Sie die Methode submitChallengeAnswer(JSONObject answer) von SecurityCheckChallengeHandler, um eine Antwort an die Sicherheitsüberprüfung zu senden. Im folgenden Beispiel erwartet PinCodeAttempts eine Eigenschaft mit der Bezeichnung pin, die den übergebenen PIN-Code enthält:

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

Abfrage abbrechen

Es kann vorkommen, dass Sie dem Framework mitteilen möchten, dass diese Abfrage komplett verworfen werden soll, z. B., wenn auf eine Schaltfläche Cancel geklickt wird.

Verwenden Sie dazu die Methode cancel() von SecurityCheckChallengeHandler.

Fehlerbehandlung

In einigen Szenarien kann ein Fehler ausgelöst werden (z. B. bei Erreichung der maximalen Anzahl von Versuchen). Implementieren Sie für solche Fälle die Methode handleFailure von SecurityCheckChallengeHandler.

Die Struktur des als Parameter übergebenen JSON-Objekts (JSONObject) hängt in starkem Maße von der Art des Fehlers ab.

@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();
    }
}

Die Implementierung von alertError ist in der Beispielanwendung enthalten.

Erfolgsbehandlung

Im Erfolgsfall erlaubt das Framework generell die weitere Ausführung der Anwendung.

Bei Bedarf können Sie entscheiden, eine Aktion auszuführen, bevor das Framework den Abfrage-Handler-Ablauf schließt, indem Sie die Methode handleSuccess() von createSecurityCheckChallengeHandler implementieren. Auch hier sind Inhalt und Struktur des als Parameter übergebenen JSON-Objekts (JSONObject) davon abhängig, was die Sicherheitsüberprüfung sendet.

In der Beispielanwendung PinCodeAttempts gibt es im JSONObject keine zusätzlichen Daten. Daher ist handleSuccess nicht implemetiert.

Abfrage-Handler registrieren

Sie müssen das Framework anweisen, dem Abfrage-Handler den Namen einer bestimmten Sicherheitsüberprüfung zuzuordnen, damit der Abfrage-Handler auf dem Empfang der richtigen Abfragen wartet.

Initialisieren Sie den Abfrage-Handler dafür wie folgt mit der Sicherheitsüberprüfung:

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

Anschließend müssen Sie die Abfrage-Handler-Instanz registrieren:

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

Hinweis: Die Erstellung einer WLClient-Instanz und die Registrierung des Abfrage-Handlers sollte im gesamten Anwendungslebenszyklus nur einmal erfolgen. Es wird empfohlen, dafür die Android-Application-Klasse zu verwenden.

Beispielanwendung

PinCodeAndroid ist eine Android-Beispielanwendung, die WLResourceRequest verwendet, um einen Kontostand abzurufen.
Die Methode ist mit meinem PIN-Code geschützt, für den es maximal drei Eingabeversuche gibt.

Klicken Sie hier, um das Maven-Projekt SecurityAdapters herunterzuladen.
Klicken Sie hier, um das Android-Projekt herunterzuladen.

Verwendung des Beispiels

Anweisungen finden Sie in der Datei README.md zum Beispiel.

Beispielanwendung

Last modified on March 07, 2017