ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Access Management開発者ガイド
11g リリース2 (11.1.2.2.0) for All Platforms
B69537-08
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

10 AndroidクライアントSDKを使用したモバイル・サービス・アプリケーションの開発

この章では、AndroidクライアントSDKを使用してモバイル・サービス・アプリケーションを開発する方法について説明します。このSDKは、Androidデバイス向けのセキュアなモバイル・アプリケーションを開発するためのセキュリティ・レイヤーとして機能します。このSDKを使用することにより、認証、認可、ユーザー・プロファイル・サービスおよびセキュアな記憶域を制御でき、アプリケーションの開発が簡素化されます。Mobile and Social AndroidクライアントSDKによってサポートされるAndroidのバージョンはAndroid 2.2以上です。この章の内容は次のとおりです。

10.1 AndroidクライアントSDKのスタート・ガイド

このSDK (oamms_sdk_for_android.zip)は、Oracle Access Management配布パッケージに含まれており、Oracle Technical Network (OTN) Webサイトからダウンロードすることもできます。

この開発者ガイドの他に、SDKでは、HTML形式のAPIドキュメントが提供されています。APIクラス、インタフェース、コンストラクタ、メソッドおよびフィールドの説明については、APIドキュメントを参照してください。

モバイルAndroidクライアントSDKはライブラリ・プロジェクトとして提供されます。これには、次の5つのモジュールが含まれています。

  • 認証モジュール: ユーザー、デバイスおよびアプリケーションのかわりに認証リクエストを処理します。

  • ユーザー・ロール・モジュール: ユーザーおよびアプリケーションが構成されたアイデンティティ・ストアからユーザーおよびグループ詳細を取得できるようにするユーザー・プロファイル・サービスを提供します。

  • RESTハンドラ・モジュール: REST Webサービスへのアクセス、およびAccess Managerによって保護されたREST Webサービスに対するトークンの自動注入の機能を提供します。

  • 暗号化モジュール: ハッシング、暗号化、復号化などの暗号化タスクを実行するための簡易的なAPIを提供します。

  • セキュア・ストレージ・モジュール: Androidの優先ストレージを使用して機密性の高いデータを保存および取得するためのAPIを提供します。


重要:

Mobile and Social AndroidクライアントSDKによってサポートされるAndroidのバージョンはAndroid 2.2以上です。

10.1.1 Androidアプリケーションの開発およびパッケージ化

Androidアプリケーションの開発およびパッケージ化を行う前に、次の注意事項を確認してください。

ワークスペースへのライブラリ・プロジェクトのインポート

oamms_sdk_for_android.zipアーカイブには、IDMMobileSDKフォルダが含まれています。IDMMobileSDKフォルダはライブラリ・プロジェクトです。

Eclipseでライブラリ・プロジェクトをワークスペースにインポートするには、「File」→「Import」→「Existing projects into workspace」を選択します。

アプリケーションによるライブラリの参照

Eclipseで「Project」→「Properties」→「Android」→「Library」を選択し、ライブラリ・プロジェクトに対する参照を追加します。

コンパイル前の権限文の追加

アプリケーションをコンパイルする前に、Mobile and Socialサービスを利用するアプリケーションに次の<uses-permission>文を追加します。これらの文はAndroidManifest.xmlファイルに追加します。これらの文は必須であり、含まれてない場合にはアプリケーションがクラッシュします。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

権限のリクエストの詳細は、Androidの開発者向けドキュメントを参照してください。

http://developer.android.com/index.html

10.2 AndroidクライアントSDKを使用した認証サービスの起動

この項では、Mobile and Socialサーバーを使用して認証する方法について説明するサンプル・コードを提供します。Mobile and Socialサーバーの構成の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイル・サービスの構成に関する項を参照してください。

手順1: OMMobileSecurityServiceオブジェクトの作成

次のようにMobile and Socialサーバーに関する必要な詳細情報を指定し、OMMobileSecurityServiceのオブジェクトを作成します。

OMMobileSecurityService mss = new OMMobileSecurityService(context, configProperties, callback);

表10-1 OMMobileSecurityServiceのパラメータ

パラメータ 説明

context

Applicationオブジェクトのコンテキストです。Context#getApplicationContext()によって返されるコンテキストを渡します。

getApplicationContext()メソッドの詳細は、次のURLを参照してください。

http://developer.android.com/reference/android/content/Context.html#getApplicationContext()

Activityの参照を渡さないでください。なぜなら、OMMobileSecurityServiceのインスタンスはアプリケーションのライフ・サイクル全体を通じて存在し、OMMobileSecurityServiceのインスタンスがActivityの参照を保持するとメモリー・リークにつながる可能性があるためです。

configProperties

構成プロパティを含むマップです。構成プロパティの一覧は、第10.4項「初期化プロパティ」表10-5を参照してください。

callback

OMMobileServiceCallbackインタフェースを実装するクラスのインスタンスを指定します。SDKはOMMobileSecurityService#setup()OMMobileSecurityService#authenticate()およびOMMobileSecurityService#logout()をコールした後に、これを使用してアプリケーションに制御を戻します。


初期化サンプル・コード

        Map<String, Object> configProp = new HashMap<String, Object>();
 
          //The following strings should be available in configProperties. 
          //Otherwise, IllegalArgumentException will be thrown
          configProp.put(OMMobileSecurityService.OM_PROP_AUTHSERVER_TYPE, OMMobileSecurityService.AuthServerType.OAMMS);
          configProp.put(OMMobileSecurityService.OM_PROP_OAMMS_SERVICE_DOMAIN, "MobileServiceDomain");
          configProp.put(OMMobileSecurityService.OM_PROP_APPNAME,  "MyApp");
          configProp.put(OMMobileSecurityService.OM_PROP_OAMMS_URL, "http://www.example.com:14100");
 
        OMMobileSecurityService mss = new         OMMobileSecurityService(getApplicationContext(), configProp, callback);
        //getApplicationContext():  context of the calling application; 
        //callback: Instance of a  class which has implemented the interface 
        //OMMobileServiceCallback
  • OM_PROP_OAMMS_URL - Mobile and Socialサーバーに到達するために必要なURL(<protocol>://<host>:<port>)です。HTTPおよびHTTPSプロトコルのみがサポートされています。

  • OM_PROP_OAMMS_SERVICE_DOMAIN - Mobile and Socialサーバーで作成されたサービス・ドメインの名前を指定します。OM_PROP_APPNAMEが参照するアプリケーション・プロファイルは、このサービス・ドメイン内でアプリケーション・プロファイルとして定義されている必要があります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のサービス・ドメインの定義に関する項を参照してください。

  • OM_PROP_APPNAME - アプリケーションを識別する一意の識別子です。この文字列値はMobile and Socialサーバー管理コンソールのアプリケーション・プロファイルのセクションにあるアプリケーション名の値に一致している必要があります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの定義に関する項を参照してください。


注意:

アプリケーションが単一のOAMサーバーまたは単一のServiceDomainで認証を行う場合、OMMobileSecurityServiceオブジェクトのインスタンスは、アプリケーションのライフ・サイクル全体を通じて1つのみである必要があります。これは、サーバーとの間の有効なセッションが一度に1つのみ維持されるようにするため、およびシングル・サインオン機能をサポートするために必要です。

アプリケーションのライフ・サイクル全体を通じてOMMobileSecurityServiceのインスタンスが1つのみ維持されるようにするには、Android SDKのApplicationクラスを拡張するか、またはカスタムの静的なシングルトン・クラスを作成します。

Applicationクラスの拡張の詳細は、次のAndroidのドキュメントを参照してください。

http://developer.android.com/reference/android/app/Application.html

アプリケーションの認証が、異なる複数のOAMサーバーで行われるか、または同一OAMサーバーの異なる複数の認証スキームを使用して行われる場合は、サーバーまたは認証スキームごとに1つのOMMobileSecurityServiceインスタンスを作成する必要があります。たとえば、同じアプリケーションが異なるユースケースをOAMサーバーとFacebookで認証する場合は、個別にOMMobileSecurityServiceインスタンスを作成して両方のユースケースを処理する必要があります。OAMサーバー上では、ServiceDomainの一方を「モバイル・サービス認証」認証スキームを使用して構成し、他方を「ソーシャル・アイデンティティ認証」認証スキームを使用して構成します。


手順2: アクティビティの登録

OMMobileSecurityServicesetup()authenticate()およびprocessSSORequest(Intent intent)などのメソッドを呼び出す前に、現在のアクティビティを登録します。フォアグラウンドでなくなったら、このアクティビティの登録を解除します。こうすることによって、メモリ・リークが確実に発生しないようにします。現在のアクティビティへの参照を渡すには、前述のメソッドをコールするすべてのアクティビティに関して、onResume()で現在のアクティビティを登録し、onPause()でアクティビティの登録を解除します。アクティビティのonCreate()でこれらのメソッドが呼ばれる場合は、メソッドを呼ぶ前にOMMobileSecurityService#registerActivity(activity)を使用してアクティビティを登録します。アクティビティがバックグラウンドに移動するときには、OMMobileSecurityService#deregisterActivity()メソッドを使用してアクティビティの登録を解除します。

mss.registerActivity(this);

手順3: setup()メソッドの呼出し

Mobile and Socialサーバーからのアプリケーション・プロファイルのダウンロードを開始するsetup()メソッドを呼び出します。

mss.setup();

これは非同期コールです。アプリケーション・プロファイルのダウンロードが完了するか、またはネットワーク切断などの問題が発生した場合、SDKは次のコールバックを使用してコール元のアクティビティに制御を返します。

OMMobileServiceCallback#processSetupResponse(OMOMMobileSecurityService mss, OMApplicationProfile profile, OMMobileSecurityException mse)

アプリケーション・プロファイルをダウンロードできなかった場合は、OMMobileSecurityException mseで例外の詳細を確認できます。SDKはアプリケーション・プロファイルのダウンロードと格納を行います。ProfileCacheDurationで設定された有効期限が切れるまでは、以降のOMMobileSecurityService#setup()のコールでアプリケーション・プロファイルはダウンロードされません。ProfileCacheDurationの設定はアプリケーション・プロファイルの中で定義されます。

手順4: authenticate()メソッドの呼出し

設定が正常に完了したら、ビジネス・アプリケーションはOMMobileSecurityService#authenticate()をコールすることによって認証を実行できます。これは非同期コールであり、認証の完了後、またはなんらかの理由で認証が失敗した場合、SDKは制御をアプリケーションに返します。アプリケーションへの制御の戻しは、OMMobileServiceCallback#processAuthenticationResponse(OMMobileSecurityService mss, OMAuthenticationContext context, OMMobileSecurityException mse)を通じて行われます。認証セッションに関するすべての詳細は、OMAuthenticationContextコンテキストでアクセスできます。なんらかの理由で認証に失敗した場合は、OMMobileSecurityException mseに詳細が格納されます。

次のようにページを設定します。

View view = mss.authenticate();

setContentView(view);

authenticate()メソッドは、処理中のビューを保持するViewFlipperオブジェクトを返します。このビューにフォーカスが設定されると、実際の認証フローがトリガーされます。

前述のリクエストに関して、有効な認証コンテキストがすでにキャッシュ内に存在する場合は、サーバーへのリクエストを行わずにコール元のビジネス・アプリケーションに制御が返されます。

次のサンプル・コードは、processAuthenticationResponse()メソッドの使用方法を示しています。

public void processAuthenticationResponse(OMMobileSecurityService mss, OMAuthenticationContext context, OMMobileSecurityException mse)
 
{
    if (context != null)
    {       
        Toast.makeText(getApplicationContext(), "Logged in successfully.", Toast.LENGTH_LONG).show();
    }
    else
    {
        Toast.makeText(getApplicationContext(), "Failure in login due to " + mse.getLocalizedMessage(), Toast.LENGTH_LONG).show();
    }
}

注意:

ログイン・ビューまたはナレッジ・ベース認証(KBA)ビューのカスタマイズに関しては、この章の「ログイン・ビューおよびKBAビューのカスタマイズ」を参照してください。

手順5: logout()メソッドの呼出し

次のメソッドを呼び出して、ユーザーをログアウトします。

mobileSecurityService.logout(boolen isForgetDevice)

表10-2 logout()メソッドのパラメータ

パラメータ名 パラメータ値

isForgetDevice

true - オフライン認証をサポートするためのハッシュ化されたパスワード、クライアント登録ハンドルおよびトークンなどの資格証明ストアに格納されているすべての情報をクリアします。

false - トークンなどのユーザー・セッションに関連する項目のみをストアからクリアします。

Boolean


Mobile and Socialサーバーのログアウト操作には、サーバー上で管理されているトークンを削除するためのREST Webサービスの起動が含まれています。したがって、サーバー連携の完了後、OMMobileServiceCallback#processLogoutResponse(OMMobileSecurityService mss, OMMobileSecurityException mse)コールバックが呼ばれます。次に、コールバックの実装サンプルを示します。

public void processLogoutResponse(OMMobileSecurityService mss, OMMobileSecurityException mse)
{
            if(mse == null)
            {
                Toast.makeText(getApplicationContext(), "Logout is successful!", Toast.LENGTH_SHORT).show();
            }
            else
            {
                Toast.makeText(getApplicationContext(), "Logout failure. " + mse.getErrorMessage(), Toast.LENGTH_SHORT).show();
            }
} 

10.3 URLベースの初期化

URLを使用してSDKを初期化するには、必要な構成プロパティを含むURLを使用します。URLは次の形式である必要があります。

<scheme>://[host]?<parameter1>::=<value1>&<parameter2>::=<value2>&...&<parameterN>::=<valueN>

説明:

次に、Mobile and Socialサーバーの詳細を指定してアプリケーションを初期化するURLのサンプルを示します。

samplescheme://settings?AuthServerType::=OAMMSAuthentication&
ApplicationName::=SampleApp&
OAMMSURL::=http://www.example.com:14100&
OAMMSServiceDomain::=MobileServiceDomain

このURLは電子メールなどの手段でユーザーに送信することができ、ユーザーがAndroidモバイル・デバイスでURLをクリックすると、対応するアプリケーションが起動します。構成URLを含むインテントは、次のメソッドに渡す必要があります。その後、このメソッドは、URLを解析してSDK構成プロパティを抽出します。

Set<String> filters = new HashSet<String>();
filters.add(OM_PROP_AUTHSERVER_TYPE);
filters.add(OM_PROP_APPNAME);
filters.add(OM_PROP_OAMMS_URL);
filters.add(OM_PROP_OAMMS_SERVICE_DOMAIN);
OMMobileSecurityService.parseConfigurationURI(context, intent, persistInSharedPreferences,keyInSharedPreference, filters)

表10-3 parseConfigurationURI()メソッドのパラメータ

パラメータ名 説明

context

コール元のアプリケーションのコンテキストです。常にpassContext#getApplicationContext()です。

intent

SDK構成プロパティを含むインテントです。

persistInSharedPreferences

SharedPreferencesにSDK構成プロパティを永続化する必要があるかどうかを指定します。OMMobileSecurityService(Context context, String configurationPropertiesKey, OMMobileServiceCallback callback)コンストラクタがSharedPreferencesに格納された構成プロパティに基づいてOMMobileSecurityServiceインスタンスを作成できるように、trueを指定する必要があります。

keyInSharedPreference

このキーに対してSDK構成プロパティが格納されます。

filters

構成プロパティのマップで返される構成URL内の一連のプロパティ文字列です。オプションでSharedPreferencesに永続化されます。IDM Mobile SDKは、構成URLから抽出したその他のURLパラメータを無視します。


parseConfigurationURI()メソッドを呼び出してSharedPreferencesに構成プロパティを格納すると、次のようにしてOMMobileSecurityServiceのインスタンスを作成できるようになります。

OMMobileSecurityService mobileSecurityService = OMMobileSecurityService(Context context, String configurationPropertiesKey, OMMobileServiceCallback callback);

表10-4 URLベースの初期化用のOMMobileSecurityServiceパラメータ

パラメータ 説明

context

Context#getApplicationContext()によって返されるコンテキストです。

configurationPropertiesKey

このキーに対してSDK構成プロパティが格納されています。OMMobileSecurityService.parseConfigurationURI(context, intent, persistInSharedPreferences,keyInSharedPreference)keyInSharedPreferenceで指定したキーと同じである必要があります。

callback

OMMobileServiceCallbackインタフェースを実装するクラスのインスタンスです。SDKはOMMobileSecurityService#setup()およびOMMobileSecurityService#authenticate()をコールした後に、これを使用してアプリケーションに制御を戻します。


10.4 初期化プロパティ

次の初期化プロパティを使用してSDKを初期化します。名前がOM_PROPで始まるプロパティは、OMMobileSecurityServiceクラスの一部です。これらのプロパティを使用して、マップでコンストラクタOMMobileSecurityService(context, configProperties, callback)に渡されるエントリを指定します。カッコ内の値は、URLベースの初期化用のパラメータ名および対応する値です。

表10-5 AndroidクライアントSDKの初期化プロパティ

プロパティ名 プロパティの値

OM_PROP_AUTHSERVER_TYPE

(AuthServerType)

  • OMMobileSecurityService.AuthServerType.OAMMS

    (OAMMSAuthentication)

  • OMMobileSecurityService.AuthServerType.HTTPBasicAuth

    (HTTPBasicAuthentication)

Enum (OMMobileSecurityService.AuthServerType)

OM_PROP_OAMMS_URL

(OAMMSURL)

必須プロパティ。Mobile and Socialサーバーにアクセスするために必要なプロトコル、ホストおよびポートを含む文字列です。HTTPおよびHTTPSプロトコルのみがサポートされています。

<protocol>://<host>:<port>

String

OM_PROP_OAMMS_SERVICE_DOMAIN

(OAMMSServiceDomain)

必須プロパティ。Mobile and Socialサーバーで作成されたサービス・ドメインの名前を指定します。OM_PROP_APPNAMEが参照するアプリケーション・プロファイルは、このサービス・ドメイン内でアプリケーション・プロファイルとして定義されている必要があります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のサービス・ドメインの定義に関する項を参照してください。

String

OM_PROP_APPNAME

(ApplicationName)

必須プロパティ。アプリケーションを識別する一意の識別子です。この文字列値はMobile and Socialサーバー管理コンソールのアプリケーション・プロファイルのセクションにあるアプリケーション名の値に一致している必要があります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの定義に関する項を参照してください。

String

OM_PROP_MAX_LOGIN_ATTEMPTS

(MaxLoginAttempts)

ユーザーによるログイン試行の最大許容回数。省略可。このプロパティが指定されていない場合、デフォルトは3です。

Integer

OM_PROP_AUTH_KEY

(AuthKey)

共有プリファレンス内にOMCredentialオブジェクトを格納する際に使用する必要のあるキー。

これはオプション・プロパティです。このプロパティが指定されないとき、すべての値がnullでない場合には、<login_url>_<applicationName>_<serviceDomain>キーを使用して格納されます。nullが含まれる場合は、<applicationName>のみを使用して格納されます。

String

OM_PROP_LOCATION_UPDATE_ENABLED

(LocationUpdateEnabled)

このプロパティを使用して場所の更新を有効または無効にします。これを有効にすると、SDKはデバイスの場所の詳細を収集し、サーバーに送信します。

Boolean

OM_PROP_AUTO_LOGIN_ALLOWED

(AutoLoginAllowed)

省略可。自動ログインを有効にするかどうかを指定します。trueまたはfalseのいずれか。デフォルトでは、これは無効です。

Boolean

OM_PROP_REMEMBER_USERNAME_ALLOWED

(Remember User name Allowed)

ユーザー名保存機能を有効にするかどうかを指定します。trueまたはfalseのいずれか。デフォルトでは、これは無効です。

Boolean

OM_PROP_REMEMBER_CREDENTIALS_ALLOWED

(RememberCredentialsAllowed)

資格証明保存機能を有効にするかどうかを指定します。trueまたはfalseのいずれか。デフォルトでは、これは無効です。

Boolean

OM_AUTO_LOGIN_DEFAULT

(AutoLoginDefault)

自動ログイン・オプション・ボックスのデフォルト設定を表します。trueまたはfalseのいずれか。デフォルト値はfalseです。

Boolean

OM_REMEMBER_USERNAME_DEFAULT

(RememberUsernameDefault)

ユーザー名保存オプション・ボックスのデフォルト設定を表します。trueまたはfalseのいずれか。デフォルト値はfalseです。

Boolean

OM_REMEMBER_CREDENTIALS_DEFAULT

(RememberCredentialDefault)

資格証明保存オプション・ボックスのデフォルト設定を表します。trueまたはfalseのいずれか。デフォルト値はfalseです。

Boolean


次のOM_PROP_CRYPTO_SCHEME暗号化プロパティはオプションのプロパティです。アプリケーションでオフライン認証が必要であるにもかかわらずこのプロパティが指定されていない場合、デフォルトの暗号スキームはSSHA512になります。これは、アプリケーションの必要に応じて、以降のオフライン認証用にパスワードをハッシュ化/暗号化して保存するのに使用されます。

このプロパティはMobile and Socialサーバー・コンソールを使用しても設定できます。「カスタム設定」「モバイル・カスタム属性」を選択し、表の最後の2列にある属性名および属性値を使用します。

Mobile and Social AndroidクライアントSDKに含まれる暗号化モジュールの詳細は、第10.12項「暗号化APIの使用」を参照してください。

表10-6 AndroidクライアントSDKの暗号スキームのプロパティ属性

プロパティ名 プロパティの列挙値 属性名 属性値

OM_PROP_CRYPTO_SCHEME

(CryptoScheme)

PLAINTEXT("PlainText")

Enum(CryptoScheme)

PlainText

AES("AES")

AES

SHA1("SHA-1")

SHA-1

SHA224("SHA-224")

SHA-224

SHA256("SHA-256")

SHA-256

SHA384("SHA-384")

SHA-384

SHA512("SHA-512")

SHA-512

SSHA1("SaltedSHA-1")

SaltedSHA-1

SSHA224("SaltedSHA-224")

SaltedSHA-224

SSHA256("SaltedSHA-256")

SaltedSHA-256

SSHA384("SaltedSHA-384")

SaltedSHA-384

SSHA512("SaltedSHA-512")

SaltedSHA-512


10.5 オフライン認証について

Mobile and Socialでは、オフライン認証をサポートしています。列挙OMConnectivityModeを使用して、どのようにオフライン認証を行うかを指定します。

  • OMConnectivityMode.ONLINE: 常にサーバーとの間で認証が行われます。デバイスがインターネットに接続できない場合は失敗します。

  • OMConnectivityMode.OFFLINE: キャッシュされた資格証明を使用してローカルで認証が行われます。デバイスがオンラインでサーバーと接続できる場合であっても、オフライン認証が行われます。

  • OMConnectivityMode.AUTO: サーバーに接続可能な場合はサーバーとの間で認証が行われ、デバイスがインターネットに接続されていない場合はオフラインで認証が行われます。

次に例を示します。

OMAuthenticationRequest authRequest = new OMAuthenticationRequest();
authRequest.setConnectivityMode(OMConnectivityMode.ONLINE);
View authView = authenticate(authRequest);

オフライン認証はOMAuthenticationRequestの一部であるため、この設定は現在のリクエストでのみ有効です。オフライン認証で失敗回数がOM_PROP_MAX_LOGIN_ATTEMPTSプロパティの値を超えた場合(「初期化プロパティ」の項で説明)、ローカルに格納されている資格証明は削除され、オンライン認証が試行されます。


注意:

オフライン認証は、サーバーでオフライン認証が許可に設定されている場合のみ動作します。詳細は、『Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または削除に関する項を参照してください。

オフライン認証をサポートするために、SDKはユーザーの資格証明を取得して保存します。ユーザーのパスワードは、OM_PROP_CRYPTO_SCHEMEプロパティの値に基づいてハッシュ化されるか暗号化されます。アプリケーションがオフライン認証を要求し、このプロパティが指定されていない場合、デフォルトの暗号スキームはSSHA512になります。

10.6 AndroidクライアントSDKを使用したソーシャル・アイデンティティ認証の起動

この項では、Mobile and Socialサーバーとの間でソーシャル・アイデンティティ認証(リライイング・パーティ認証とも呼ばれます)を実行する方法を示すサンプル・コードを紹介します。Mobile and Socialサーバーの構成の詳細は、『Oracle Access Management管理者ガイド』の「ソーシャル・アイデンティティの構成」の章を参照してください。

リライイング・パーティを使用して認証を行うには、アプリケーションのメイン・アクティビティのデータ・スキームが、アプリケーション・プロファイルに構成されているURLスキームと一致している必要があります。詳細は次のページを参照してください。

http://developer.android.com/guide/topics/manifest/data-element.html

認証を行うには、通常どおりOMMobileSecurityService#authenticate()を呼び出します。SDKによってサーバーから必要な設定が取得され、リライイング・パーティとの間で認証が行われます。認証されたら、モバイル・セキュリティ・サービス・インスタンスから認証コンテキストを取得します(OMMobileSecurityService#retrieveAuthenticationContext())。取得される認証コンテキスト・オブジェクトには、アイデンティティ・プロバイダ固有の情報も含まれます。認証コンテキストを使用することによって、ログイン・ユーザー名、アイデンティティ・プロバイダ名およびアイデンティティ・プロバイダのアクセス・トークンを取得できます。詳細は、SDKのドキュメントを参照してください。


注意:

次のコード・スニペットは、FacebookやGoogleなどのソーシャル・アイデンティティ・プロバイダに対して認証を行うアプリケーションのメイン・アクティビティに含めてください。メイン・アクティビティとは、Mobile and Socialサーバーの「アプリケーション・プロファイル」設定で「Androidパッケージ」として定義されているアクティビティです。

「Androidパッケージ」フィールドには、Androidアプリケーションのアクティビティの完全修飾名を設定する必要があります。このアクティビティは、<intent-filter>内に<data android:scheme="xyz" />を設定する必要があります。ここで、xyzはURLスキームと同じにする必要があります。


@Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState); 
        ...
        Intent intent = getIntent();
        if (intent.getExtras()!= null) 
        {
            try
            {
                mMobileSecurityService.processSSORequest(intent);
            } 
            catch (OMMobileSecurityException e)
            { 
                Log.w(TAG, e.getLocalizedMessage());
            }
        }
        ...
    }

10.7 モバイル・シングル・サインオン・エージェント・アプリケーションの起動

この項では、AndroidクライアントSDKを使用してモバイル・シングル・サインオン・エージェント・アプリケーションと連携する方法について説明します。Mobile and Socialでのモバイル・シングル・サインオンに関する概念情報は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイル・シングル・サインオン(SSO)機能の理解に関する項およびMobile and Socialの理解に関する項を参照してください。

サンプルのモバイルSSOエージェント・アプリケーション

Mobile and Socialでは、必要なロジックを示すサンプルのSSOエージェント・アプリケーションを提供します。このロジックを任意のビジネス・アプリケーションに適用して、アプリケーションがモバイルSSOエージェントとして機能できるようにします。サンプルのモバイルSSOエージェント・アプリケーションは、Oracle Technical Network (OTN) Webサイトからダウンロードできます。

サンプルのモバイルSSOエージェント・アプリケーションのデータ・スキームは"osa"であることに注意してください。Mobile and Socialサーバーのアプリケーション・プロファイルに、URLスキームとしてこれを入力します。本質的には、iOS SSOエージェント・アプリケーションのURLスキームと、Android SSOエージェント・アプリケーションのデータ・スキームは同じものです。最後に、アプリケーション・プロファイルをMobile and Socialサーバー上のサービス・ドメインに追加する際、モバイル・シングル・サインオン(SSO)構成属性(シングル・サインオンへの参加およびエージェント優先度)を構成します。

Mobile and SocialサーバーでのSSO構成の詳細は、『Oracle Access Management管理者ガイド』のサービス・ドメインの編集または削除に関する項およびアプリケーション・プロファイルの編集または削除に関する項を参照してください。

シングル・サインオンが機能するためには、SSOエージェント・アプリケーションおよびSSOクライアント・アプリケーションの両方について、それぞれのアプリケーション・プロファイルにAndroidアプリケーションの署名を入力します。アプリケーションの署名は、次のコード・スニペットを使用してプログラムで取得できます。このコード・スニペットはアプリケーションのアクティビティの中に含めます。

        try
        {
            packageInfo = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_SIGNATURES);
 
            for (Signature signature : packageInfo.signatures)
            {
                Log.i(TAG, "The signature is : " + signature.toCharsString());
            }
        }
        catch (NameNotFoundException e)
        {
            e.printStackTrace();
        }

独自のモバイルSSOエージェント・アプリケーションを作成する場合は、第10.10項「AndroidクライアントSDKを使用したカスタム・モバイル・シングル・サインオン・エージェント・アプリケーションの作成」を参照してください。

10.7.1 別のアプリケーション(SSOクライアント)からのモバイル・シングル・サインオン・エージェント・アプリケーションの起動

SSOエージェント・アプリケーションがデバイスにインストールされている場合、SSOクライアントとして構成されているアプリケーションがOMMobileSecurityService#authenticate()を呼び出すと、AndroidクライアントSDKはSSOエージェント・アプリケーションにリクエストを委任します。そうでない場合は、例外がスローされます。AndroidクライアントSDKは認証リクエストを構築し、インテントを使用してSSOエージェント・アプリケーションを呼び出します。


注意:

アプリケーション(SSOクライアント)でSSOエージェント・アプリケーションを使用した認証が必要な場合は、メイン・アクティビティでOMMobileSecurityService#processSSORequest(intent)を呼び出す必要があります。これが必要なのは、SSOエージェント・アプリケーションが認証を行った後に、インテントを使用してSSOクライアント・アプリケーションのメイン・アクティビティに詳細情報を送信するためです。SDKはインテントに存在する詳細情報を使用して、SSOクライアント・アプリケーション内に適切にデータ構造を設定します。

メイン・アクティビティとは、Mobile and Socialサーバーのアプリケーション・プロファイルで「Androidパッケージ」として構成されているアクティビティです。


次のサンプル・コードを参照してください。

          @Override
          public void onCreate(Bundle savedInstanceState)
          {
              super.onCreate(savedInstanceState);
              …
              …
              Intent intent = getIntent();
              if (intent.getExtras()!= null)
              {
                  try
                  {
                      mMobileSecurityService.processSSORequest(intent);
                  }
                  catch (OMMobileSecurityException e)
                  {
                      Log.w(TAG, e.getLocalizedMessage());
                  }
              }
              …
              …
          }

10.7.2 モバイル・ブラウザを使用したモバイル・シングル・サインオン・エージェント・アプリケーションの起動

Webアプリケーションは、モバイルSSOエージェントによって提供されるシングル・サインオン認証機能を使用することもできます。この機能にはAccess Managerが必要です。

  1. Oracle Access Management管理コンソールにログインします。

    「起動パッド」が開きます。

  2. 「Access Manager」で、「認証スキーム」をクリックし、「認証スキームの作成」ボタンをクリックします。

    認証スキームの作成タブが開きます。

  3. 次のようにフォームに入力して、新しい認証スキームを作成します。

    • 名前: MobileSSOScheme

    • 認証レベル: 2

    • チャレンジ・メソッド: FORM

    • チャレンジ・リダイレクトURL: /oam/server/

    • 認証モジュール: LDAP

    • チャレンジURL: /mobilesso?serviceDomain=MobileServiceDomain

      ここで、MobileServiceDomainは、シングル・サインオン用に構成されるドメインの名前です。

    • コンテキスト・タイプ: customWar

    • コンテキストの値: /oic_rest

  4. Oracle Access Management管理コンソールで、次の手順を実行します。

    1. アプリケーション・ドメインで新しい認証スキームを作成します。

      認証スキーム: MobileSSOScheme

      (MobileSSOSchemeは、手順1で作成されたスキームです。)

    2. /protectedResなどのHTTPリソースを作成し、作成された認証スキーム(MobileSSOScheme)を使用してそのリソースを保護します。これは、モバイルWebブラウザからアクセスされ、WebGateによって保護されるURLです。

保護されたリソースにモバイル・ブラウザを使用してアクセスすると、サーバーはモバイルSSOエージェント・アプリケーションを呼び出します。エージェント・アプリケーションはメイン・アクティビティのonResume()の中でOMMobileSecurityService#processSSORequest(intent)を呼び出すため、認証、OAM_IDトークンの取得、このトークンの注入、ブラウザへの制御の戻しなどの複雑な操作については、エージェント・アプリケーションはSDKに制御を委任します。必要なトークンはSSOエージェント・アプリケーションによって設定されるため、ブラウザは保護されたリソースにアクセスできるようになります。

10.8 AndroidクライアントSDKのユーザー・ロール・モジュールを使用したユーザー・プロファイル・サービスの起動

この項では、AndroidクライアントSDKを使用して、Mobile and Socialと連携するように構成されているディレクトリ・サーバーでユーザーおよびグループの作成、読取り、更新または削除を行う方法について説明します。ディレクトリ・サーバーと連携するようにMobile and Socialサーバーを構成するには、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のユーザー・プロファイル・サービス・プロバイダの定義、変更および削除に関する項、およびユーザー・プロファイル・サービス・プロファイルの定義、変更および削除に関する項を参照してください。

サービス・ドメインの「サービス保護」タブで設定を調整することによって、ユーザー・ロール・モジュールを匿名で使用するか、または認証後のみ使用するように構成できます。

いずれの場合でも、最初にOMMobileSecurityServiceインスタンスからOMUserProfileServiceのインスタンスへの参照を取得する必要があります。それには、OMMobileSecurityService#getUserRoleProfileService(OMAuthenticationContext)を呼び出します。

次の手順は、実行する操作に応じて、UserManagerまたはRoleManagerのいずれかのインスタンスを取得することです。UserManagerのインスタンスは、ユーザーの詳細を取得するのに使用できます。一方、RoleManagerのインスタンスは、Mobile and Socialサーバーのアプリケーションのドメインに関連付けられているアイデンティティ・ストアからグループの詳細を取得するのに使用できます。

  1. 認証の成功後に取得したAuthenticationContextを渡すことによって、OMUserProfileServiceのインスタンスを取得します。認証後は、OMMobileSecurityService#retrieveAuthenticationContext()を使用して認証コンテキストを取得できます。

    次のサンプルでは、mMobileSecurityServiceOMMobileSecurityServiceのインスタンスです。

    OMUserRoleProfileService userProfileService = mMobileSecurityService.getUserRoleProfileService(authContext); 
    

    これらのサービスに対する匿名アクセスが必要な場合は、nullを渡します。

    OMUserRoleProfileService userProfileService = mMobileSecurityService.getUserRoleProfileService(null);
    
  2. 次のように、UserManagerまたはRoleMangerのいずれかのインスタンスを取得します。

    OMUserManager userManager = userProfileService.getUserManager();
     
    OMRoleManager roleManager = userProfileService.getRoleManager();
     
    
  3. 次のメソッドはuserManagerを使用して呼び出せます。これらのメソッドはすべて、ネットワークを介してMobile and Socialサーバーと通信します。したがって、これらのメソッドはUIスレッドではなく、バックグラウンド・スレッドから呼び出す必要があります。

    public List<OMUser> searchUsers(Map<String, String> searchFilter, List<String> attrsToFetch, int startIndex, int size, boolean isSimpleSearch) throws OMMobileSecurityException
     
    public OMUser searchUser(String userId, List<String> attrsToFetch, boolean shouldPrefetchManager) throws IOException, JSONException, OMMobileSecurityException
     
    public OMUser modifyUser(String uid, String telephoneNumber, String mobile, String mail, String address) throws OMMobileSecurityException
     
    public boolean deleteUser(String userId) throws OMMobileSecurityException
     
     
    public boolean createUser(Map<String, String> attrVals) throws OMMobileSecurityException 
    

    次のメソッドはroleManagerを使用して呼び出せます。OMUserManagerのメソッドの場合と同様に、OMRoleManagerのすべてのメソッドはバックグラウンド・スレッドから呼び出す必要があります。

    public OMRole getRole(String roleName) throws IOException, JSONException,OMMobileSecurityException
     
    public boolean createRole(Map<String, String> attrVals) throws OMMobileSecurityException
     
    public OMRole modifyRole(String rolename, Map<String, String> attrVals) throws OMMobileSecurityException
     
    public boolean deleteRole(String roleName) throws OMMobileSecurityException
     
    public OMUser getUserFromRole(String userId, String role) throws OMMobileSecurityException
     
    public void addUserToRole(String roleName, Map<String, String> attrVals) throws OMMobileSecurityException
     
    public boolean deleteUserFromRole(String roleName, String userId) throws OMMobileSecurityException 
    

10.9 REST Webサービスの起動

Mobile and Social SDKを使用して、Mobile and SocialサービスによりAccess Managerに対して認証できます。Access Managerに対して認証すると、SDKはトークンを取得し、それをCookieストアおよびローカル記憶域で永続化します。

Mobile and Social AndroidクライアントSDKは、REST Webサービス、またはAccess Managerによって保護されている任意のWebリソースにアクセスするために、次のメソッドを提供します。

OMMobileSecurityService#processHttpRequest(HttpRequest httpRequest)

それらにアクセスするためには、最初にユーザーの認証が行われる必要があります。リソースがAccess Management 11g R2 WebGateによって保護されている場合、AndroidクライアントSDKは、認証時に取得したユーザー・トークンを使用してそれらのリソースのアクセス・トークンを取得します。

次のサンプル・コードでは、現在のアプリケーションの有効なユーザー・トークンが見つからない場合に(ユーザーが認証されていない場合など)、コードが例外をスローします。このメソッドはネットワークを介してサーバーにアクセスするため、バックグラウンド・スレッドで実行します。

        HttpRequest httpRequest = new HttpGet("http://abc.example.com:7778/index.html");
        // It is important to set the User-Agent to the values configured in the OAM 11g R2
        // WebGate user defined parameters.
        // We need to configure OAM 11g R2 WebGate with these parameters:        //  i) OAMAuthUserAgentPrefix=<Prefix for User-Agent HTTP header> (Example: OIC)        // ii) OAMAuthAuthenticationServiceLocation=<OIC Server URL> (Example:
        //     http://host123.us.example.com:14100/oic_rest/rest/mobileoamauthentication)
        httpRequest.setHeader("User-Agent", "OAMMS-Agent");
        try
        {
            HttpResponse response = mss.processHttpRequest(httpRequest);
            // The developer may extract the useful information from the "response" object
        }
        catch (OMMobileSecurityException mse)
        {
            Log.d("processHttpRequest", mse.getLocalizedMessage());
        }

OMMobileSecurityService#processHttpRequest(HttpRequest)メソッドは、REST WebサービスがOracle Access Management 11g R2 WebGateを使用して保護されている場合のみ、Access Managerから必須トークンを取得できます。Access Management 11g R2 WebGateのユーザー定義パラメータには、OAMAuthUserAgentPrefixおよびOAMAuthAuthenticationServiceLocationプロパティが含まれている必要があります。サンプル・コードに示すように、モバイル・アプリケーションのヘッダーにも同じプロパティの値を指定する必要があります。

次の手順は、このメソッドが呼び出されたときの内部フローの説明です。

  1. OMMobileSecurityService#processHttpRequest(HttpRequest)が、モバイル・アプリケーションによって指定されたURLを呼び出します。

  2. Oracle Access Management 11g R2 WebGateが次のような詳細で401エラーを返します。

       HTTP/1.1 401 Authorization Required
       WWW-Authenticate: OAM-Auth realm="<WebGateName>:<AuthenticationLevel>
       <RelativeRESTURL>", request-ctx="<RequestContext>"
    
  3. Mobile and Social SDKは、アプリケーションの有効期間中に取得したアクセス・トークンのキャッシュを保持します。このWebGateのアクセス・トークンがすでにキャッシュに存在する場合、SDKはアプリケーション・リクエストにアクセス・トークンを挿入します。

  4. WebGate用アクセス・トークンがMobile and Social SDKキャッシュで使用できない場合、RESTリクエストをMobile and Socialサーバーに送信してWebGate用アクセス・トークンを取得します。

  5. リクエストが有効な場合、Mobile and Socialはレスポンスでアクセス・トークンを返します。

  6. Mobile and Social SDKは、Mobile and Socialサーバーによって返されるトークンを挿入し、保護されたURLにアクセスします。

SDKバージョン11.1.2.2では、Webサービス・リクエストを非同期で実行するオプションが追加されました。バックグラウンドでリクエストを実行するために、SDKはOMHTTPRequestCallbackオブジェクトのコールバックを受け取ります。リクエストが実行され、このコールバック・オブジェクトによってRESTリクエスト・レスポンスがアプリケーションに伝播されるとき、SDKはアプリケーションに通知します。OMHTTPRequestクラスが受信し、リクエストに応答します。メソッドのシグネチャは次のとおりです。

OMHTTPRequest#executeHTTPRequest(HttpRequest httpRequest , OMHTTPRequestCallback callback , boolean isAsync)

説明:

  • httpRequestはHttpRequestオブジェクトです。

  • OMHTTPRequestCallbackは、SDKがリクエストの完了をアプリケーションに通知するために使用するコールバック・オブジェクトです。レスポンス/エラーは、このメソッドによってこのコールバック・オブジェクトを使用して送信されます。

    OMHTTPRequestCallback#processHTTPResponse(OMHTTPRequest request, HttpResponse response, OMMobileSecurityException exception)
    

    アプリケーションはこのインタフェースを実装してレスポンス/エラーの処理ロジックを実行する必要があります。

  • isAsyncは、リクエストを非同期に実行する必要があるかどうかを示すブール値です。falseの場合、OMMobileSecurityService#processHttpRequest(HttpRequest)と同じように実行されます。

次のサンプル・コードは、非同期RESTリクエストの例です。

OMHTTPRequest omrequest1 = new OMHTTPRequest(getMobileSecuritySevice());
HttpRequest httpRequest1 = new HttpGet("http://abc.example.com:7777/restService") ;
 
try
{
omrequest1.executeHTTPRequest(httpRequest1,
new OMHTTPRequestCallback()
  {
 
    @Override
    public void processHTTPResponse( OMHTTPRequest request, HttpResponse response, OMMobileSecurityException exception)
    {
     String data1="";
     if (response != null)
      {
       try
       {
        data1 = parseHttpResponse(response);
       }
       catch (IOException e)
       {
        
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
       catch (JSONException e)
       {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
     else
     {
       if (exception != null)
       {
        data1 = exception.getErrorMessage();
       }
     }
     if(data1 != null)
     {
       Message msg = handler.obtainMessage(MSG_SHOW_DIALOUGE);
       msg.obj = data1;
       handler.sendMessage(msg);
     }
 
   }
  }, true);
}
catch (OMMobileSecurityException e)
{
e.printStackTrace();
}

10.10 AndroidクライアントSDKを使用したカスタム・モバイル・シングル・サインオン・エージェント・アプリケーションの作成

この項では、AndroidクライアントSDKを使用してカスタムのモバイル・シングル・サインオン(SSO)エージェント・アプリケーションを作成する方法について説明します。

SSOエージェント・アプリケーションがデバイスにインストールされている場合、SSOクライアントとして構成されているアプリケーションがOMMobileSecurityService#authenticate()を呼び出すと、AndroidクライアントSDKはSSOエージェント・アプリケーションにリクエストを委任します。そうでない場合は、例外がスローされます。AndroidクライアントSDKは認証リクエストを構築し、インテントを使用してSSOエージェント・アプリケーションを呼び出します。認証リクエストを処理するためには、SSOエージェント・アプリケーションはこのインテントを取得し、OMMobileSecurityService#processSSORequest(intent)を呼び出す必要があります。SDKは認証リクエストを内部的に処理および検証し、有効な認証コンテキストとともに制御をクライアント・アプリケーションに戻します。

Applicationクラスを拡張して、NULLインテントまたは構成URLを含むインテントのどちらかを受け取るOMMobileSecurityService用のシングルトン・インスタンスを保持することもできます。次のコード・スニペットは、OMMobileSecurityServiceインスタンスを初期化する方法を示しています。新しいインテントには構成URLベースのメカニズムを、それ以外の場合はSharedPreferencesに格納された構成プロパティを使用しています。

public OMMobileSecurityService getMobileSecurityService(Context context,
            Intent intent, OMMobileServiceCallback callback)
            throws JSONException, OMMobileSecurityException
{
     if (!mssInitialized)
     {
            if (intent == null || intent.getData() == null)
            {
                mss = new OMMobileSecurityService(context, callback);
            }
            else
            {
                Map<String, Object> configMap = OMMobileSecurityService
                        .parseConfigurationURI(context, intent, true, null);
 
                mss = new OMMobileSecurityService(context, configMap, callback);
            }
            if (mss == null)
            {
                throw new OMMobileSecurityException(
                        OMErrorCode.INITIALIZATION_FAILED, null, context);
            }
            else
            {
                mssInitialized = true;
            }
     }
     else
     {
            mss.registerCallback(callback);
     }
     return mss;
} 

次のコード・スニペットは、クライアントのリクエストを処理する前に、エージェント・アプリケーション内で実行する必要のあるチェックを示しています。

@Override
        protected void onResume()
        {
            super.onResume();
            mMobileSecurityService.registerActivity(this);
            if (!(SSOApplication) getApplication().isSetupCompleted())
            {
                mMobileSecurityService.setup();
            }
 
            Intent intent = getIntent();
            
            if (intent.getData() != null)
            {
                 boolean isConfigurationIntent = false;
                 /* Check if the intent URI contains the configuration parameters 
                    which can be passed to the the SSOApplication class. */ 
                 
                 if (isConfigurationIntent == true)
                 {
                      mMobileSecurityService = (SSOApplication) getApplication.getMobileSecurityService(getApplicationContext(), intent, new SSOAgentCallback();
                 }
                 else
                 {
                      mMobileSecurityService = (SSOApplication) getApplication.getMobileSecurityService(getApplicationContext(), null, new SSOAgentCallback();
                 }
            }
            if ((intent.getData() != null && !isConfigurationIntent) || intent.getExtras() != null)
            {
                try
                {
                    authView = mMobileSecurityService.processSSORequest(intent);
                    if (authView != null)
                    {
                        setContentView(authView);
                        // The developers have full control on how they want to
                        // display this view in their app.
                    }
                }
                catch (OMMobileSecurityException e)
                {
                    Log.w(TAG, e.getErrorMessage());
                }
            }
        }

どのような設計のアプローチを使用してもかまわないことに注目してください。このサンプル・コードは、SDKの使用方法を紹介するためのものです。

    class SSOAgentCallback implements OMMobileServiceCallback
    {
        @Override
        public void processSetupResponse(OMApplicationProfile profile,
                OMMobileSecurityException mse)
        {
            if (profile != null)
            {
                // Setup successful you may go for authentication now
                ((SSOApplication) getApplication()).setSetupCompleted(true);
                Toast.makeText(SSOActivity.this, "Setup Done",
                        Toast.LENGTH_SHORT).show();
            }
            else
            {
                Toast.makeText(SSOActivity.this, "Setup failed",
                        Toast.LENGTH_LONG).show();
 
            }
        }
 
        @Override
        public void processAuthenticationResponse(
                OMAuthenticationContext context, OMMobileSecurityException mse)
        {
            /*
             * Handle post authentication in case of SSO self auth request, i.e.
             * when the SSO Agent app calls
             * OMMobileSecurityService#authenticate(). Note: If authentication
             * request comes from a client application , we will not get this
             * call back, as the sdk will redirect to the client app after
             * successful authentication
             */
        }
    }

10.11 ログイン・ビューおよびKBAビューのカスタマイズ

このSDKでは、基本的なログイン・ビューおよびナレッジ・ベースの回答ビューがデフォルトで表示されます。カスタムのユーザー定義レイアウトを作成するには、次のようにします。

  1. OMMobileSecurityServiceクラスは、次のシグネチャを持つメソッドを提供します。

    public void setCredentialCollector(OMAuthenticationServiceType serviceType, OMCredentialCollector viewHandler)
    

    このメソッドを使用して、次のようにカスタム・ビューを設定できます。

    mobileSecurityService.setCredentialCollector(OMAuthenticationServiceType.DEVICE_AUTHENTICATION, new MyLoginView(getApplicationContext()));
    mobileSecurityService.setCredentialCollector(OMAuthenticationServiceType.KBA_AUTHENTICATION, new MyKBAView(getApplicationContext()));
    

    このアプローチに沿って、OMAuthenticationServiceTypeでサポートされている任意の認証サービス・タイプ用のカスタム・ビューを設定します。

  2. MyLoginViewは、OMCredentialCollectorインタフェースを実装するカスタム・クラスです。このSDKによって表示されるカスタム・ビューは、このメソッドから返される必要があります。

    OMCredentialCollector#processViewRequest(Map<String, String> inputParams, OMCredentialCollectorCallback callback)

    このメソッドを記述して、ユーザー名とパスワード、またはセキュリティ・アンサーを収集し、それらの値をSDKに渡します。Map<String, String>型のオブジェクトに値を格納し、callback.processLoginResponse(Map<String, String>)を使用してこのオブジェクトをSDKに渡します。

    ログイン・ビューのカスタマイズでは、ユーザー名とパスワードの値に次のキーを使用します。

    OMSecurityConstants.USERNAME
    OMSecurityConstants.PASSWORD 
    

    KBAビューのカスタマイズでは、セキュリティ・アンサーに次のキーを使用します。

    OMSecurityConstants.ANSWER_STR
    

    リクエストで例外が発生すると、SDKは、次のメソッドの入力パラメータであるinputParamsマップに例外を格納します。

    OMCredentialCollector#processViewRequest(Map<String, String> inputParams, OMCredentialCollectorCallback callback)
    

    SDKがエラー・メッセージを送信したら、それがビューに表示されるようにカスタム・ビューを設計します。エラー・メッセージを取得するには次のキーを使用します。

    OMSecurityConstants.ERROR_MESSAGE
    

    KBAビューの場合は、inputParamsマップの一部として質問を利用できます。次のキーを使用します。

    OMSecurityConstants.QUESTION_STR
     
    

    inputParamsマップから質問を取得し、それをビューに表示するようにOMCredentialCollector#processViewRequest(Map<String, String> inputParams, OMCredentialCollectorCallback callback)を定義します。

    ログイン・ビューのカスタマイズについては、次のサンプル・コードを参照してください。

    class MyLoginView implements OMCredentialCollector
    {
        ...
        @Override
        public View processViewRequest(Map<String, String> inputParams, OMCredentialCollectorCallback callback)
        {
            // Create the basic auth view
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            basicAuthView = inflater.inflate(R.layout.mybasicauth, null);
     
            ...
            // You can enable username and password EditText Views, which may be disabled when the log in button is pressed
     
            Button button = (Button) basicAuthView.findViewById(R.id.login);
            button.setOnClickListener(new AuthenticationLoginListener(callback));
     
            Button cancelButton = (Button) basicAuthView.findViewById(R.id.cancel);
            cancelButton.setOnClickListener(new AuthenticationCancelListener(context, callback));
     
            String errorMsg = inputParams.get(ERROR_MESSAGE);
            TextView errorMsgTv = (TextView) basicAuthView.findViewById(R.id.errorMsg);
            if (errorMsg != null && !errorMsg.isEmpty())
            {
                errorMsgTv.setVisibility(View.VISIBLE);
                errorMsgTv.setText(errorMsg);
            }
            else
            {
                errorMsgTv.setVisibility(View.INVISIBLE);
            }
            inputParams.remove(ERROR_MESSAGE);
     
            return basicAuthView;
        }
        //-------------------------------------------------------------------------
        // Inner class which handles the OnClick event
        //-------------------------------------------------------------------------
     
        private class AuthenticationLoginListener implements OnClickListener
        {
            OMCredentialCollectorCallback callback;
     
            AuthenticationLoginListener(OMCredentialCollectorCallback callback)
            {
                this.callback = callback;
            }
     
            @Override
            public void onClick(View v)
            {
                // The developer may show a progress bar and disable the Login and Cancel buttons
                Map<String, String> outputParams = new HashMap<String, String>();
     
                outputParams.put(USERNAME, username);
                outputParams.put(PASSWORD, password);
     
                basicAuthView.invalidate();
     
                callback.processLoginResponse(outputParams);
            }
        }
    }
    // This class is a part of the samples for both Login View and KBA View 
    // Customization
     
    class AuthenticationCancelListener implements OnClickListener
    {
        private OMCredentialCollectorCallback callback;
        private Context context;
     
        AuthenticationCancelListener(Context context, OMCredentialCollectorCallback callback)
        {
            this.context = context;
            this.callback = callback;
        }
     
        @Override
        public void onClick(View view)
        {
            callback.processCancelResponse();
        }
    }
    

    次に、KBAビューのカスタマイズのサンプル・コードを示します。

    class KBAView implements OMCredentialCollector
    {
        ...
        @Override
        public View processViewRequest(Map<String, String> inputParams,
                OMCredentialCollectorCallback callback)
        {
            // Create the view for KBA
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     
            kbaAuthView = inflater.inflate(R.layout.mykbaview, null);
     
            Button button = (Button) kbaAuthView.findViewById(R.id.casubmit);
            button.setOnClickListener(new AuthenticationLoginListener(callback));
     
            Button cancelButton = (Button) kbaAuthView.findViewById(R.id.cacancel);
            cancelButton.setOnClickListener(new AuthenticationCancelListener(
                    context, callback));
     
            TextView question = (TextView) kbaAuthView.findViewById(R.id.cques);
            question.setText(inputParams.get(QUESTION_STR));
     
            return kbaAuthView;
        }
     
        //-------------------------------------------------------------------------
        // Inner class which handles the OnClick event
        //-------------------------------------------------------------------------
     
        private class AuthenticationLoginListener implements OnClickListener
        {
            OMCredentialCollectorCallback callback;
     
            AuthenticationLoginListener(OMCredentialCollectorCallback callback)
            {
                this.callback = callback;
            }
     
            @Override
            public void onClick(View v)
            {
               // You can show a progress bar and disable the submit and 
               // cancel buttons
     
                String answer = chalngAns.getText().toString();
                Map<String, String> outputParams = new HashMap<String, String>();
                outputParams.put(ANSWER_STR, answer);
     
                callback.processLoginResponse(outputParams);
            }
        }
    }
    

10.12 暗号化APIの使用

この項では、SDKによって提供される暗号化APIについて説明します。このSDKでは、これらのAPIを使用して、オフライン認証用の資格証明を保護および格納します。APIのメソッドの詳細は、SDKのダウンロードに含まれるAPIのドキュメントを参照してください。

OMCryptoServiceは、ハッシング、暗号化、復号化、マッチングなどのすべての機能をサポートするクラスです。このインスタンスは、次のようにmssを使用して取得できます。

OMCryptoService cryptoService =  mss.getCryptoService();
 

注意:

11.1.2.2リリースのOMCryptoServiceは、いずれのキーにも依存せずに動作するレガシー機能のサポートを保持しつつ、追加で暗号化、復号化、マッチングなどの機能のためのカスタム・キー渡しをサポートしています。アプリケーションは、暗号化キー自身のライフ・サイクルを管理できるようになっています。SDKの生成キーに依存する必要はありません。同じデータの暗号化と復号化に同じキーを指定するのは、アプリケーションの義務です。SDKが受け取るカスタム・キーはbyte[]配列です。アプリケーションは、使用する暗号化アルゴリズムに基づいて互換性のあるキー・サイズを指定する必要があります。

次に、この暗号化APIによって提供される機能の概要を示します。

ハッシング

ハッシング機能を使用して、暗号スキーム・アルゴリズムに基づいて平文のハッシュを生成します。ソルト・アルゴリズムの場合は、入力として指定されるソルトの長さを使用します。このAPIの最後のパラメータは、接頭辞としてアルゴリズム名を付加するかどうかを指定します。

出力は次の形式です。

<Algorithm Name><HashedContent><Salt>

  • ハッシュ化されたコンテンツおよびソルトはBase-64でエンコードされます。

  • アルゴリズム名を接頭辞として付加するのは、そのように指定された場合のみです。

  • ソルトが付加されるのは、ソルト・アルゴリズムの場合のみです。

cryptoService.hash(plainText, scheme, 10, true);

対称鍵による暗号化

このAPIは、対称鍵を使用したデータの暗号化および復号化の実行に役立ちます。暗号化で使用されるキーは、自動的に生成されて資格証明ストアに格納されたもの(SDKのデフォルト・キー)か、アプリケーションが指定するカスタム・キーのどちらかです。

暗号化の出力は次の形式です。

<scheme/mode/padding> <Initialization Vector><Encrypted text>:

初期化ベクターおよび暗号化されたテキストは、いずれもBase-64でエンコードされます。初期化ベクターは、後で復号化するときにも使用されます。

cryptoService.encrypt(plainText, scheme, msc.getCryptoMode(), msc.getCryptoPadding(), true);

カスタム・キーを使用する場合は、次のようにします。

cryptoService.encrypt(plainText, scheme, msc.getCryptoMode(), msc.getCryptoPadding(), true, customKey);

復号化キーは、自動的に資格証明ストアから取得する(SDKのデフォルト・キー)か、暗号化がカスタム・キーを使用して行われた場合はアプリケーションが指定します。復号化されたテキストは、次のメソッドの出力によって得られます。SDKのデフォルト・キーは、最初にencryptメソッドが呼び出されるときに、SDKによって自動的に生成されます。

cryptoService.decrypt(encodedText);

カスタム・キーを使用する場合は、次のようにします。

cryptoService.decrypt(encodedText,customKey);URL

平文と暗号化/ハッシュ化されたテキストのマッチング

次のメソッドは、入力されたエンコード済テキストをチェックし、暗号化またはハッシュの際に使用されたoracle.idm.mobile.crypto.CryptoSchemeを検出します。暗号化されている場合は、エンコードされているテキストを復号化し、平文と比較します。ハッシュされている場合は、平文のハッシングを実行し、エンコードされているテキストと比較します。比較結果に応じて、trueまたはfalseを返します。


注意:

テキストがカスタム・キーを使用して暗号化される場合は、アプリケーションはmatch()メソッドで同じキーを渡す必要があります。

cryptoService.match(password, passwordStored, mss.getMobileSecurityConfig().getSaltLength());

カスタム・キーを使用する場合は、次のようにします。

cryptoService.match(password, passwordStored, mss.getMobileSecurityConfig().getSaltLength(), customKey);

10.13 自動ログインおよび資格証明保存機能の使用

Mobile and Social AndroidクライアントSDKは、ユーザー資格証明を安全に格納し、それをユーザー操作の有無にかかわらずログイン・サーバーに対して再生できるAPIを提供します。この機能をセキュリティが極端に重要ではないアプリケーションにデプロイすると、ユーザーが簡単にログインできるようになります。この機能には、バージョン11.1.2.2.0以上のMobile and SocialクライアントSDKが必要です。

ユーザーがログイン画面上にある最大3つまでのオプション・ボックスから1つを選択すると、この機能を使用できます。(アプリケーションで、1つ、2つまたは3つ全部のオプションを有効化することを選択できます。)2つ以上のオプションが選択された場合、優先度の高い機能が優先されます。オプションの優先度は、次のとおりです。


1. 自動ログイン
2. 資格証明の保存
3. ユーザー名のみ保存

そのため、たとえば自動ログインおよび資格証明の保存が選択されている場合、自動ログインが優先されます。

次は、3つのオプションの説明です。

  • 自動ログイン - Mobile and Social AndroidクライアントSDKがユーザーの資格証明を安全にキャッシュし、ログイン画面に自動的に提供します。このオプションが指定されると、ログインの際にユーザーの操作が必要なくなります。認証を行う間、ユーザーにフィードバックを提供する進行状況画面が表示されます。

  • 資格証明の保存 - Mobile and Social AndroidクライアントSDKがユーザーの資格証明を安全にキャッシュし、自動的にログイン画面のユーザー名およびパスワード・フィールドを設定します。ユーザーは、ログイン・ボタンをクリックして認証プロセスを進める必要があります。必要に応じて、ユーザーは異なる資格証明を入力したり、オプション・ボックスを変更することができます。

  • ユーザー名のみ保存 - Mobile and Social AndroidクライアントSDKがユーザー名を安全にキャッシュし、自動的にログイン画面のユーザー名を設定します。ユーザーは、パスワードを入力してログイン・ボタンをクリックし、認証プロセスを進める必要があります。必要に応じて、ユーザーは異なるユーザー名を入力したり、オプション・ボックスを変更することができます。

機能の有効化

これは、デプロイにあたってサーバー構成を必要としないクライアント側のみの機能です。前述の機能を有効化するには、次のSDK構成パラメータをコードに追加する必要があります。

表10-7 自動ログインおよび資格証明の保存機能の有効化に使用する構成パラメータ

パラメータ 説明

OM_PROP_AUTO_LOGIN_ALLOWED

自動ログイン機能を有効化/無効化するブール値

OM_PROP_REMEMBER_CREDENTIALS_ALLOWED

資格証明の保存機能を有効化/無効化するブール値

OM_PROP_REMEMBER_USERNAME_ALLOWED

ユーザー名のみ保存機能を有効化/無効化するブール値


ユーザー・プリファレンスの処理

mssオブジェクトの初期化中に次のプロパティを渡して、オプション・ボックスにデフォルト値を事前移入します。trueにできるのは、次のオプションの中の1つのみです。すべてのオプション・ボックスがfalseの場合、ログイン画面のすべてのオプション・ボックスが空になります。

表10-8 オプション・ボックスのデフォルト値設定に使用する構成パラメータ

パラメータ 説明

OM_AUTO_LOGIN_DEFAULT

「自動ログイン」オプション・ボックスのデフォルト値を指定するブール値

OM_REMEMBER_CREDENTIAL_DEFAULT

「資格証明の保存」オプション・ボックスのデフォルト値を指定するブール値

OM_REMEMBER_USERNAME_DEFAULT

「ユーザー名のみ保存」オプション・ボックスのデフォルト値を指定するブール値


オプション・ボックスの状態をキーと値のペアとしてSharedPreferencesに永続化します。各ログイン接続用のユーザー・プリファレンスが一意に識別されるように、サーバーURLおよびアプリケーションの識別子の組合せをキーとして使用します。

モバイル・デバイスからの資格証明およびプリファレンスの消去

ユーザーの資格証明が最終ログイン以降に変更された場合や、ネットワークやサービスの問題でモバイル・デバイスが認証サービスにアクセスできない場合、認証が失敗することがあります。保存されている資格証明で認証が失敗した場合、SDKは共有プリファレンスから保存されているパスワード(存在する場合)を削除します。その後ログイン・ページは、ユーザー名のみ保存機能に戻るか、OMMobileServiceCallbackを使用して制御がモバイル・アプリケーションに戻されるかのどちらかになります。この決定は、OM_PROP_MAX_LOGIN_ATTEMPTSという名前のSDKレベルのパラメータに基づきます。このパラメータは、制御がモバイル・アプリケーションに戻される前に何回の正しくない認証の試行が許可されるかを保存する数値です。

次のシナリオでは、保存されたユーザーのパスワードがSDKによってモバイル・デバイスから消去されます。

  • ユーザー認証に失敗した(たとえば、サーバーのパスワードが有効でなくなった、ユーザーがブロックされている、または別の理由でユーザー認証が失敗した)場合

  • Mobile and Social AndroidクライアントSDKのlogoutメソッドが呼ばれた場合

  • セッション・タイムアウトが検知された場合

次のシナリオでは、保存されたユーザー名、パスワードおよびオプション・ボックスの状態がSDKによってモバイル・デバイスから消去されます。

  • forgetDeviceパラメータをtrueに設定してMobile and Social AndroidクライアントSDKのlogoutメソッドが呼ばれた場合

カスタム・ログイン画面の作成

Mobile and Social AndroidクライアントSDKは、カスタム・ビューを展開するために使用するprocessViewRequestコールバック内のinput paramsマップでフラグを送信します。(詳細は、第10.11項「ログイン・ビューおよびKBAビューのカスタマイズ」を参照してください。)このフラグは、自動ログインおよび資格証明の保存機能専用で、初期化中に指定された機能が有効化または無効化されているか、これらの機能用にどのUIプリファレンスが設定される必要があるかを示します。また、SDKは、ユーザー名を保存および資格証明を保存オプションのために、必要に応じてユーザー名およびパスワードを送信します。

SDKが提供する基本ログイン・ビューを使用するのではなく、カスタム・ログイン画面を作成する場合は、次を行います。

  • 自動ログイン/資格証明の保存フラグの正しい受信および解釈

  • 機能を有効化するかどうかを示すフラグ用のオプション・ボックスの可視性の制御

  • ユーザーにビューを表示する際に、UIプリファレンスを示すフラグでオプション・ボックスの状態を更新

  • 送信ボタンが押された後に、オプション・ボックスの状態を読み込み、同じ値を送信

次の表に、認証inputParamsマップ内の資格証明プロパティにアクセスするために使用する必要があるキーを示します。

表10-9 資格証明プロパティへのアクセスに使用するinputParamsマップのキー

キー 説明

OMMobileSecurityService.OM_PROP_AUTO_LOGIN_ALLOWED

自動ログイン機能を有効化/無効化するブール値

OMMobileSecurityService.OM_PROP_REMEMBER_CREDENTIALS_ALLOWED

資格証明の保存機能を有効化/無効化するブール値

OMMobileSecurityService.OM_PROP_REMEMBER_USERNAME_ALLOWED

ユーザー名のみ保存機能を有効化/無効化するブール値

OMSecurityConstants.OM_AUTO_LOGIN_PREF

最後の認証に基づく自動ログイン機能に関するユーザーのプリファレンスを指定するブール値

OMSecurityConstants.OM_REMEMBER_CREDENTIALS_PREF

最後の認証に基づく資格証明の保存機能に関するユーザーのプリファレンスを指定するブール値

OMSecurityConstants.OM_REMEMBER_USERNAME_PREF

最後の認証に基づくユーザー名のみ保存機能に関するユーザーのプリファレンスを指定するブール値

OMSecurityConstants.USERNAME

ユーザーのユーザー名を指定する文字列値

OMSecurityConstants.PASSWORD

ユーザーのパスワードを指定する文字列値


次のコード・サンプルで、資格証明の保存フラグを使用してオプション・ボックスの可視性およびUI状態を制御する方法を示します。

// RC
CheckBox autoLogin = (CheckBox) basicAuthView.findViewById(R.id.autoLoginCB);
CheckBox rememberCredentials = (CheckBox) basicAuthView.findViewById(R.id.rememberCredentialsCB);
CheckBox rememberUsername = (CheckBox) basicAuthView.findViewById(R.id.rememberUsernameCB);
// RC
button.setOnClickListener(new AuthenticationLoginListener(callback));
 
Button cancelButton = (Button) basicAuthView.findViewById(R.id.cancel);
cancelButton.setOnClickListener(new AuthenticationCancelListener(asm,callback));
 
EditText username = (EditText) basicAuthView.findViewById(R.id.username);
username.setEnabled(true);
EditText password = (EditText) basicAuthView.findViewById(R.id.password);
password.setEnabled(true);
String usernameFromRCStore = null;
String passwordFromRCStore = null;
String identityFromRCStore = null;
boolean rcUseCase = false;
// Try to get the user name or password stored by the SDK.
// Note: This is possible only if the Remember Credentials feature is
// enabled.
if (inputParams.containsKey(USERNAME))
{
  usernameFromRCStore = (String) inputParams.get(USERNAME);
}
if (inputParams.containsKey(PASSWORD))
{
  passwordFromRCStore = (String) inputParams.get(PASSWORD);
}
 
Object autoLoginAllowedObj = inputParams.get(OMMobileSecurityService.OM_PROP_AUTO_LOGIN_ALLOWED);
if (autoLoginAllowedObj != null)
{
  boolean autoLoginAllowed = ((Boolean) autoLoginAllowedObj);
  // feature enabled now set the visibility to true.
  if (autoLoginAllowed)
  {
    autoLogin.setVisibility(View.VISIBLE);
    Object alChecked = inputParams.get(OMSecurityConstants.OM_AUTO_LOGIN_PREF);
    if (alChecked != null)
    {
      autoLogin.setChecked((Boolean)alChecked);
    }
    rcUseCase = true;
  }
}
 
Object remCredObj = inputParams.get(OMMobileSecurityService.OM_PROP_REMEMBER_CREDENTIALS_ALLOWED);
if (remCredObj != null)
{
  boolean rememberCredentialsAllowed = ((Boolean) remCredObj);
  if (rememberCredentialsAllowed)
  {
    // feature enabled now set the visibility to true.
    rememberCredentials.setVisibility(View.VISIBLE);
    Object rcChecked = inputParams.get(OMSecurityConstants.OM_REMEMBER_CREDENTIALS_PREF);
    if (rcChecked != null)
    {
      rememberCredentials.setChecked((Boolean)rcChecked);
    }
    rcUseCase = true;
  }
}

Object remUserObj = inputParams.get(OMMobileSecurityService.OM_PROP_REMEMBER_CREDENTIALS_ALLOWED);
if (remUserObj != null)
{
  boolean rememberUsernameAllowed = ((Boolean) remUserObj);
  if (rememberUsernameAllowed)
  {
    // feature enabled now set the visibility to true.
    rememberUsername.setVisibility(View.VISIBLE);
    Object ruChecked = inputParams.get(OMSecurityConstants.
OM_REMEMBER_USERNAME_PREF);
    if (ruChecked != null)
    {
      rememberUsername.setChecked((Boolean)ruChecked);
    }
    rcUseCase = true;
  }
}
// pre filling
if (rcUseCase)
{
  if (usernameFromRCStore != null && usernameFromRCStore.length() > 0)
  {
    username.setText(usernameFromRCStore);
  }
  if (passwordFromRCStore != null && passwordFromRCStore.length() > 0)
  {
    password.setText(passwordFromRCStore);
  }
}
// RC
 

次のコード・サンプルで、送信(またはログオン)ボタンが押された際にオプション・ボックスの可視性およびUI状態を制御する方法を示します。

// Do the registration and then perform the authentication
EditText username = (EditText) basicAuthView.findViewById(R.id.username);
username.setEnabled(false);
 
EditText password = (EditText) basicAuthView.findViewById(R.id.password);
password.setEnabled(false);

 
Button button = (Button) basicAuthView.findViewById(R.id.login);
button.setEnabled(false);
 
Button cancelButton = (Button) basicAuthView.findViewById(R.id.cancel);
cancelButton.setEnabled(false);
// RC
CheckBox autoLogin = (CheckBox) basicAuthView.findViewById(R.id.autoLoginCB);
CheckBox rememberCredentials = (CheckBox) basicAuthView.findViewById(R.id.rememberCredentialsCB);
CheckBox rememberUsername = (CheckBox) basicAuthView.findViewById(R.id.rememberUsernameCB);
// RC
InputMethodManager imm = (InputMethodManager) asm.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(username.getWindowToken(), 0);
 
String uname = username.getText().toString();
String pwd = password.getText().toString();
 
Map<String, Object> outputParams = new HashMap<String, Object>();
//sending the username passord for the authentication purpose.
outputParams.put(USERNAME, uname);
outputParams.put(PASSWORD, pwd);
// RC
//sending UI preferences for the current auth /login screen to the SDK 
outputParams.put(OMSecurityConstants.OM_AUTO_LOGIN_PREF,autoLogin.isChecked());
outputParams.put(OMSecurityConstants.OM_REMEMBER_CREDENTIALS_PREF,rememberCredentials.isChecked());
outputParams.put(OMSecurityConstants.OM_REMEMBER_USERNAME_PREF,rememberUsername.isChecked());
// RC
 
basicAuthView.invalidate();
 
callback.processLoginResponse(outputParams);

10.14 AndroidクライアントSDKのセキュア・ストレージ・モジュールを使用したCredentialStoreServiceの起動

SDKのCredentialStoreServiceは、機密性の高いデータの格納と取出しを行います。内部では、Android SDKが提供するSharedPreferencesクラスが使用されます。詳細は、次のWebページを参照してください。

http://developer.android.com/reference/android/content/SharedPreferences.html

CredentialStoreServiceは、OMMobileSecurityService#getCredentialStoreService()を使用してOMCredentialStoreのインスタンスの参照を取得することから使用を開始します。CredentialStoreServiceの参照を取得したら、資格証明ストアで資格証明の追加、更新、削除、読取りを行うことができます。詳細は、SDKのドキュメントを参照してください。

次のサンプル・コード・スニペットは、使用方法を示しています。

OMCredentialStore credentialStore = mss.getCredentialStoreService();
credentialStore.addCredential("sampleKey", "sampleUsername", "samplePassword", "sampleTenantName", properties);
// properties is a Map<String, String>. This method will convert all the
// parameters like username, password, tenant name and properties into a JSON
// string and store the same in CredentialStore
OMCredential credential = credentialStore.getCredential("sampleKey");
// This method will retrieve the credential information on supplying the correct
// key
        

10.15 エラー・コード

この項では、AndroidクライアントSDKによってスローされるエラー・コードおよびメッセージについて説明します。エラー・コードおよびそれに対応するメッセージは列挙としてコード化され、パブリックAPIとして公開されます。

表10-10 Mobile and Social AndroidクライアントSDKのエラー・コードおよびメッセージ

エラー・コード 説明

COULD_NOT_CONNECT_TO_SERVER(1, "Could not establish a connection to the server.")

SDKがサーバーに接続できない場合、この例外がスローされます。これは、URISyntaxExceptionやIllegalArgumentExceptionなどが原因で発生する可能性があります。

CHALLENGE_INVALID(2, "Challenge answer is invalid.")

ナレッジ・ベース認証(KBA)でユーザーがチャレンジ回答を入力しなかった場合、この例外がスローされます。

UN_PWD_INVALID(3, "Username and Password is invalid.")

サーバーとの間の認証コールの実行前にユーザーがUIでユーザー名およびパスワードを入力しなかった場合、およびサーバーから401 Unauthorizedの応答があった場合、この例外がスローされます。

TOKENS_NOT_MATCHED(4, R.string.tokensNoMatch)

サーバーから返されたトークンの中に、リクエストした必要なトークンが存在しない場合、この例外がスローされます。

COULD_NOT_PARSE_RESPONSE_FROM_SERVER(5, "Could not parse the response sent from the server.")

サーバーから返されたHttpResponseをSDKが解析できない場合、この例外がスローされます。

DEVICE_NOT_AUTHENTICATED(6, "This device is not yet authenticated with Mobile and Social Server.")

RestAuthenticationServiceを使用した認証でデバイス登録トークンが見つからないことが判明した場合、この例外がスローされます。

USER_CANCELED_CERTIFICATE(7, R.string.certificateNotAccepted)

信頼されないSSL証明書がユーザーによって拒否された場合、この例外がスローされます。

NO_AUTHENTICATION_SCHEME(8, "No authentication scheme is specified.")

モバイル・セキュリティ構成オブジェクトに認証スキームが指定されていない場合、この例外がスローされます。

INVALID_BASIC_AUTH_URL(9, R.string.invalidBasicUrl)

指定された認証URLが有効でない場合、この例外がスローされます。

USER_AUTHENTICATION_FAILED(10, "Authentication request failed for user %1$s.")

サーバーからなんらかの内部エラーが返されたためにユーザー認証に失敗した場合、この例外がスローされます。

UN_PWD_TENANT_INVALID(11, R.string.unPwdTenantMissing)

ユーザー名またはパスワードが正しくないために認証が成功しなかった場合、この例外がスローされます。

UNABLE_TO_OPEN_RP_AUTHENTICATION_URL(12, "Unable to open RP Authentication URL.")

SDKが有効なRPログインURLを構築できない場合、この例外がスローされます。

UNABLE_TO_OPEN_SSO_AUTHENTICATION_URL(13, "Unable to open SSO Authentication URL.")

ビジネス・アプリケーションがSSOエージェント・アプリケーションを開けない場合、この例外がスローされます。SSOエージェント・アプリケーションがデバイスにインストールされていないことが原因である場合があります。別の原因として、サーバーのSSOエージェントおよびSSOクライアントのアプリケーション・プロファイルに入力されているAndroidアプリケーション・シグネチャが、デバイスにインストールされているSSOエージェントおよびSSOクライアントのシグネチャと一致していないことが考えられます。

NOT_AUTHORIZED_TO_PARTICIPATE_IN_SSO(14, "Client application is not authorized to participate in SSO.")

ビジネス・アプリケーションが自己認証を行えない場合またはSSOに参加できない場合、この例外がスローされます。これは、サーバー・コンソールの無効な構成が原因です。

SETUP_FAILED_MS(16, "Application profile cannot be downloaded due to missing configuration")

Mobile & Socialサーバーからアプリケーション・プロファイルをダウンロードできない場合、この例外がスローされます。これは、サーバーURL、アプリケーションIDまたはサービス・ドメインがnullまたは空の場合に発生します。

TOKENS_NOT_AVAILABLE(17, R.string.tokensNotAvailable)

認証でSSOエージェント・アプリケーションを呼び出すように構成されているブラウザを通じて保護対象URLにアクセスするときにOAM_IDトークンが利用できない場合、この例外がスローされます。これは、認証スキームがMobileOAMAuthenticationとして設定されていない場合に発生することがあります。

SETUP_NOT_INVOKED(21, "Setup API is not invoked.")

SDKのsetup()メソッドが呼び出されていない場合、この例外がスローされます。

SERVICE_DOMAIN_MISMATCH(22, "Authentication is rejected by the agent as the service domain does not match.")

SSOアプリケーションのサービス・ドメインがSSOクライアント・アプリケーションのサービス・ドメインと一致しない場合、この例外がスローされます。

USER_NOT_YET_AUTHENTICATED(23, "The user is not yet authenticated.")

ユーザーが認証前にprocessHttpRequest()を実行してリソースにアクセスしようとした場合、この例外がスローされます。

APP_SIGNATURE_INVALID(24, "Failed in validating calling application signature.")

SSOアプリケーションがコール元のビジネス・アプリケーションのアプリケーション・シグネチャを検証できない場合、この例外がスローされます。

INITIALIZATION_FAILED(25, "Initialization of the SDK failed, as the required server information is not supplied.")

URLスキームを通じていずれかのアプリケーションが初期化されるときに対象のフィールドへの入力がなかった場合、この例外がスローされます。

INTERNAL_ERROR(26, "Internal Error")

SDKで他のすべての例外が発生した場合は、この例外がスローされます。