ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Adaptive Access Manager開発者ガイド
11gリリース2(11.1.2)
B71697-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

21 カスタム・アプリケーションの構築

OAAMのサンプル・アプリケーションには、統合プロセッサとタスク・プロセッサの使用例が示されています。Java API統合の例については、第2章「Oracle Adaptive Access Managerのネイティブ統合」を参照してください。

ここでは、OAAMカスタム・プロセッサ・フレームワークの参考情報を提供します。

21.1 概要

OAAMには、ユーザーのビジネス・セキュリティ要件に応えるために、即時利用可能なユーザー・フローやインタフェースが用意されていますが、標準的なWebアプリケーションの機能ではセキュリティ要件を満たせないことがあります。この場合、OAAMカスタム・プロセッサ・フレームワークを使用して、様々な処理メカニズムを個別に開発できます。

図21-1「OAAMプロセッサ・フレームワーク」には、このプロセッサ・フレームワークの各種コンポーネントが示されています。

図21-1 OAAMプロセッサ・フレームワーク

OAAMプロセッサ・フレームワークが示されています。

21.2 統合の参照用としてのサンプル・アプリケーション

タスク・プロセッサ統合の方法を示すサンプル・アプリケーションは、My Oracle Supportの記事ID1501759.1「タスク・プロセッサ統合用のOAAM 11gR2(11.1.2.0)サンプル・アプリケーションのダウンロード」で参照用に提供されています。

My Oracle Supportにはhttps://support.oracle.comからアクセスできます。


注意:

このサンプルは、My Oracle Supportの記事ID1351899.1「OAAM 11g PS1(11.1.1.5)サンプル・アプリケーションのダウンロード」で提供されているサンプル・アプリケーションに取って代わるものではありません。Java API統合またはタスク・プロセッサ統合を示すサンプル・アプリケーションのいずれかを使用してください。これら2つのサンプル・アプリケーションは一緒にデプロイできません。


サンプル・アプリケーションは、本番コードでの使用を目的としたものではありません。たとえば、サンプル・アプリケーションには適切なエラー処理機能がありません。APIの基本的な要素のみを使用しています。ネイティブ統合を実装するカスタマは、サンプル・アプリケーションを参照用として使用し、独自のアプリケーションを開発する必要があります。


注意:

これらのデプロイメント用に開発されたカスタム・アプリケーションは、直接的にはサポートされていません。ただし、Oracleサポート・サービスでは、提供されているAPIで発生した問題の解決など、この製品に関する問題に対応しています。


  1. oaam_framework_sampleフォルダを作成します。

  2. oaam_framework_sample.waroaam_framework_sampleに抽出します。

  3. WebLogic Serverを起動します。

  4. Oracle WebLogic管理コンソールに移動します。

    http://oaam_host:port/console

  5. OAAM共有ライブラリ$MW_HOME\Oracle_IDM1\oaam\oaam_libs\war\oaam_native_lib.warを共有ライブラリとしてデプロイします。

    1. 「制御」タブの「デプロイメントのサマリー」にあるIAMDomain(ナビゲーション・パネル)で、「デプロイメント」をクリックします。

    2. 「インストール」ボタンをクリックします。パスで$MW_HOME\Oracle_IDM1\oaam\oaam_libs\warを指定し、oaam_native_lib.warを選択します。「次へ」をクリックします。

    3. 「このデプロイメントをライブラリとしてインストールする」オプションを選択します。「次へ」をクリックします。

    4. 「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。共有ライブラリの名前がoracle.oaam.libsであることに注意してください。

      管理対象サーバーがOAAMサーバーの場合、OAAMデータソースを作成する必要はありません。そうでない場合は、JNDI名jdbc/OAAM_SERVER_DB_DSのデータソースを作成して、そのデータソースでOAAMスキーマを指定します。

    5. 「終了」をクリックします。

  6. OAAM共有ライブラリのデプロイ先である管理対象サーバーに、サンプル・アプリケーションをアプリケーションとしてデプロイします。

    1. 「制御」タブの「デプロイメントのサマリー」にあるIAMDomain(左側のペイン)で、「デプロイメント」をクリックします。

    2. 「インストール」ボタンをクリックします。パスで、サンプル・アプリケーションの場所を指定します。「次へ」をクリックします。

    3. 「このデプロイメントをアプリケーションとしてインストールする」オプションを選択します。「次へ」をクリックします。

    4. 「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。

    5. 「終了」をクリックします。

  7. 「チェンジ・センター」の「変更のアクティブ化」をクリックします。

  8. デプロイメント・ディスクリプタ・ファイルで、OAAM共有ライブラリoracle.oaam.libsへの参照を設定します。

    Oracle Adaptive Access Managerの共有ライブラリをWebアプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

    <library-ref>
           <library-name>oracle.oaam.libs</library-name>
    </library-ref>
    

    Oracle Adaptive Access Managerの共有ライブラリをエンタープライズ・アプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic-application.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

    <library-ref>
           <library-name>oracle.oaam.libs</library-name>
    </library-ref>
    
  9. 管理対象サーバーを起動します。

  10. Oracle WebLogic管理コンソールに移動します。「ロックして編集」をクリックして「デプロイメント」ノードを選択します。「デプロイメントのサマリー」ページで、サンプル・アプリケーションを検索して選択します。「起動」「すべてのリクエストを処理」をクリックします。「はい」をクリックして確認します。

  11. OAAM管理アプリケーションにログインし、スナップショットをインポートします。

  12. Sample_Transaction_Defs.zipファイルからトランザクション定義をインポートします。

  13. Sample_Txn_Models.zipファイルからトランザクション・ポリシーをインポートします。

  14. URLhttp://managed_server:port/oaam_framework_sampleに移動します。サンプル・アプリケーションのログイン・ページが表示されます。

  15. 次のページで、ユーザー名とパスワードを入力します。登録を行った後、サンプル・トランザクションへのリンクが表示されます。


    注意:

    最初のログイン時のパスワードはtestである必要があります。このパスワードはすぐに変更してください。


21.3 UIOContext

UIOContextは、HTTPリクエスト・オブジェクトとHTTPレスポンス・オブジェクトに対するスレッド・ローカル変数を保守するオブジェクトです。これにより、アプリケーションのセッション(具体的には、UIOSesisonDataオブジェクト)へのアクセスを常に確保することができます。このコンテキストには、各リクエストの開始時にデータを移入する必要があります。

UIOContext.setCurrentInstance(new UIOContext(request, response));

21.4 統合プロセッサ

統合プロセッサを使用すると、OAAM環境内の各アプリケーションにおいて、OAAMユーザー・フローのEntryExitおよびErrorポイントでカスタムJavaコードを開発できます。統合プロセッサでは、AuthManagerPasswordManagerおよびUserDataManager実装へのアクセスをカスタマイズすることもできます。

この項では、次の項目について説明します。

21.4.1 IntegrationProcessorIntfインタフェース

entryexitおよびerrorポイントにおけるカスタムJavaコードをクライアント側のOAAMコードと統合できます。

public interface IntegrationProcessorIntf extends Serializable {
  
  public String onEntry();
  
  public String onExit(String target);
  
  public String onError(String target);
  
  public String getAppId();
  
  public FlowIntf getFlow();
  
  public AuthManagerIntf getAuthManager();
  
  public PasswordManagerIntf getPasswordManager();
  
  public UserDataManagerIntf getDataManager(String key);
  
}

21.4.2 共通ユーザー・フロー

sessionDataオブジェクトを設定して、共通ユーザー・フローを開始できます。このフローはStartメソッドを実行して開始できます。

表21-1に、即時利用可能なオブジェクトとパラメータを示します。

*オプションのパラメータです。

表21-1 SessionDataのオブジェクト

クラス パラメータ メモ

LoginFlow

String appId

Map<String, String> rulesMap*

Hashtable appContext*

ユーザー名ページとパスワード・ページを表示する標準的なログイン・フロー。フィンガープリント処理、チャレンジおよび登録は必要に応じて実行されます。

LoginNoUsernameFlow

String appId

String loginId

Map<String, String> rulesMap*

Hashtable appContext*

ログイン・フローに類似していますが、ユーザー名ページをスキップし、指定したユーザー名をかわりに使用します。

AuthenticateFlow

String appId

String loginId

int authStatus

Map<String, String> rulesMap*

Hashtable appContext*

ログイン・フローに類似していますが、ユーザー名ページとパスワード・ページをスキップし、指定したユーザー名と認証ステータスを使用します。

ForgotPasswordFlow

String appId

String loginId

Map<String, String> rulesMap*

Hashtable appContext*

指定したユーザー名のパスワードを忘れた場合のフローを開始します。フィンガープリント処理およびパスワードを忘れた場合のチェックポイント・ルールがそれぞれ実行され、ポリシーにチャレンジが構成されている場合はユーザーにチャレンジします。

UserPreferencesFlow

String appId

String loginId*

int authStatus*

Map<String, String> rulesMap*

Hashtable appContext*

ユーザー・プリファレンス・フローを開始します。ユーザー・セッションがすでに存在している場合、sessionDataのユーザー名と認証ステータスが使用されます。または、ユーザー名と認証ステータスを指定して新しいユーザー・セッションを作成してから、ユーザー・プリファレンスを表示できます。


21.4.3 統合プロセッサのパラメータ

次のプロパティは、OAAMサーバー・フレームワークのカスタムJavaクラスを登録するために使用されます。

21.4.3.1 統合IDの確認

統合IDを確認するためのリクエスト・パラメータまたはヘッダーは次のとおりです。

oaam.server.integration.param=intg

21.4.3.2 統合プロセッサの登録

統合プロセッサでは、OAAMサーバーのentry、exitおよびerrorのケースを処理するカスタムJavaクラスの使用が許可されています。

oaam.server.integration.processor.default=com.bharosa.uio.processor.integration.DefaultIntegrationProcessor
oaam.server.integration.processor.oam=com.bharosa.uio.processor.integration.OAMIntegrationProcessor
oaam.server.integration.processor.mobile=com.bharosa.uio.processor.integration.MobileIntegrationProcessor
oaam.server.integration.processor.juniper=com.bharosa.uio.processor.integration.JuniperSSLIntegrationProcessor

21.4.3.3 認証レベルにおけるOracle Access Management Access Manager固有の統合プロパティ

認証レベルにおけるOracle Access Management Access Manager固有の統合プロパティは次のとおりです(OAMIntegraitonProcessorクラスで使用される)。

oaam.server.integration.oamauthentication.level.enum=Enum for oam authentication levels provided in tap token
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping=0
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping.name=Mapping
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping.oamauthlevels= -1 to 0, 1 to 99
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping.oaamauthlevels= 0,1

21.5 タスク・プロセッサ

インテグレータは、タスク・プロセッサで、重要なOAAM操作を実行するカスタムJavaコードを開発できます。各タスク・プロセッサ・クラスはTaskProcessorIntfを実装し、AbstractTaskProcessorを拡張します。タスク・プロセッサはプロパティを使用してシステムに登録し、Utilityメソッドをコールしてアクセスします。

UIOUtil.getTaskProcessor(UIOSessionData sessionData, String taskId)

タスク・プロセッサのプロパティ定義は次のとおりです。

bharosa.uio<appId>.task.processor.<taskId> = <class>

各タスク・プロセッサでは、TaskProcessorIntfインタフェースを実装する必要があります。また、既存のタスク・プロセッサまたはAbstractTaskprocessorクラスを拡張することをお薦めします。これにより、統合の目的で追加するJavaコードが少量な場合、カスタマイズにpreProcesspostProcessメソッドを組み込むだけで済みます。

たとえば、LogoutTaskProcessorがコールされるたびに外部APIが必要になる場合は、LogoutTaskProcessorを拡張するCustomLogoutTaskProcessorを実装して、外部APIのコールでpostProcessメソッドのみが実装されるようにできます。その後、新しいCustomTaskProcessorクラスを指定するようにログアウト・タスク・プロセッサのプロパティを更新できます。

bharosa.uio.default.task.processor.logout = com.bharosa.uio.processor.task.CustomLogoutTaskProcessor

21.5.1 TaskProcessorIntf

TaskProcessorIntfの内容は次のとおりです。

public interface TaskProcessorIntf {
 
    public static final String TASK_LOGIN = "login";
    public static final String TASK_JUMP = "jump";
    public static final String TASK_PASSWORD = "password";
    public static final String TASK_CHALLENGE = "challenge";
    public static final String TASK_CHANGE_PASSWORD = "changePassword";
    public static final String TASK_CHANGE_USERNAME = "changeUsername";
    public static final String TASK_FINGERPRINT = "fingerprint";
    public static final String TASK_LOGOUT = "logout";
    public static final String TASK_FORGOT_PASSWORD = "forgotPassword";
    public static final String TASK_CHECKPOINT= "checkpoint";
    public static final String TASK_UPDATE_STATUS = "updateStatus";
    public static final String TASK_REGISTER_SUMMARY = "registerSummary";
    public static final String TASK_REGISTER_IMAGE_PHRASE = "registerImagePhrase";
    public static final String TASK_REGISTER_QUESTIONS = "registerQuestions";
    public static final String TASK_REGISTER_USER_INFO = "registerUserInfo";
    public static final String TASK_REGISTER_COMPLETE = "registerComplete";
    public static final String TASK_REGISTER_SKIP = "registerSkip";
    public static final String TASK_USERPREF_IMAGE_PHRASE = 
     "userPrefsImagePhrase";
    public static final String TASK_USERPREF_QUESTIONS = "userPrefsQuestions";
    public static final String TASK_USERPREF_USER_INFO = "userPrefsUserInfo";
    public static final String TASK_USERPREF_COMPLETE = "userPrefsComplete";
    public static final String TASK_TRANSACTION = "transaction";
    public static final String TASK_UPDATE_TRANSACTION_STATUS = 
    "updateTransactionStatus";

    public static final String TARGET_ERROR = "error";
    public static final String TARGET_SESSION_EXPIRED = "session_expired";
    public static final String TARGET_FAIL = "fail";
    public static final String TARGET_ACCESS_DENIED = "accessDenied";
    public static final String TARGET_INVALID_USER = "invalid_user";
    public static final String TARGET_SUCCESS = "success";
    public static final String TARGET_UPDATE_STATUS = "updateStatus";
    public static final String TARGET_LOGIN = "login";
    public static final String TARGET_JUMP = "jump";
    public static final String TARGET_RESET_PASSWORD = "resetPassword";
    public static final String TARGET_CHANGE_PASSWORD = "changePassword";
    public static final String TARGET_CHALLENGE= "challenge";
    public static final String TARGET_FORGOT_PASSWORD = "forgotPassword";
    public static final String TARGET_USER_DISABLED = "user_disabled";
    public static final String TARGET_NEXT = "next";
    

    public static final String TARGET_ALLOW = Preferences.ACTION_ALLOW;
    public static final String TARGET_BLOCK = Preferences.ACTION_BLOCK;

    public static final String TARGET_REGISTER = Preferences.ACTION_REGISTER;
    public static final String TARGET_REGISTER_SUMMARY = "registerInfo";
    public static final String TARGET_REGISTER_IMAGE_PHRASE =  
       "registerAuthenticator";
    public static final String TARGET_REGISTER_QUESTIONS = "registerQuestions";
    public static final String TARGET_REGISTER_QUESTIONS_HTML = 
       "registerQuestionsHTML";
    public static final String TARGET_REGISTER_USER_INFO = "registerUserInfo";
    public static final String TARGET_REGISTER_COMPLETE = "registerComplete";
    public static final String TARGET_REGISTER_REQUIRED = 
       Preferences.ACTION_REGISTRATION_REQUIRED;
    public static final String PARAM_ACTION = "action";
    public static final String ACTION_SUBMIT = "submitAnswer";
    public static final String ACTION_WAIT = "wait";
    public static final String ACTION_UPGRADE = "upgrade";
    public static final String ACTION_DOWNGRADE = "revert";
    public static final String ACTION_SHOW = "show";
    
    public String execute(UIOSessionData sessionData, Map<String, String> params);
    
}        

21.5.2 AbstractTaskProcessor

AbstractTaskProcessorの内容は次のとおりです。

public abstract class AbstractTaskProcessor implements Serializable, TaskProcessorIntf {
 
    public AbstractTaskProcessor() {
    }
 
    public TaskResult execute(TaskParams params) {
        UIOSessionData sessionData = UIOContext.getCurrentInstance().getSessionData();
        
        if (params == null)
            params = new TaskParams();
        
        String validateSession = validateSession();
        if (validateSession != null) {
            List errorCodes = null;
            if (sessionData != null)
                    errorCodes = sessionData.getErrorCodes();
            
            return new TaskResult(validateSession, errorCodes);
        }
        
        String target = preProcess(params);
        if (!StringUtil.equalsIgnoreCase(target, TARGET_ERROR)){
            target = process(params, target);
        }
        
        target = postProcess(params, target);
        
        TaskResult result = new TaskResult(target, sessionData.getErrorCodes());
        result.setActionList(sessionData.getActionList());
        result.setChallengeType(UIOUtil.getCurrentChallengeType(sessionData));
        result.setChallengeQuestion(sessionData.getSecretQuestion());
        result.setRequestId(sessionData.getRequestId());
        result.setLoginId(sessionData.getLoginId());
        result.setCurrentAuthDevice(sessionData.getPreferences().getCurrentDevice());
        result.setCanSkipRegistration(sessionData.getPreferences().getCanSkipRegistration());
        // Update the sessionData object in session for replication.
        UIOSessionData.updateSession();
        return result;
    }
 
    protected String preProcess(TaskParams params) {
        return null;
    }
 
    abstract protected String process(TaskParams params, String target);
    
    protected String postProcess(TaskParams params, String target) {
        return target;
    }
    
    protected String validateSession(){
        String target = null;
        UIOSessionData sessionData = UIOContext.getCurrentInstance().getSessionData();
        
        if (sessionData == null){
            // Attempt to populate from context.
            sessionData = UIOContext.getCurrentInstance().getSessionData();
            if (sessionData == null){
                logger.info("SessionData is not found in session, so the session is expired or UIOContext not pupulated.");
                return TARGET_SESSION_EXPIRED;
            }
        }
 
        String customerId = sessionData.getCustomerId();
        VCryptAuthUser clientUser = sessionData.getClientAuthUser();
        
        if (clientUser == null && StringUtil.isEmpty(customerId)) {
            logger.info("Client User is not found in session, so the session is expired.");
            target = TARGET_SESSION_EXPIRED;
        } else if (clientUser == null && !StringUtil.isEmpty(customerId)) {
            logger.info("Client User is not found in session.");
            target = TARGET_ACCESS_DENIED;
        }
        
        return target;
 
    }
    
    public boolean isShow(TaskParams params){
        return StringUtil.equalsIgnoreCase(params.getAction(), TaskProcessorIntf.ACTION_SHOW);
    }
 
    public boolean isSubmit(TaskParams params){
        return StringUtil.equalsIgnoreCase(params.getAction(), TaskProcessorIntf.ACTION_SUBMIT);
    }
}

21.5.3 デフォルトのクラス

次のプロパティでは、デフォルトのタスク・プロセッサが定義されます。

bharosa.uio.default.task.processor.login = com.bharosa.uio.processor.task.LoginTaskProcessor
bharosa.uio.default.task.processor.jump = com.bharosa.uio.processor.task.JumpTaskProcessor
bharosa.uio.default.task.processor.password = com.bharosa.uio.processor.task.PasswordTaskProcessor
bharosa.uio.default.task.processor.challenge = com.bharosa.uio.processor.task.ChallengeUserTaskProcessor
bharosa.uio.default.task.processor.changePassword = com.bharosa.uio.processor.task.ChangePasswordTaskProcessor
bharosa.uio.default.task.processor.changeUsername = com.bharosa.uio.processor.task.ChangeUsernameTaskProcessor
bharosa.uio.default.task.processor.fingerprint = com.bharosa.uio.processor.task.FingerprintTaskProcessor
bharosa.uio.default.task.processor.logout = com.bharosa.uio.processor.task.LogoutTaskProcessor
bharosa.uio.default.task.processor.forgotPassword = com.bharosa.uio.processor.task.ForgotPasswordTaskProcessor
bharosa.uio.default.task.processor.checkpoint = com.bharosa.uio.processor.task.CheckpointTaskProcessor
bharosa.uio.default.task.processor.updateStatus = com.bharosa.uio.processor.task.UpdateAuthStatusTaskProcessor
bharosa.uio.default.task.processor.registerSummary = com.bharosa.uio.processor.task.RegisterSummaryTaskProcessor
bharosa.uio.default.task.processor.registerImagePhrase = com.bharosa.uio.processor.task.RegisterImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.registerQuestions = com.bharosa.uio.processor.task.RegisterQuestionsTaskProcessor
bharosa.uio.default.task.processor.registerUserInfo = com.bharosa.uio.processor.task.RegisterUserInfoTaskProcessor
bharosa.uio.default.task.processor.registerComplete = com.bharosa.uio.processor.task.RegisterCompleteTaskProcessor
bharosa.uio.default.task.processor.registerSkip = com.bharosa.uio.processor.task.RegisterSkipTaskProcessor
bharosa.uio.default.task.processor.userPrefsImagePhrase = com.bharosa.uio.processor.task.UserPreferencesImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.userPrefsQuestions = com.bharosa.uio.processor.task.UserPreferencesQuestionsTaskProcessor
bharosa.uio.default.task.processor.userPrefsUserInfo = com.bharosa.uio.processor.task.UserPreferencesUserInfoTaskProcessor
bharosa.uio.default.task.processor.userPrefsComplete = com.bharosa.uio.processor.task.UserPreferencesCompleteTaskProcessor
bharosa.uio.default.task.processor.transaction = com.bharosa.uio.processor.task.TransactionTaskProcessor
bharosa.uio.default.task.processor.updateTransactionStatus = com.bharosa.uio.processor.task.UpdateTransactionStatusTaskProcessor

*オプションのパラメータです。

表21-2 AbstractTaskProcessor

クラス名 パラメータ 結果 メモ

LoginTaskProcessor

LoginTaskProcessor.PARAM_LOGIN_ID

LoginTaskProcessor.PARAM_AUTH_STATUS*

ユーザー定義列挙bharosa.uio.<appId>.credentials.enum*によって定義された要素

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_ERROR

ログインIDでユーザーをロードします。

JumpTaskProcessor

JumpTaskProcessor.PARAM_OFFSET

JumpTaskProcessor.PARAM_JUMP

TaskProcessorIntf.TARGET_JUMP

TaskProcessorIntf.TARGET_UPDATE_STATUS

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_LOGIN

TaskProcessorIntf.TARGET_ERROR

OAAMセッションを作成します。

ブラウザのフィンガープリント処理を実行します。

認証前ルールを実行します。

FingerprintTaskProcessor

(UIOSesisonDataのFPデータ)

TaskProcessorIntf.TARGET_SUCCESS

デジタル・フィンガープリントを処理します(Flashまたはその他の外部フィンガープリント・リクエスト)。デバイス識別プロセッサを使用します。

PasswordTaskProcessor

PasswordTaskProcessor.PARAM_PASSWORD

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_RESET_PASSWORD

TaskProcessorIntf.TARGET_INVALID_USER

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

TaskProcessorIntf.TARGET_UPDATE_STATUS

パスワード送信を処理して、AuthManagerクラスを使用するユーザーを認証します。

ChallengeUserTaskProcessor

ChallengeUserTaskProcessor.PARAM_ANSWER

ChallengeUserTaskProcessor.PARAM_REGISTER_DEVICE

TaskProcessorIntf.TARGET_CHALLENGE

TaskProcessorIntf.TARGET_UPDATE_STATUS

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

実行されたチャレンジ・タイプに基づいたチャレンジ・プロセッサ・クラスを使用して、ユーザー・チャレンジを処理します。

UpdateAuthStatusTaskProcessor

UpdateAuthStatusTaskProcessor.PARAM_STATUS

UpdateAuthStatusTaskProcessor.PARAM_SECONDARY_GROUP

(認証後ルール・アクション)

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

OAAMのセッション・ステータスを更新します。

RegisterSummaryTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

登録サマリーが要求されるときに実行します。(即時利用可能な機能はない)

.

RegisterImageAndPhraseTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

オーセンティケータによる登録を処理します。イメージ、フレーズ、VADアップグレード/ダウングレード。

.

RegisterQuestionsTaskProcessor

RegisterQuestionsTaskProcessor.PARAM_QUESTION_COUNT

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ID_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_TEXT_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ANSWER_BASE+#

RegisterQuestionsTaskProcessor.PARAM_REGISTER_DEVICE*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

チャレンジ質問の登録の処理と検証を行います。

RegisterUserInfoTaskProcessor

ユーザー定義列挙によって定義された次の要素です。

bharosa.uio.<appId>.userinfo.inputs.enum

RegisterUserInfoTaskProcessor.PARAM_REGISTER_DEVICE*

RegisterUserInfoTaskProcessor.PARAM_OPTOUT*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

OTP連絡先情報の登録の処理と検証を行います。

RegisterCompleteTaskProcessor

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

登録フローの完了後にユーザー登録ステータスを更新します。

.

RegisterSkipTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

ユーザーが登録をスキップすることを許可されている場合、登録手順をスキップします。

.

UserPreferencesImageAndPhraseTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

オーセンティケータによる登録を処理します。イメージ、フレーズ、VADアップグレード/ダウングレード。

.

UserPreferencesQuestionsTaskProcessor

RegisterQuestionsTaskProcessor.PARAM_QUESTION_COUNT

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ID_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_TEXT_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ANSWER_BASE+#

RegisterQuestionsTaskProcessor.PARAM_REGISTER_DEVICE*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

チャレンジ質問の登録の処理と検証を行います。

UserPreferencesUserInfoTaskProcessor

ユーザー定義列挙によって定義された次の要素です。

bharosa.uio.<appId>.userinfo.inputs.enum

RegisterUserInfoTaskProcessor.PARAM_REGISTER_DEVICE*

RegisterUserInfoTaskProcessor.PARAM_OPTOUT*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

OTP連絡先情報の登録の処理と検証を行います。

UserPreferencesCompleteTaskProcessor

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

ユーザー・プリファレンス・フローの完了後にユーザー登録ステータスを更新します。

.

ForgotPasswordTaskProcessor

ForgotPasswordTaskProcessor.PARAM_PAGEID

TaskProcessorIntf.TARGET_FORGOT_PASSWORD

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NO_PROXY

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_FAIL

.

LogoutTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

ユーザー・セッションをリセットします。

.

CheckpointTaskProcessor

CheckpointTaskProcessor.PARAM_CHECKPOINT

存在しない場合は、sessionData.getCheckpoint()を使用します。

ルール・アクション結果

TaskProcessorIntf.TARGET_SUCCESS

パラメータとして渡されたチェックポイントまたはsessionDataで設定したチェックポイントを実行し、その結果を返します。

ChangePasswordTaskProcessor

ChangePasswordTaskProcessor.PARAM_PAGEID

ChangePasswordTaskProcessor.PARAM_PASSWORD_OLD

ChangePasswordTaskProcessor.PARAM_PASSWORD_NEW

ChangePasswordTaskProcessor.PARAM_PASSWORD_CONFIRM

TaskProcessorIntf.SUCCESS TaskProcessorIntf.TARGET_UPDATE_STATUS

TaskProcessorIntf.TARGET_CHANGE_PASSWORD

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

TaskProcessorIntf.TARGET_ERROR

パスワード・マネージャを使用してユーザー・パスワードを更新します。

ChangeUsernameTaskProcessor

ChangeUsernameTaskProcessor.PARAM_USERNAME_NEW

TaskProcessorIntf.SUCCESS

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

ユーザーのログインIDとユーザー名を更新します。

TransactionTaskProcessor

TransactionTaskProcessor.PARAM_TRANSACTION_TYPE

TransactionTaskProcessor.PARAM_CHECKPOINT

TransactionTaskProcessor.PARAM_EXTERNAL_TRANSACTION_ID

TransactionTaskProcessor.PARAM_AUTO_UPDATE(オプション、falseに設定されている場合はステータスの更新が回避される)

TransactionTaskProcessor.CHECKPOINT_NONE(オプション、trueに設定されている場合はチェックポイントの実行が回避される)

(トランザクション・ルール・アクション)

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

トランザクション前処理を実行し、トランザクション・チェックポイントを作成します。

UpdateTransactionStatusTaskProcessor

TransactionTaskProcessor.PARAM_TRANSACTION_TYPE

TransactionTaskProcessor.PARAM_CHECKPOINT

TransactionTaskProcessor.PARAM_EXTERNAL_TRANSACTION_ID

TransactionTaskProcessor.PARAM_STATIUS

TransactionTaskProcessor.CHECKPOINT_NONE(オプション、trueに設定されている場合はチェックポイントの実行が回避される)

(トランザクション・ルール・アクション)

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

更新前処理を実行し、トランザクション・チェックポイントを更新します。


21.5.4 タスク・プロセッサの登録

タスク・プロセッサでは、ユーザー名やパスワードの入力、チャレンジへの応答などのOAAMサーバー・ユーザー・タスクを処理するカスタムJavaクラスの使用が許可されています。

bharosa.uio.default.task.processor.login = com.bharosa.uio.processor.task.LoginTaskProcessor
bharosa.uio.default.task.processor.jump = com.bharosa.uio.processor.task.JumpTaskProcessor
bharosa.uio.default.task.processor.password = com.bharosa.uio.processor.task.PasswordTaskProcessor
bharosa.uio.default.task.processor.challenge = com.bharosa.uio.processor.task.ChallengeUserTaskProcessor
bharosa.uio.default.task.processor.changePassword = com.bharosa.uio.processor.task.ChangePasswordTaskProcessor
bharosa.uio.default.task.processor.changeUsername = com.bharosa.uio.processor.task.ChangeUsernameTaskProcessor
bharosa.uio.default.task.processor.fingerprint = com.bharosa.uio.processor.task.FingerprintTaskProcessor
bharosa.uio.default.task.processor.logout = com.bharosa.uio.processor.task.LogoutTaskProcessor
bharosa.uio.default.task.processor.forgotPassword = com.bharosa.uio.processor.task.ForgotPasswordTaskProcessor
bharosa.uio.default.task.processor.checkpoint = com.bharosa.uio.processor.task.CheckpointTaskProcessor
bharosa.uio.default.task.processor.updateStatus = com.bharosa.uio.processor.task.UpdateAuthStatusTaskProcessor
bharosa.uio.default.task.processor.registerSummary = com.bharosa.uio.processor.task.RegisterSummaryTaskProcessor
bharosa.uio.default.task.processor.registerImagePhrase = com.bharosa.uio.processor.task.RegisterImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.registerQuestions = com.bharosa.uio.processor.task.RegisterQuestionsTaskProcessor
bharosa.uio.default.task.processor.registerUserInfo = com.bharosa.uio.processor.task.RegisterUserInfoTaskProcessor
bharosa.uio.default.task.processor.registerComplete = com.bharosa.uio.processor.task.RegisterCompleteTaskProcessor
bharosa.uio.default.task.processor.registerSkip = com.bharosa.uio.processor.task.RegisterSkipTaskProcessor
bharosa.uio.default.task.processor.userPrefsImagePhrase = com.bharosa.uio.processor.task.UserPreferencesImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.userPrefsQuestions = com.bharosa.uio.processor.task.UserPreferencesQuestionsTaskProcessor
bharosa.uio.default.task.processor.userPrefsUserInfo = com.bharosa.uio.processor.task.UserPreferencesUserInfoTaskProcessor
bharosa.uio.default.task.processor.userPrefsComplete = com.bharosa.uio.processor.task.UserPreferencesCompleteTaskProcessor
bharosa.uio.default.task.processor.transaction = com.bharosa.uio.processor.task.TransactionTaskProcessor
bharosa.uio.default.task.processor.updateTransactionStatus = com.bharosa.uio.processor.task.UpdateTransactionStatusTaskProcessor

21.6 特殊プロセッサ

この項では、次の項目について説明します。

21.6.1 チェックポイント・プロセッサ

チェックポイント・プロセッサでは、特定のチェックポイントの実行時にカスタムJavaクラスを実行することが許可されています。このプロパティには次の書式を使用します。

bharosa.uio.<appId>.checkpoint.processor.<checkpoint>= <fully qualified class name>

次のプロパティを使用して、チェックポイント・プロセッサがアプリケーションに登録されます。

bharosa.uio.default.checkpoint.processor.default = com.bharosa.uio.processor.checkpoint.DefaultCheckpointProcessor
bharosa.uio.default.checkpoint.processor.preauth = com.bharosa.uio.processor.checkpoint.PreAuthCheckpointProcessor
bharosa.uio.default.checkpoint.processor.postauth = com.bharosa.uio.processor.checkpoint.PostAuthCheckpointProcessor
bharosa.uio.default.checkpoint.processor.ChallengeUser = com.bharosa.uio.processor.checkpoint.ChallengeCheckpointProcessor
bharosa.uio.default.checkpoint.processor.ForgotPassword = com.bharosa.uio.processor.checkpoint.ForgotPasswordCheckpointProcessor
bharosa.uio.default.checkpoint.processor.authentiPad = com.bharosa.uio.processor.checkpoint.AuthentiPadCheckpointProcessor

チェックポイント・プロセッサが定義されていない場合、デフォルトのチェックポイント・プロセッサが使用されます。デフォルトのチェックポイント・プロセッサは、同様のプロパティで定義されます。

bharosa.uio.<appId>.checkpoint.processor.default= <fully qualified class name>

各チェックポイント・プロセッサでは、CheckpointProcessorIntfインタフェースを実装する必要があります。

public interface CheckpointProcessorIntf{
 
  public String processCheckpoint(UIOSessionData sessionData, VCryptRulesResult rulesResult);
  
}

各カスタム・チェックポイント・プロセッサでは、DefaultCheckpointProcessorクラスを拡張することをお薦めします。デフォルトのチェックポイント・プロセッサには、チェックポイントの処理に役立つ便利なメソッドが用意されています。

/**
 * Default checkpoint handling
 * 
 * Instanciates and executes appropriatlely configured RulesResultProcessors
 */
public class DefaultCheckpointProcessor implements CheckpointProcessorIntf{
  
  static Logger logger = Logger.getLogger(DefaultCheckpointProcessor.class);
 
  /**
   * @param sessionData
   * @param rulesResult
   * @return
   */
  protected RulesResultProcessorIntf getResultProcessor(UIOSessionData sessionData, VCryptRulesResult rulesResult){
    if (rulesResult == null || rulesResult.getResult() == null){
      logger.info("getResultProcessor :: Rules Result null - Using default rules result processor.");
      return getDefaultResultProcessor(sessionData);
    }
    
    String resultName = rulesResult.getResult();
    
    return UIOUtil.getRulesResultProcessor(sessionData, resultName);
  }
 
  /**
   * @param sessionData
   * @return
   */
  protected RulesResultProcessorIntf getDefaultResultProcessor(UIOSessionData sessionData){
    return UIOUtil.getRulesResultProcessor(sessionData, "default");
  }
 
  /**
   * @param checkpointType
   * @return
   */
  protected String getCheckpointId(int checkpointType){
    String checkpointId = null;
    UserDefEnumElement checkpointElem = UserDefEnum.getElement(BharosaUIOConstants.ENUM_PROFILE_TYPE, checkpointType);
    if (checkpointElem != null)
      checkpointId = checkpointElem.getElementId();
    
    return checkpointId;
  }
 
  /**
   * @param sessionData
   * @param rulesResult
   * @return
   */
  public String processCheckpoint(UIOSessionData sessionData, VCryptRulesResult rulesResult){
 
    if (logger.isDebugEnabled()) logger.debug("DefaultCheckpointProcessor::processCheckpoint() entered.");
 
    List actionList = rulesResult.getAllActions();
    sessionData.setActionList(actionList);
    
    RulesResultProcessorIntf rulesResultProcessor = getResultProcessor(sessionData, rulesResult);
    if (rulesResultProcessor == null){
      logger.error("processCheckpoint :: rulesResultProcessor is null.");
      return Preferences.ACTION_ERROR;
    }
 
    return rulesResultProcessor.processRulesResult(sessionData, rulesResult);
  }
  
}

21.6.2 ルール結果プロセッサ

ルール結果プロセッサでは、ルール・エンジンによって特定のルール・アクションが返されるときにカスタムJavaクラスを実行することが許可されています。このプロパティには次の書式を使用します。

bharosa.uio.<appId>. rules.result.processor.<rule action>= <fully qualified class name>

次のプロパティを使用して、ルール結果プロセッサがアプリケーションに登録されます。

bharosa.uio.default.rules.result.processor.default = com.bharosa.uio.processor.rules.result.DefaultRulesResultProcessor
bharosa.uio.default.rules.result.processor.Password = com.bharosa.uio.processor.rules.result.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.Challenge = com.bharosa.uio.processor.rules.result.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.Register = com.bharosa.uio.processor.rules.result.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegistrationRequired = com.bharosa.uio.processor.rules.result.RegistrationRequiredRulesResultProcessor

ルール結果プロセッサが定義されていない場合、デフォルトのルール結果プロセッサが使用されます。デフォルトのルール結果プロセッサは、同様のプロパティで定義されます。

bharosa.uio.<appId>. rules.result.processor.default= <fully qualified class name>

各ルール結果プロセッサでは、RulesResultProcessorIntfインタフェースを実装する必要があります。

public interface RulesResultProcessorIntf{  public String processRulesResult(UIOSessionData sessionData, VCryptRulesResult rulesResult);  } 

各カスタム・チェックポイント・プロセッサでは、DefaultRulesResultProcessorクラスを拡張することをお薦めします。デフォルトのルール結果プロセッサには、ルール結果の処理に役立つ便利なメソッドが用意されています。

/**
 * Default handling of rule results
 */
public class DefaultRulesResultProcessor implements RulesResultProcessorIntf{
 
  static Logger logger = Logger.getLogger(DefaultRulesResultProcessor.class);
 
  /**
   * Process rules results, updating user status as defined by VCryptRulesResul object.
   * 
   * @param sessionData
   * @param rulesResult
   * @return
   */
  public String processRulesResult(UIOSessionData sessionData, VCryptRulesResult rulesResult){
 
    if (logger.isDebugEnabled()) logger.debug("DefaultRulesResultProcessor::processRulesResult() entered.");
    
    if (rulesResult == null)
      return null;
    
    if (rulesResult.getResult() == null){
      if (logger.isDebugEnabled()) logger.debug("DefaultRulesResultProcessor.processRulesResult(): rules result is null.");
      return Preferences.ACTION_NONE;
    }
    
    Preferences prefs = sessionData.getPreferences();
    String ruleAction = rulesResult.getResult();
    int authStatus = sessionData.getAuthResult();
    int newStatus = authStatus;
    
    UserDefEnumElement actionElement = UserDefEnum.getElement(IBharosaConstants.ENUM_RULE_ACTION_ID, ruleAction);
    String overRideStatus = actionElement.getProperty("authStatus");
    
    if (!StringUtil.isEmpty(overRideStatus)) {
        if (logger.isDebugEnabled())
            logger.debug("Overriding authStatus from action. action=" +
                         ruleAction + ", authSatus=" +
                         overRideStatus);
        newStatus = Integer.parseInt(overRideStatus);
    }
 
    String device = prefs.getCurrentDevice();
    int clientType = UIOUtil.CLIENT_TYPE_LOGIN;
    if (!StringUtil.isEmpty(device)){
      if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_TEXTPAD)) {
          clientType = UIOUtil.CLIENT_TYPE_TEXTPAD;
      } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_KEYPAD_FULL) ||
          device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_KEYPAD_ALPHA)) {
          clientType = UIOUtil.CLIENT_TYPE_KEYPAD;
      } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_HTML_CONTROL)) {
          clientType = UIOUtil.CLIENT_TYPE_NORMAL;
      } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_QUESTIONPAD)) {
          clientType = UIOUtil.CLIENT_TYPE_QUESTIONPAD;
      } else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_PINPAD)) {
          clientType = UIOUtil.CLIENT_TYPE_PINPAD;
      }
    }
    
    sessionData.setClientType(clientType);
 
    if (newStatus != authStatus) {
      //Update tracker if status has changed
      sessionData.setAuthResult(newStatus);
      UIOUtil uioUtil = UIOUtil.instance();
      
      try {
        uioUtil.updateAuthStatus(sessionData, sessionData.getClientType(), newStatus);
      } catch (BharosaProxyException bpe){
        logger.error("Failed to update auth status to " + newStatus + " while processing ruleAction = " + ruleAction, bpe);
      }
    }
    
    return ruleAction;
  }
  
}

21.6.3 レガシー・ルール結果プロセッサ

レガシー・ルール結果プロセッサでは、10gポリシーがサポートされています。プロパティは次のとおりです。

bharosa.uio.default.rules.result.processor.PasswordTextPadGeneric = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordTextPad = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordKeypad = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordKeypadFull = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordHTML = com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
 
bharosa.uio.default.rules.result.processor.RegisterUserOptionalQuestionPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserQuestionPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserOptionalTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUser = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserOptional = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterQuestionsQuestionPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterQuestionsTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterQuestions = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterImageTextPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterImageKeyPad = com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
 
bharosa.uio.default.rules.result.processor.ChallengeQuestionPad = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeSMS = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeEmail = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeIM = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeVoice = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeQuestion = com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor

21.7 チャレンジ・プロセッサ

OAAMサーバーでは、チャレンジ・メカニズムのカスタム実装を可能にするチャレンジ・プロセッサ・フレームワークが提供されています。

21.7.1 チャレンジ・プロセッサとは

チャレンジ・プロセッサは、チャレンジに対して次のタスクを実行するために作成できます。

  • ユーザーに送信するチャレンジ秘密(パスワード)の生成。

  • ユーザーの回答の検証。

  • 配信の待機ページの制御(必要な場合)。

  • 配信サービスが使用可能かどうかの確認(必要な場合)。

たとえば、SMSを使用するには、秘密のPINを生成し、送信ステータスやクラス(チャレンジ・タイプによってコールされている)のステータスを確認するメソッドを実装する必要があります。

チャレンジ・プロセッサは、ChallengeProcessorIntfインタフェースを実装するか、AbstractChallengeProcessorクラスを拡張するJavaコードです。

21.7.2 チャレンジ・プロセッサの作成方法

この項では、実装するチャレンジ・プロセッサのクラスとメソッドについて説明します。参考用に実装例も紹介されています。

21.7.2.1 クラス

チャレンジ・プロセッサを実装するには、次のクラスを拡張する必要があります。

com.bharosa.uio.processor.challenge.AbstractChallengeProcessor 

後で、$ORACLE_IDM_HOME\oaam\cli\libフォルダのoaam.jarをビルド・クラスパスに追加して、このコードをコンパイルします。

Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

21.7.2.2 メソッド

チャレンジ・プロセッサで使用されるメソッドは、後述の各項で示されています。

表21-3 チャレンジ・プロセッサのメソッド

メソッド 説明

protected boolean generateSecret(UIOSessionData sessionData, boolean isRetry)

このメソッドは、クライアントに送信するコードの生成に使用されます。

protected boolean validateAnswer(UIOSessionData sessionData, String answer)

このメソッドは、ユーザーの回答の検証に使用されます。

public String checkDeliveryStatus(UIOSessionData sessionData, boolean userWaiting, boolean isRetry)

このメソッドは、メッセージが送信されるまで待機させるために使用されます。

public boolean isServiceAvailable(UIOSessionData sessionData)

このメソッドは、外部サービスが使用可能かどうかの確認に使用されます。


21.7.2.3 例: 電子メール・チャレンジ・プロセッサの実装

電子メール・チャレンジ・プロセッサの実装は次のとおりです。

package oracle.oaam.challenge.processor.challenge;
 
import com.bharosa.common.util.*;
import com.bharosa.uio.util.UIOUtil;
import com.bharosa.uio.util.UIOSessionData;
 
import com.bharosa.common.logger.Logger;
 
import java.io.Serializable;
 
/**
 * Email Challenge Processor - provides OTP Code generation, delivery and validation
 */
public class EmailChallengeProcessor extends com.bharosa.uio.processor.challenge.AbstractOTPChallengeProcessor implements Serializable{
 
  static Logger logger = Logger.getLogger(EmailChallengeProcessor.class);
 
  public EmailChallengeProcessor( ) {
  }
 
  /**
   * Generates OTP Code and stores it in sessionData
   * 
   * @param sessionData data object available for the session
   * @param isRetry boolean value if method was called as a result of a failed answer attempt
   * @return 
   */
  protected boolean generateSecret(UIOSessionData sessionData, boolean isRety) {
   String otpCode = sessionData.getOTPCode(); 
 
// If no secret code is present in session, generate one.
    if (StringUtil.isEmpty(otpCode)) {
      if (logger.isDebugEnabled())
        logger.debug("ChallengeEmail generating security code for user: " +
                     sessionData.getCustomerId());
      otpCode = generateCode(sessionData);
 
      // save the code for later reference - validate / resend
      sessionData.setOTPCode(otpCode);
    }
 
    if (logger.isDebugEnabled())
      logger.debug("OTP code for user " + sessionData.getCustomerId() + " : " + otpCode);
 
    if (StringUtil.isEmpty(otpCode)) {
      logger.error("Email Challenge pin generation returned null.");
      return false;
    }
        // isRetry flag is turned on if user fails to answer the question
    if (!isRetry) {       
      return sendCode(sessionData);
    }
    
    return true;
  }
 
  /**
   * Validate user entered answer against value in sessionData
   * 
   * @param sessionData validate code and return result.
   * @param answer answer provided by the user
   * @return
   */
  protected boolean validateAnswer(UIOSessionData sessionData, String answer){
    //need to authenticate OTP Code
    String otpCode = sessionData.getOTPCode();
    
    if (otpCode != null && otpCode.equals(answer)) {
      // Expire OTP Code
      sessionData.setOTPCode(null);
      return true;
    }
    
    return false;
  }
 
  /**
   * Private methods to send secret code to client
   * 
   * @param sessionData
   * @return
   */
  private boolean sendCode(UIOSessionData sessionData){
    String otpCode = sessionData.getOTPCode();
 
    try {
      // UIOUtil.getOTPContactInfo fetches the information registered by the user. Refer to ChallengeEmail.requiredInfo in configuration.
      String toAddr = UIOUtil.getOTPContactInfo(sessionData, "email");
      if (StringUtil.isEmpty(toAddr)) {
        logger.error("No user email in profile.");
         return false;  
      }
 
      // Send secret code to customer using your email provider
 
    } catch (Exception ex) {
        logger.error("ChallengeEmail Error sending code.", ex);
        return false;
    }
    
    return true;
  }
  
  public String checkStatus(UIOSessionData sessionData, boolean userWaiting, boolean isRetry) {
    String target = ChallengeProcessorIntf.TARGET_WAIT;
    // user already has code, trying again - send to challenge page
    if (isRetry){ 
      return ChallengeProcessorIntf.TARGET_CHALLENGE;
    }
    
    boolean sendComplete = false;
    if (userWaiting){
      // if secret code is sent set target to 
      target = ChallengeProcessorIntf.TARGET_CHALLENGE;
      // failed to send
      target = ChallengeProcessorIntf.TARGET_ERROR;
      // still processing    
      target = ChallengeProcessorIntf.TARGET_WAIT;   
    }    
    return target;
  }
}

21.7.2.4 秘密(PIN)の実装

AbstractOTPChallengeProcessorクラスには、ユーザーが独自のPIN生成ロジックを提供するためにオーバーライドできる、デフォルトのPIN生成メソッドgenerateCodeが用意されています。

21.7.3 チャレンジ・プロセッサの配信チャネル・タイプの定義

この項では、ユーザーにチャレンジするために使用するチャレンジ・プロセッサの配信チャネル・タイプを定義する手順について説明します。参考用に例が紹介されています。

21.7.3.1 チャレンジ・タイプ列挙

チャレンジ・タイプは、列挙challenge.type.enumによって構成されます。実際の列挙値は次のとおりです。

bharosa.uio.<application>. challenge.type.enum.<challenge type>

次に例を示します。

bharosa.uio.default.challenge.type.enum.ChallengeEmail

チャレンジ・タイプ列挙は、チャレンジ・タイプを(そのチャレンジ・タイプの関連作業を実行するために必要な)Javaコードに関連付けるのに使用されます。電子メール・チャレンジ・プロセッサの実装例については、第21.7.2.3項「例: 電子メール・チャレンジ・プロセッサの実装」を参照してください。

チャレンジ・タイプID(ChallengeEmailなど)は、そのチャレンジ・タイプの使用時にルールによって返されるルール・アクションと一致する必要があります。ChallengeEmailのルール・アクションはrule.action.enum.ChallengeEmailです。ルール・アクションとして、電子メールを使用し、かつ電子メールの配信チャネルを使用しているユーザーにチャレンジすることになります。通常、チャネルは、ユーザーへの送信に使用する配信チャネルのことを指します。

21.7.3.2 例: OTPチャネル・タイプの定義

チャレンジ・タイプを定義するには、次のプロパティを使用します。

bharosa.uio.default.challenge.type.enum.MyChallenge

プロパティのdefaultはUIOアプリケーション名で、MyChallengeは追加されるチャレンジ・タイプです。次の例のチャレンジ・タイプはChallengeEmailです。

bharosa.uio.default.challenge.type.enum.ChallengeEmail

ルール・アクションとして、電子メールを使用し、かつ電子メールの配信チャネルを使用しているユーザーにチャレンジすることになります。

rule.action.enum.ChallengeEmail

チャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。

bharosa.uio.default.challenge.type.enum.MyChallenge.available = false 

表21-4 チャレンジ・タイプのフラグ

プロパティ 説明

available

チャレンジ・タイプが使用可能(サービスが準備され構成されている)かどうか。OTPチャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。

processor

このタイプのチャレンジを処理するためのJavaクラス。

requiredInfo

登録入力列挙からの入力のカンマ区切りリスト。


availableフラグの設定は、enabledフラグの設定とは異なります。enabledフラグは、リストから削除してしまいます。

チャネル・タイプの定義の例

bharosa.uio.default.challenge.type.enum属性の値の例は次のとおりです。

bharosa.uio.default.challenge.type.enum.MyChallenge = 1  // unique value to identify Challenge Email in bharosa.uio.default.challenge.type.enum

bharosa.uio.default.challenge.type.enum.MyChallenge.name = MyChallenge //  unique string to identify Challenge Email in bharosa.uio.default.challenge.type.enum, no spaces

bharosa.uio.default.challenge.type.enum.MyChallenge.description = Email Challenge // descriptive name

bharosa.uio.default.challenge.type.enum.MyChallenge.processor = oracle.oaam.challenge.processor.challenge.EmailChallengeProcessor  // Processor used for sending emails instance of com.bharosa.uio.processor.challenge.ChallengeProcessorIntf

bharosa.uio.default.challenge.type.enum.MyChallenge.requiredInfo = email  // comma separated field names, User registration flow captures these data fields, check Contact information Inputs section to define this enum

bharosa.uio.default.challenge.type.enum.MyChallenge.available = false // to turn off this service

bharosa.uio.default.challenge.type.enum.MyChallenge.otp = true // indicates this challenge is used for OTP, set it to true

電子メールの例

bharosa.uio.default.challenge.type.enum.ChallengeEmail = 1
bharosa.uio.default.challenge.type.enum.ChallengeEmail.name = Email Challenge
bharosa.uio.default.challenge.type.enum.ChallengeEmail.description = Email Challenge
bharosa.uio.default.challenge.type.enum.ChallengeEmail.processor =
com.bharosa.uio.processor.challenge.EmailChallengeProcessor
bharosa.uio.default.challenge.type.enum.ChallengeEmail.requiredInfo = mobile
bharosa.uio.default.challenge.type.enum.ChallengeEmail.available = true
bharosa.uio.default.challenge.type.enum.ChallengeEmail.enabled = true

SMSの例

bharosa.uio.default.challenge.type.enum.ChallengeSMS = 2
bharosa.uio.default.challenge.type.enum.ChallengeSMS.name = SMS Challenge
bharosa.uio.default.challenge.type.enum.ChallengeSMS.description = SMS Challenge
bharosa.uio.default.challenge.type.enum.ChallengeSMS.processor =
com.bharosa.uio.processor.challenge.SmsChallengeProcessor
bharosa.uio.default.challenge.type.enum.ChallengeSMS.requiredInfo = mobile
bharosa.uio.default.challenge.type.enum.ChallengeSMS.available = true
bharosa.uio.default.challenge.type.enum.ChallengeSMS.enabled = true

21.7.4 ユーザー入力プロパティの構成

ユーザー情報プロパティの構成手順は、次の各項で説明されています。

Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

21.7.4.1 登録とプリファレンスの入力の有効化

登録とプリファレンスの入力を有効化するためのデフォルトの構成は次のとおりです。

連絡先情報の登録

bharosa.uio.default.register.userinfo.enabled=false

連絡先情報のプリファレンス

bharosa.uio.default.userpreferences.userinfo.enabled=false

21.7.4.2 連絡先情報の入力の設定

ユーザー情報登録とユーザー・プリファレンスがtrueの場合、入力情報を構成します。

連絡先情報の入力はuserinfo.inputs.enumに定義されています。列挙要素は次のとおりです。

bharosa.uio.<application>.userinfo.inputs.enum.<inputname>

表21-5 連絡先入力のプロパティ

プロパティ 説明

inputname

HTML形式の入力フィールドに使用される名前。

inputtype

テキスト入力またはパスワード入力用に設定されます。

maxlength

ユーザー入力の最大長。

required

フィールドが登録ページで必須である場合に設定されます。

order

ユーザー・インタフェースに表示される順序。

regex

このフィールドのユーザー入力を検証するために使用される正規表現。

errorCode

検証エラー・メッセージ(bharosa.uio.<application ID>.error.<errorCode>)を参照するために使用されるエラー・コード。

managerClass

com.bharosa.uio.manager.user.UserDataManagerIntfを実装するJavaクラス(Oracle Adaptive Access Managerデータベースにデータを格納する場合、このプロパティはcom.bharosa.uio.manager.user.DefaultContactInfoManagerに設定される必要があります)。


電子メール入力の例

bharosa.uio.default.userinfo.inputs.enum.email=1
bharosa.uio.default.userinfo.inputs.enum.email.name=Email Address
bharosa.uio.default.userinfo.inputs.enum.email.description=Email Address
bharosa.uio.default.userinfo.inputs.enum.email.inputname=email
bharosa.uio.default.userinfo.inputs.enum.email.inputtype=text
bharosa.uio.default.userinfo.inputs.enum.email.maxlength=40
bharosa.uio.default.userinfo.inputs.enum.email.required=true
bharosa.uio.default.userinfo.inputs.enum.email.order=2
bharosa.uio.default.userinfo.inputs.enum.email.enabled=true
bharosa.uio.default.userinfo.inputs.enum.email.regex=.+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}
bharosa.uio.default.userinfo.inputs.enum.email.errorCode=otp.invalid.email
bharosa.uio.default.userinfo.inputs.enum.email.managerClass=com.bharosa.uio.manager.user.DefaultContactInfoManager

21.7.5 各チャレンジ・タイプで使用されるチャレンジ・パッドの構成

デフォルトでは、使用されるチャレンジ・デバイスはルールを使用して構成されています。ルールはAuthentiPadチェックポイントの下に存在し、これにより、デバイスの目的に基づいて使用するデバイスのタイプを指定できます。

注意: Authentipadチェックポイントをバイパスした後、プロパティを使用してどの仮想デバイスを使用するかを決定しても、モバイル・ブラウザでのチャレンジに別のデバイスは使用できません。PinPadやKeyPadなどの一部の仮想デバイスは、モバイル・ブラウザでの使用に適していません。

チャレンジ・タイプを使用するポリシーを作成または更新する手順は次のとおりです。

  1. 列挙rule.action.enumを指定する新しいルール・アクションMyChallengeを追加します。

  2. 新規作成されたアクションMyChallengeを戻すポリシーを作成して、チャレンジ・メソッドを使用します。

または、プロパティを使用してチャレンジ・デバイスを構成する場合、bharosa.uio.default.use.authentipad.checkpointfalseに設定して、AuthentiPadチェックポイントをバイパスできます。

チャレンジ・タイプで使用するデバイスを追加できます。

bharosa.uio.<application>.<challengeType>.authenticator.device=<value>

次の例では、チャレンジ・タイプ・キーのChallengeEmailChallengeSMSを使用してプロパティ名を作成しています。

bharosa.uio.default.ChallengeSMS.authenticator.device=DevicePinPad
bharosa.uio.default.ChallengeEmail.authenticator.device=DevicePinPad

使用可能なチャレンジ・デバイス値はDeviceKeyPadFullDeviceKeyPadAlphaDeviceTextPadDeviceQuestionPadDevicePinPadおよびDeviceHTMLControlです。

表21-6 認証デバイス・タイプ

プロパティ 説明

None

HTMLページまたは認証パッドはありません。

DeviceKeyPadFull

KeyPadを使用してユーザーにチャレンジします。

DeviceKeyPadAlpha

英数字KeyPad(数字と文字のみで特殊文字は含みません)を使用して、ユーザーにチャレンジします。

DeviceTextPad

TextPadを使用してユーザーにチャレンジします。

DeviceQuestionPad

QuestionPadを使用してユーザーにチャレンジします。

DevicePinPad

PinPadを使用してユーザーにチャレンジします。

DeviceHTMLControl

認証パッドのかわりにHTMLページを使用して、ユーザーにチャレンジします。


21.8 プロバイダ登録

プロバイダでは、認証およびパスワード管理を処理するカスタムJavaクラスの使用が許可されています。

21.8.1 認証マネージャ

認証マネージャを使用すると、外部認証サービスとのカスタム統合を実現できます。

認証マネージャのカスタム実装では、com.bharosa.uio.manager.auth.AuthManagerIntfインタフェースを実装するcom.bharosa.uio.manager.auth.AbstractAuthManagerクラスを拡張する必要があります。認証マネージャはcom.bharosa.uio.manager.auth.AuthResultオブジェクトを返します。

このプロバイダに任意の数のアプリケーションIDを登録するか、統合プロセッサのgetAuthManagerクラスをオーバーライドすることができます。

カスタム・プロバイダを登録するには、次のプロパティを設定します。

bharosa.uio.default.password.auth.provider.classname = com.bharosa.uio.manager.auth.DummyAuthManager

AbstractAuthManagerAuthManagerIntfインタフェースを実装して、ユーザー認証を実行します。

表21-7 AbstractAuthManager

メソッド 説明

public AuthResult authenticate(VCryptAuthUser authUser, String password, Hashtable appContext) throws Exception

内部ロギングを実行し、authenticateUserメソッドをコールします。

protected abstract AuthResult authenticateUser(VCryptAuthUser authUser, String password, Hashtable appContext) throws Exception

UIOSessionDataからOAAMユーザー・オブジェクト、パスワードおよびアプリケーション・コンテキストを取得する抽象メソッド・シグネチャ。このメソッドの実装では、外部認証サービスをコールしてAuthResultオブジェクトを作成してから、そのオブジェクトを戻す必要があります。


21.8.2 パスワード・マネージャ

パスワード・マネージャ・クラスでは、パスワード管理のカスタム処理が実行できます。カスタム・パスワード管理の実装では、com.bharosa.uio.manager.user.PasswordManagerIntfインタフェースを実装する必要があります。

パスワード・マネージャでは、パスワード変更やパスワード設定のカスタマイズ、およびパスワードの書式要件を示すためにユーザーに対して表示されるパスワード・ポリシー・テキストの取得が可能です。

このプロバイダに任意の数のアプリケーションIDを登録するか、統合プロセッサのgetPasswordManagerクラスをオーバーライドすることができます。OAAMのデフォルトの実装はプレースホルダにすぎないため、実際のパスワード管理は実行されません。

プロパティを使用してカスタム・プロバイダを登録するには、次のように設定します。

bharosa.uio.default.user.management.provider.classname = com.bharosa.uio.manager.user.DefaultPasswordManager

PasswordManagerIntfは、パスワード・マネージャを実装するためのインタフェースです。

表21-8 PasswordManagerIntf

メソッド 説明

public VCryptResponse changePassword(UIOSessionData sessionData, String oldPasswd, String newPasswd, String confirmPasswd)

既存のパスワードのかわりに新しいパスワードの設定を求める外部サービスのコールを可能にします。パスワードの変更に使用されます。

public VCryptResponse setPassword(UIOSessionData sessionData, String password)

既存のパスワードを必要としない外部サービスのコールを可能にします。パスワードを忘れた場合のフローなど、パスワードのリセットに使用されます。

public VCryptObjectResponse<String[]> getPasswordPolicyText(UIOSessionData sessionData)

パスワード変更またはパスワードのリセットのページで、カスタム・パスワード・ポリシーのテキスト表示を可能にします。ユーザーが確認する必要のある任意のメッセージを設定できますが、本来はユーザーにパスワードの書式と制約を知らせるためのものです。


21.8.3 ユーザー・データ・マネージャ

ユーザー・データ・マネージャでは、アクセスのカスタマイズと、携帯電話番号や電子メール・アドレスなどのユーザー・プロファイル・データの管理が可能です。デフォルトでは、OAAMによってOAAMデータベースのユーザー・データが格納および取得されます。ユーザー・データ・マネージャのカスタム実装を使用すると、統合で外部サービスをコールできます。

ユーザー・データで外部サービスを使用する場合、OAAMデータベースで、設定されるユーザー・データの有無を追跡するために使用されるフラグを設定することをお薦めします。

ユーザー・データ・マネージャをカスタマイズするには、com.bharosa.uio.manager.user.DefaultContactInfoManagerクラスを拡張することをお薦めします。このクラスは、com.bharosa.uio.manager.user.UserDataManagerIntfインタフェースを実装します。

ユーザー・データ・フィールドごとに異なるユーザー・データ・マネージャを使用できます。これにより、必要に応じて各データ要素を別の外部サービスで保持できます。デフォルトでは、すべてのユーザー・データ・フィールドで同一のデータ・マネージャが使用されます。

カスタムのユーザー・データ・マネージャを登録するには、userinfo.inputs列挙のmanagerClassプロパティを設定します。

例: bharosa.uio.default.userinfo.inputs.enum.mobile.managerClass=com.bharosa.uio.manager.user.DefaultContactInfoManager

UserDataManagerIntfは、ユーザー・データを格納または取得するためのユーザー・データ・マネージャ・インタフェースです。

表21-9 UserDataManagerIntf

メソッド 説明

public String getUserData(UIOSessionData sessionData, String key)

キーのユーザー・データ値を取得します。

public void setUserData(UIOSessionData sessionData, String key, String value)

キーのユーザー・データ値を設定します。


DefaultContactInfoManager: ユーザー・データ・マネージャのデフォルトの実装。この実装では、データ値の設定と、値が設定されていることを示すフラグの設定が分割されます。

表21-10 DefaultContactInfoManager

メソッド 説明

public String getUserData(UIOSessionData sessionData, String key)

getUserDataFlagがtrueを戻す場合、getUserDataValueをコールします。

public void setUserData(UIOSessionData sessionData, String key, String value)

キーと値のsetUserDataValueおよびsetUserDataFlagをコールします。

protected String getUserDataValue(UIOSessionData sessionData, String key)

OAAMデータベースから、キーの値を取得します。

protected void setUserDataValue(UIOSessionData sessionData, String key, String value)

OAAMデータベースにキーの値を設定します。

protected boolean getUserDataFlag(UIOSessionData sessionData, String key)

OAAMデータベースで所定のキーのフラグが設定されている場合にtrueを返します。

protected void setUserDataFlag(UIOSessionData sessionData, String key, String value)

ユーザー・データ・キーに対して値が設定されているかどうかを示すフラグを設定します。渡された値が空の場合、フラグが消去されます。