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

improve this page | report issue

概説

前提条件: CredentialsValidationSecurityCheck チャレンジ・ハンドラー実装のチュートリアルをお読みください。

このチャレンジ・ハンドラーのチュートリアルでは、プリエンプティブ loginlogout、および obtainAccessToken など、いくつかの追加機能 (API) を例示します。

ログイン

この例では、UserLoginusernamepassword という key:value を必要とします。 オプションで、ブール型の rememberMe キーも受け入れます。これは、このユーザーを長期間記憶しておくようにセキュリティー検査に指示するためのものです。サンプル・アプリケーションの場合、この情報はログイン・フォームのチェック・ボックスからブール値を使用して収集されます。

credentials 引数は、usernamepassword、および rememberMe を含んでいる JSONObject です。

submitChallengeAnswer(credentials);

チャレンジを何も受け取っていない場合でもユーザーのログインを可能にする必要がある場合があります。 例えば、アプリケーションの最初の画面としてログイン画面を表示したり、ログアウト後やログイン失敗後にログイン画面を表示したりできます。 このようなシナリオをプリエンプティブ・ログインと呼びます。

応答すべきチャレンジが存在しない場合、submitChallengeAnswer API を呼び出すことはできません。 そのようなシナリオ用に、Mobile Foundation SDK には login API が組み込まれています。

WLAuthorizationManager.getInstance().login(securityCheckName, credentials, new WLLoginResponseListener() {
    @Override
    public void onSuccess() {
        Log.d(securityCheckName, "Login Preemptive Success");

    }

    @Override
    public void onFailure(WLFailResponse wlFailResponse) {
        Log.d(securityCheckName, "Login Preemptive Failure");
    }
});

資格情報に問題がある場合、セキュリティー検査はチャレンジを返信します。

アプリケーションのニーズに応じて、どのような場合に submitChallengeAnswer でなく login を使用するかを判断することは開発者の責任です。 これを実現する方法の 1 つとして、ブール値のフラグ (例えば、isChallenged) を定義し、handleChallenge に到達したときにフラグを true に設定し、それ以外のケース (失敗、成功、初期設定時など) では false に設定する方法があります。

ユーザーが「ログイン」ボタンをクリックした時点で、使用すべき API が動的に選択されます。

public void login(JSONObject credentials){
    if(isChallenged){
        submitChallengeAnswer(credentials);
    }
    else{
        WLAuthorizationManager.getInstance().login(securityCheckName, credentials, new WLLoginResponseListener() {
//...
        });
    }
}

注: WLAuthorizationManager login() API には、独自の onSuccess メソッドと onFailure メソッドがあり、関連するチャレンジ・ハンドラーの handleSuccess メソッドまたは handleFailure メソッド呼び出されます。

アクセス・トークンの取得

このセキュリティー検査は RememberMe 機能 (rememberMe ブール・キー) をサポートしているため、アプリケーションの開始時に、クライアントがログインしているかどうかをチェックすると役立ちます。

Mobile Foundation SDK は、サーバーに有効なトークンを尋ねるための obtainAccessToken API を提供しています。

WLAuthorizationManager.getInstance().obtainAccessToken(scope, new WLAccessTokenListener() {
    @Override
    public void onSuccess(AccessToken accessToken) {
        Log.d(securityCheckName, "auto login success");
    }

    @Override
    public void onFailure(WLFailResponse wlFailResponse) {
        Log.d(securityCheckName, "auto login failure");
    }
});

注: WLAuthorizationManager obtainAccessToken() API には、独自の onSuccess メソッドと onFailure メソッドがあり、関連するチャレンジ・ハンドラーの handleSuccess メソッドまたは handleFailure メソッド呼び出されます。

クライアントが既にログインしているか、記憶されている 状態である場合、API は成功をトリガーします。 クライアントがログインしていない場合、セキュリティー検査はチャレンジを返信します。

obtainAccessToken API は、スコープを受け入れます。 スコープは、セキュリティー検査の名前にできます。

スコープについて詳しくは、許可の概念チュートリアルを参照してください。

認証済みユーザーの取得

チャレンジ・ハンドラー handleSuccess メソッドは JSONObject identity をパラメーターとして受け入れます。 セキュリティー検査が AuthenticatedUser を設定した場合、このオブジェクトにはユーザーのプロパティーが含まれます。 現行ユーザーを保存するには、handleSuccess を使用できます。

@Override
public void handleSuccess(JSONObject identity) {
    super.handleSuccess(identity);
    isChallenged = false;
    try {
        //Save the current user
        SharedPreferences preferences = context.getSharedPreferences(Constants.PREFERENCES_FILE, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(Constants.PREFERENCES_KEY_USER, identity.getJSONObject("user").toString());
        editor.commit();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

ここで、identity には user というキーがあり、これ自身も AuthenticatedUser を表す JSONObject を含んでいます。

{
  "user": {
    "id": "john",
    "displayName": "john",
    "authenticatedAt": 1455803338008,
    "authenticatedBy": "UserLogin"
  }
}

ログアウト

Mobile Foundation SDK は、特定のセキュリティー検査からログアウトするための logout API も提供しています。

WLAuthorizationManager.getInstance().logout(securityCheckName, new WLLogoutResponseListener() {
    @Override
    public void onSuccess() {
        Log.d(securityCheckName, "Logout Success");
    }

    @Override
    public void onFailure(WLFailResponse wlFailResponse) {
        Log.d(securityCheckName, "Logout Failure");
    }
});

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

このチュートリアルには、以下の 2 つのサンプルが関連付けられています。

  • PreemptiveLoginAndroid: プリエンプティブ login API を使用して、常にログイン画面から開始するアプリケーション。
  • RememberMeAndroid: 「ユーザーを記憶する (Remember Me)」チェック・ボックスがあるアプリケーション。 ユーザーは、次にアプリケーションを開くとき、ログイン画面をバイパスできます。

両方のサンプルが、SecurityCheckAdapters アダプター Maven プロジェクトに含まれる同じ UserLogin セキュリティー検査を使用します。

ここをクリック して SecurityCheckAdapters Maven プロジェクトをダウンロードします。
ここをクリック して Remember Me プロジェクトをダウンロードします。
ここをクリック して Preemptive Login プロジェクトをダウンロードします。

サンプルの使用法

サンプルの README.md ファイルの指示に従ってください。
アプリケーションのユーザー名/パスワードは一致しなければなりません (すなわち、”john”/”john”)。

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

Last modified on March 15, 2018