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

前
 
次
 

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つのモジュールが含まれます。


重要:

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: 必須オブジェクトの初期化とエンドポイントの宣言

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


注意:

アプリケーションが単一の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の一方を「モバイル・サービス認証」認証スキームを使用して構成し、他方を「インターネット・アイデンティティ認証」認証スキームを使用して構成します。


OMMobileSecurityService mss = OMMobileSecurityService(context, serverUrl, applicationId, serviceDomain, callback);

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


注意:

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

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


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

serverUrl引数は、Mobile and Socialサーバーにアクセスするために必要なURL(プロトコル、ホスト名およびポート番号を含む)です。HTTPおよびHTTPSプロトコルのみがサポートされています。

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

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

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

setup()authenticate()authenticate(String userName, char[] password, OMAuthenticationRequest authRequest, String credentialKey)processSSORequest(Intent intent)processHttpRequest(Intent intent)など、OMMobileSecurityService内のメソッドを呼び出す前に、必ず現在のアクティビティを登録してください。フォアグラウンドでなくなったら、このアクティビティの登録を解除します。メモリー・リークを防止するため、これは必ず実行してください。現在のアクティビティへの参照を渡すには、前述のメソッドをコールするアクティビティに関して、onResume()の中で現在のアクティビティを登録し、onPause()の中でアクティビティの登録を解除します。アクティビティのonCreate()の中でこれらのメソッドのいずれかをコール場合は、それらのメソッドをコールする前にアクティビティを登録します。アクティビティの登録を解除するには、アクティビティがバックグラウンドに移動するときにOMMobileSecurityService#deregisterActivity()メソッドを使用します。

mss.registerActivity(this);

次に、OMMobileSecurityService setupメソッドをコールします。

mss.setup();

setupメソッドは、Mobile and Socialサーバーから構成済セキュリティ・ポリシーおよびアプリケーション・プロファイルを取得します。このメソッドは、Mobile and Socialサーバー上で認証、認可およびユーザー・プロファイル・サービスに接続するために必要なサービス・エンドポイント(URL)のリストも取得します。

これは非同期コールです。アプリケーション・プロファイルのダウンロードが完了するか、またはネットワーク切断などの問題が発生した場合、SDKはcallback.processSetupResponse(OMApplicationProfile profile, OMMobileSecurityException mse)をコールすることによって、コール元のアクティビティに制御を返します。アプリケーション・プロファイルをダウンロードできなかった場合は、OMMobileSecurityException mseで例外の詳細を確認できます。

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

追加情報

次の表は、Mobile and Socialで定義される、標準的なアプリケーション・プロファイルの属性を示しています。SDKは、アプリケーション・プロファイルをダウンロードした後に、これらの属性の解析と格納を行います。

表10-1 構成属性

属性 説明

アクセス・サービスURL

Oracle Access Managementサーバーからアクセス・トークンを取得するために使用するURLです。

オフライン認証の許可

オフライン認証を許可するかどうかを示します。

Androidアプリケーションの署名

Androidアプリケーションの署名です。

要求属性

アイデンティティ要求の一環としてデバイスから収集される各種属性の名前を表す、カンマで区切られた文字列です。

アプリケーション登録の資格証明レベル

これは、モバイル・シングル・サインオンのコンテキストでは、ビジネス・アプリケーションの登録でユーザー名/パスワードの組合せ、またはユーザー・トークンのいずれを使用するかを指定します。

削除サービスURL

Oracle Access Managementサーバーからトークンを削除するために使用するURLです。

モバイル認証スキーム

ユーザー認証で使用する認証スキームを指定します。これには、列挙OMAuthenticationSchemeの値を使用する必要があります。

オフライン認証再試行回数

オフライン認証の最大試行回数です。これを超えるとクライアントに失敗が送信されます。

SSOへの参加

アプリケーションがモバイル・シングル・サインオンをサポートするかどうかを指定します。

プロファイル・キャッシュ継続時間

システムがアプリケーション・プロファイルをキャッシュする時間の長さ(分)です。

登録サービスURL

デバイスの登録に使用される登録サービスURLです。

リライイング・パーティの認証モード

埋込みWebViewの内部からまたは外部ブラウザからインターネット・アイデンティティ認証を呼び出すかどうかを指定します。有効な値はEmbeddedまたはExternalです。

リライイング・パーティ認証URL

リライイング・パーティ認証URLです。

トークン検証サービスURL

トークンの検証に使用されるサービスURLです。

URLスキーム

インターネット・アイデンティティの戻りURLで使用されるURLスキームを指定します。例:

rp://

ユーザー認証サービスURL

Oracle Access Managerサーバーに対してユーザーを認証するために使用されるサービスURLです。

ユーザー・プロファイル・サービスURL

構成されているディレクトリ・サーバーからのユーザーおよびグループの情報にアクセスするために使用されるサービスURLです。


Mobile and Social管理コンソールのアプリケーション・プロファイルの「カスタム設定」セクションの下で次の属性を構成します。構成する属性に関しては、次の表に示す属性の名前をコンソールに入力します。属性の値はアプリケーション・プロファイルの一部としてダウンロードされ、値はSDKによって内部で設定されます。

表10-2 コンソールUIで構成される属性

属性 説明

ConnectionTimeout

サーバーとSDKの間のHTTP接続がタイムアウトになる時間の長さ(秒)です。

CryptoScheme

オフライン認証のためにパスワードを保存する際にハッシュまたは暗号化を行うかを示すCryptoSchemeの列挙です。有効な値は、SHA-1、SHA-256、SHA-384、SHA-512、SaltedSHA-1、SaltedSHA-256、SaltedSHA-384、SaltedSHA-512、MD2、MD5、AESまたはDESです。

SessionTimeout

オフライン認証コンテキストが削除されるまでの時間の長さ(秒)です。


手順2: 認証プロセスの実行

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

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

View view = mss.authenticate();

setContentView(view);

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

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

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

public void processAuthenticationResponse(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ビューのカスタマイズ」を参照してください。


10.3 AndroidクライアントSDKを初期化する別の方法

第10.2項で示したコンストラクタ以外にも、次のコンストラクタを使用してAndroidクライアントSDKを初期化できます。

public OMMobileSecurityService(Context context, Map<String, Object> configProperties,OMMobileServiceCallback callback)

このコンストラクタは開始時に詳細情報を受け取り、Map<String, Object>を使用してOMMobileSecurityServiceオブジェクトを初期化します。これにより、OM_PROP_AUTH_KEYOM_PROP_LOCATION_UPDATE_ENABLEDOM_PROP_CRYPTO_SCHEMEなどの追加パラメータを指定できます。これらの追加パラメータは、前述のコンストラクタによる初期化時には指定できません。これらのプロパティは、表10-3で説明されています。第10.2項で説明するコンストラクタを使用してOMMobileSecurityServiceオブジェクトを構築する場合は、セッターを使用してこれらのパラメータを設定することもできます。次に例を示します。

OMMobileSecurityConfiguration mobileSecurityConfiguration = mobileSecurityService.getMobileSecurityConfig();
MobileSecurityConfiguration.setLocationUpdateEnabled(true);

初期化サンプル・コード

        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, "xyzDomain");
          configProp.put(OMMobileSecurityService.OM_PROP_APPNAME, "ShopCart");
          configProp.put(OMMobileSecurityService.OM_PROP_OAMMS_URL, "http://examplehost.us.example.com:14100");
 
          //This next line is optional. If you do not include it, a default key 
          //is used which is <OAMMS_URL>_<APPNAME>_<SERVICE_DOMAIN>
 
          //configProp.put(OMMobileSecurityService.OM_PROP_AUTH_KEY, "testKey"); 
 
 
          OMMobileSecurityService mss = new OMMobileSecurityService(getApplicationContext(), configProp, callback);
 
          //In the previous line, getApplicationContext() is the context of the
          //calling application, and callback is the instance of a class that has
          //implemented the interface OMMobileServiceCallback.

次の表は、Map<String, Object>に値を格納する際に使用するキーについての説明です。

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

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

OM_PROP_AUTHSERVER_TYPE

  • OMMobileSecurityService.AuthServerType.OAMMS

Enum (OMMobileSecurityService.AuthServerType)

OM_PROP_OAMMS_URL

必須プロパティ。プロトコル、ホスト、ポートの情報を次の形式で保持する文字列です。<protocol>://<host>:<port>

String

OM_PROP_OAMMS_SERVICE_DOMAIN

必須プロパティ。Stringオブジェクトとして渡される任意の有効なサービス・ドメイン名。

String

OM_PROP_APPNAME

必須プロパティ。Stringオブジェクトとして渡される有効なアプリケーション名。

String

OM_PROP_AUTH_KEY

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

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

String

OM_PROP_LOCATION_UPDATE_ENABLED

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

Boolean

OM_PROP_CONNECTIVITY_MODE

認証がどのように行われるかを指定します。具体的には、認証が常にオンラインまたはオフラインで実行されるか、あるいはネットワーク接続に応じてオンライン/オフラインを切り替えるかを指定します。

これはオプション・プロパティです。デフォルトでは、ネットワーク接続に応じてオンライン/オフラインを切り替えて認証が行われます。

Enum(OMConnectivityMode)


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

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

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

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

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

OM_PROP_CRYPTO_SCHEME

PLAINTEXT("PlainText")

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.4 オフライン認証について

Mobile and Socialでは、オフライン認証をサポートしています。

OMMobileSecurityServiceオブジェクトを作成するときに、オフライン認証を行う方法を指定します。表10-3に記載されているOM_PROP_CONNECTIVITY_MODEキーを使用します。このキーには次の値を使用できます。

OMMobileSecurityServiceオブジェクトを作成した後は、次に示すセッターを使用してオフライン認証を設定できます。

OMMobileSecurityConfiguration mobileSecurityConfiguration = mobileSecurityService.getMobileSecurityConfig();
mobileSecurityConfiguration.setConnectivityMode(OMConnectivityMode.OFFLINE);

注意:

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


10.5 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.6 モバイル・シングル・サインオン・エージェント・アプリケーションの起動

この項では、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.9項「AndroidクライアントSDKを使用したカスタム・モバイル・シングル・サインオン・エージェント・アプリケーションの作成」を参照してください。

10.6.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.6.2 モバイル・ブラウザを使用したモバイル・シングル・サインオン・エージェント・アプリケーションの起動

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

  1. Oracle Access Management管理コンソールにログオンして、「ポリシー構成」タブをクリックします。

  2. 「共有コンポーネント」で、「認証スキーム」をクリックし、「作成」ボタンをクリックします。

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

  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によって保護されるURIです。

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

10.7 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.8 REST Webサービスの起動

Mobile and Social SDKを使用して、Mobile and SocialサービスによりAccess Managerに対して認証できます。Access Managerに対して認証すると、SDKはトークンを取得し、それをCookieストアで永続化して、Access Managerで保護されたアプリケーションが埋め込まれたWebブラウザを使用できるようにします。ただし、Access Managerで保護されているREST Webサービスは、Webブラウザを使用してアクセスできません。

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 value configured for
        // "OAMAuthUserAgentPrefix" parameter in OAM 11g R2 Webgate in user defined parameters
        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プロパティが含まれている必要があります。サンプル・コードに示すように、モバイル・アプリケーションのヘッダーにOAMAuthUserAgentPrefixプロパティの値を指定する必要があります。

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

  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にアクセスします。

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

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

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

エージェント・アプリケーションのOMMobileSecurityServiceオブジェクトがコンストラクタOMMobileSecurityService(Context context, Intent intent, OMMobileServiceCallback callback)を使用して初期化されていない場合、OMCredentialStoreオブジェクトと次のコード・スニペットに示す詳細を指定します。

OMCredentialStore credentialService = mMobileSecurityService.getCredentialStoreService();
OMMobileSecurityConfiguration cnfg = mMobileSecurityService.getMobileSecurityConfig();
credentialService.putString("sdkInitParams_serverUrl", cnfg.getServerURL().toString());
credentialService.putString("sdkInitParams_serviceDomain", cnfg.getServiceDomain());
credentialService.putString("sdkInitParams_applicationId",appID);
//appID is the application ID string

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

        @Override
        protected void onResume()
        {
            super.onResume();
            mMobileSecurityService.registerActivity(this);
            if (!(SSOApplication) getApplication().isSetupCompleted())
            {
                mMobileSecurityService.setup();
            }
 
            Intent intent = getIntent();
            if (intent.getData() != null || 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
             */
        }
    }

次に示すように、エージェントはアプリケーション内に自己認証ロジックを含めることもできます。

        @Override
        public void onClick(View v)
        {
            switch (v.getId())
            {
                case R.id.login_button:
                    try
                    {
                        if (!((SSOApplication) getApplication()).isSetupCompleted())
                        {
                            mMobileSecurityService.setup();
                        }
                        authView = mMobileSecurityService.authenticate();
                        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
                        relLayout.addView(authView,params);
                    }
                    catch (OMMobileSecurityException e)
                    {
                        e.printStackTrace();
                    }
                    break;
                …
                …
            }
        }

10.10 ログイン・ビューおよび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.11 暗号化APIの使用

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

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

OMCryptoService cryptoService = mMobileSecurityService.getCryptoService();
 

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

ハッシング

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

出力は次の形式です。

<Algorithm Name><HashedContent><Salt>

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

対称鍵による暗号化

このAPIは、対称鍵を使用したデータの暗号化および復号化の実行に役立ちます。暗号化で使用されるキーは自動的に生成され、資格証明ストアに格納されます。

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

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

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

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

復号化のキーは資格証明ストアから自動的に取得され、復号化されたテキストは次のメソッドの出力として得ることができます。このキーは、最初にencryptメソッドが呼び出されるときに、SDKによって自動的に生成されます。

cryptoService.decrypt(encodedText);

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

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

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

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

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

mMobileSecurityService

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.13 エラー・コード

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

表10-5 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)

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

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で他のすべての例外が発生した場合は、この例外がスローされます。