Oracle® Fusion Middleware Oracle Access Management開発者ガイド 11g リリース2 (11.1.2.2.0) for All Platforms B69537-08 |
|
前 |
次 |
この章では、AndroidクライアントSDKを使用してモバイル・サービス・アプリケーションを開発する方法について説明します。このSDKは、Androidデバイス向けのセキュアなモバイル・アプリケーションを開発するためのセキュリティ・レイヤーとして機能します。このSDKを使用することにより、認証、認可、ユーザー・プロファイル・サービスおよびセキュアな記憶域を制御でき、アプリケーションの開発が簡素化されます。Mobile and Social AndroidクライアントSDKによってサポートされるAndroidのバージョンはAndroid 2.2以上です。この章の内容は次のとおりです。
第10.8項「AndroidクライアントSDKのユーザー・ロール・モジュールを使用したユーザー・プロファイル・サービスの起動」
第10.10項「AndroidクライアントSDKを使用したカスタム・モバイル・シングル・サインオン・エージェント・アプリケーションの作成」
第10.14項「AndroidクライアントSDKのセキュア・ストレージ・モジュールを使用したCredentialStoreServiceの起動」
この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以上です。 |
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の開発者向けドキュメントを参照してください。
この項では、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のパラメータ
パラメータ | 説明 |
---|---|
|
|
|
構成プロパティを含むマップです。構成プロパティの一覧は、第10.4項「初期化プロパティ」の表10-5を参照してください。 |
|
|
初期化サンプル・コード
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つのみ維持されるようにするため、およびシングル・サインオン機能をサポートするために必要です。
アプリケーションのライフ・サイクル全体を通じて Applicationクラスの拡張の詳細は、次のAndroidのドキュメントを参照してください。
アプリケーションの認証が、異なる複数のOAMサーバーで行われるか、または同一OAMサーバーの異なる複数の認証スキームを使用して行われる場合は、サーバーまたは認証スキームごとに1つの |
手順2: アクティビティの登録
OMMobileSecurityService
でsetup()
、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(); } }
手順5: logout()メソッドの呼出し
次のメソッドを呼び出して、ユーザーをログアウトします。
mobileSecurityService.logout(boolen isForgetDevice)
表10-2 logout()メソッドのパラメータ
パラメータ名 | パラメータ値 | 型 |
---|---|---|
|
|
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(); } }
URLを使用してSDKを初期化するには、必要な構成プロパティを含むURLを使用します。URLは次の形式である必要があります。
<scheme>://[host]?<parameter1>::=<value1>&<parameter2>::=<value2>&...&<parameterN>::=<valueN>
説明:
scheme
- URLのスキーム部分です。http://developer.android.com/guide/topics/manifest/data-element.html#scheme
に説明があるように、AndroidManifest.xml
ファイルで同じ宣言を行う必要があります。
parameterX, valueX
- 構成URLで指定できるパラメータおよび値の一覧については、第10.4項「初期化プロパティ」の表10-5を参照してください。
次に、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()メソッドのパラメータ
パラメータ名 | 説明 |
---|---|
|
コール元のアプリケーションのコンテキストです。常に |
|
SDK構成プロパティを含むインテントです。 |
|
|
|
このキーに対してSDK構成プロパティが格納されます。 |
|
構成プロパティのマップで返される構成URL内の一連のプロパティ文字列です。オプションで |
parseConfigurationURI()
メソッドを呼び出してSharedPreferences
に構成プロパティを格納すると、次のようにしてOMMobileSecurityService
のインスタンスを作成できるようになります。
OMMobileSecurityService mobileSecurityService = OMMobileSecurityService(Context context, String configurationPropertiesKey, OMMobileServiceCallback callback);
表10-4 URLベースの初期化用のOMMobileSecurityServiceパラメータ
パラメータ | 説明 |
---|---|
|
|
|
このキーに対してSDK構成プロパティが格納されています。 |
|
|
次の初期化プロパティを使用してSDKを初期化します。名前がOM_PROP
で始まるプロパティは、OMMobileSecurityService
クラスの一部です。これらのプロパティを使用して、マップでコンストラクタOMMobileSecurityService(context, configProperties, callback)
に渡されるエントリを指定します。カッコ内の値は、URLベースの初期化用のパラメータ名および対応する値です。
表10-5 AndroidクライアントSDKの初期化プロパティ
プロパティ名 | プロパティの値 | 型 |
---|---|---|
|
|
Enum |
|
必須プロパティ。Mobile and Socialサーバーにアクセスするために必要なプロトコル、ホストおよびポートを含む文字列です。HTTPおよびHTTPSプロトコルのみがサポートされています。 <protocol> |
String |
|
必須プロパティ。Mobile and Socialサーバーで作成されたサービス・ドメインの名前を指定します。 |
String |
|
必須プロパティ。アプリケーションを識別する一意の識別子です。この文字列値はMobile and Socialサーバー管理コンソールのアプリケーション・プロファイルのセクションにあるアプリケーション名の値に一致している必要があります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの定義に関する項を参照してください。 |
String |
|
ユーザーによるログイン試行の最大許容回数。省略可。このプロパティが指定されていない場合、デフォルトは3です。 |
Integer |
|
共有プリファレンス内に これはオプション・プロパティです。このプロパティが指定されないとき、すべての値がnullでない場合には、<login_url>_<applicationName>_<serviceDomain>キーを使用して格納されます。nullが含まれる場合は、<applicationName>のみを使用して格納されます。 |
String |
|
このプロパティを使用して場所の更新を有効または無効にします。これを有効にすると、SDKはデバイスの場所の詳細を収集し、サーバーに送信します。 |
Boolean |
|
省略可。自動ログインを有効にするかどうかを指定します。trueまたはfalseのいずれか。デフォルトでは、これは無効です。 |
Boolean |
|
ユーザー名保存機能を有効にするかどうかを指定します。trueまたはfalseのいずれか。デフォルトでは、これは無効です。 |
Boolean |
|
資格証明保存機能を有効にするかどうかを指定します。trueまたはfalseのいずれか。デフォルトでは、これは無効です。 |
Boolean |
|
自動ログイン・オプション・ボックスのデフォルト設定を表します。trueまたはfalseのいずれか。デフォルト値は |
Boolean |
|
ユーザー名保存オプション・ボックスのデフォルト設定を表します。trueまたはfalseのいずれか。デフォルト値はfalseです。 |
Boolean |
|
資格証明保存オプション・ボックスのデフォルト設定を表します。trueまたはfalseのいずれか。デフォルト値は |
Boolean |
次のOM_PROP_CRYPTO_SCHEME
暗号化プロパティはオプションのプロパティです。アプリケーションでオフライン認証が必要であるにもかかわらずこのプロパティが指定されていない場合、デフォルトの暗号スキームはSSHA512
になります。これは、アプリケーションの必要に応じて、以降のオフライン認証用にパスワードをハッシュ化/暗号化して保存するのに使用されます。
このプロパティはMobile and Socialサーバー・コンソールを使用しても設定できます。「カスタム設定」→「モバイル・カスタム属性」を選択し、表の最後の2列にある属性名および属性値を使用します。
Mobile and Social AndroidクライアントSDKに含まれる暗号化モジュールの詳細は、第10.12項「暗号化APIの使用」を参照してください。
表10-6 AndroidクライアントSDKの暗号スキームのプロパティ属性
プロパティ名 | プロパティの列挙値 | 属性名 | 属性値 |
---|---|---|---|
|
|
|
PlainText |
|
AES |
||
|
SHA-1 |
||
|
SHA-224 |
||
|
SHA-256 |
||
|
SHA-384 |
||
|
SHA-512 |
||
|
SaltedSHA-1 |
||
|
SaltedSHA-224 |
||
|
SaltedSHA-256 |
||
|
SaltedSHA-384 |
||
|
SaltedSHA-512 |
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になります。
この項では、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アプリケーションのアクティビティの完全修飾名を設定する必要があります。このアクティビティは、 |
@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()); } } ... }
この項では、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を使用したカスタム・モバイル・シングル・サインオン・エージェント・アプリケーションの作成」を参照してください。
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()); } } … … }
Webアプリケーションは、モバイルSSOエージェントによって提供されるシングル・サインオン認証機能を使用することもできます。この機能にはAccess Managerが必要です。
Oracle Access Management管理コンソールにログインします。
「起動パッド」が開きます。
「Access Manager」で、「認証スキーム」をクリックし、「認証スキームの作成」ボタンをクリックします。
認証スキームの作成タブが開きます。
次のようにフォームに入力して、新しい認証スキームを作成します。
名前: MobileSSOScheme
認証レベル: 2
チャレンジ・メソッド: FORM
チャレンジ・リダイレクトURL: /oam/server/
認証モジュール: LDAP
チャレンジURL: /mobilesso?serviceDomain=
MobileServiceDomain
ここで、MobileServiceDomainは、シングル・サインオン用に構成されるドメインの名前です。
コンテキスト・タイプ: customWar
コンテキストの値: /oic_rest
Oracle Access Management管理コンソールで、次の手順を実行します。
アプリケーション・ドメインで新しい認証スキームを作成します。
認証スキーム: MobileSSOScheme
(MobileSSOSchemeは、手順1で作成されたスキームです。)
/protectedRes
などのHTTPリソースを作成し、作成された認証スキーム(MobileSSOScheme)を使用してそのリソースを保護します。これは、モバイルWebブラウザからアクセスされ、WebGateによって保護されるURLです。
保護されたリソースにモバイル・ブラウザを使用してアクセスすると、サーバーはモバイルSSOエージェント・アプリケーションを呼び出します。エージェント・アプリケーションはメイン・アクティビティのonResume()
の中でOMMobileSecurityService#processSSORequest(intent)
を呼び出すため、認証、OAM_ID
トークンの取得、このトークンの注入、ブラウザへの制御の戻しなどの複雑な操作については、エージェント・アプリケーションはSDKに制御を委任します。必要なトークンはSSOエージェント・アプリケーションによって設定されるため、ブラウザは保護されたリソースにアクセスできるようになります。
この項では、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サーバーのアプリケーションのドメインに関連付けられているアイデンティティ・ストアからグループの詳細を取得するのに使用できます。
認証の成功後に取得したAuthenticationContext
を渡すことによって、OMUserProfileService
のインスタンスを取得します。認証後は、OMMobileSecurityService#retrieveAuthenticationContext()
を使用して認証コンテキストを取得できます。
次のサンプルでは、mMobileSecurityService
はOMMobileSecurityService
のインスタンスです。
OMUserRoleProfileService userProfileService = mMobileSecurityService.getUserRoleProfileService(authContext);
これらのサービスに対する匿名アクセスが必要な場合は、null
を渡します。
OMUserRoleProfileService userProfileService = mMobileSecurityService.getUserRoleProfileService(null);
次のように、UserManager
またはRoleManger
のいずれかのインスタンスを取得します。
OMUserManager userManager = userProfileService.getUserManager(); OMRoleManager roleManager = userProfileService.getRoleManager();
次のメソッドは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
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
プロパティが含まれている必要があります。サンプル・コードに示すように、モバイル・アプリケーションのヘッダーにも同じプロパティの値を指定する必要があります。
次の手順は、このメソッドが呼び出されたときの内部フローの説明です。
OMMobileSecurityService#processHttpRequest(HttpRequest)
が、モバイル・アプリケーションによって指定されたURLを呼び出します。
Oracle Access Management 11g R2 WebGateが次のような詳細で401エラーを返します。
HTTP/1.1 401 Authorization Required WWW-Authenticate: OAM-Auth realm="<WebGateName>:<AuthenticationLevel> <RelativeRESTURL>", request-ctx="<RequestContext>"
Mobile and Social SDKは、アプリケーションの有効期間中に取得したアクセス・トークンのキャッシュを保持します。このWebGateのアクセス・トークンがすでにキャッシュに存在する場合、SDKはアプリケーション・リクエストにアクセス・トークンを挿入します。
WebGate用アクセス・トークンがMobile and Social SDKキャッシュで使用できない場合、RESTリクエストをMobile and Socialサーバーに送信してWebGate用アクセス・トークンを取得します。
リクエストが有効な場合、Mobile and Socialはレスポンスでアクセス・トークンを返します。
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(); }
この項では、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 */ } }
このSDKでは、基本的なログイン・ビューおよびナレッジ・ベースの回答ビューがデフォルトで表示されます。カスタムのユーザー定義レイアウトを作成するには、次のようにします。
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
でサポートされている任意の認証サービス・タイプ用のカスタム・ビューを設定します。
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); } } }
この項では、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);
Mobile and Social AndroidクライアントSDKは、ユーザー資格証明を安全に格納し、それをユーザー操作の有無にかかわらずログイン・サーバーに対して再生できるAPIを提供します。この機能をセキュリティが極端に重要ではないアプリケーションにデプロイすると、ユーザーが簡単にログインできるようになります。この機能には、バージョン11.1.2.2.0以上のMobile and SocialクライアントSDKが必要です。
ユーザーがログイン画面上にある最大3つまでのオプション・ボックスから1つを選択すると、この機能を使用できます。(アプリケーションで、1つ、2つまたは3つ全部のオプションを有効化することを選択できます。)2つ以上のオプションが選択された場合、優先度の高い機能が優先されます。オプションの優先度は、次のとおりです。
そのため、たとえば自動ログインおよび資格証明の保存が選択されている場合、自動ログインが優先されます。
次は、3つのオプションの説明です。
自動ログイン - Mobile and Social AndroidクライアントSDKがユーザーの資格証明を安全にキャッシュし、ログイン画面に自動的に提供します。このオプションが指定されると、ログインの際にユーザーの操作が必要なくなります。認証を行う間、ユーザーにフィードバックを提供する進行状況画面が表示されます。
資格証明の保存 - Mobile and Social AndroidクライアントSDKがユーザーの資格証明を安全にキャッシュし、自動的にログイン画面のユーザー名およびパスワード・フィールドを設定します。ユーザーは、ログイン・ボタンをクリックして認証プロセスを進める必要があります。必要に応じて、ユーザーは異なる資格証明を入力したり、オプション・ボックスを変更することができます。
ユーザー名のみ保存 - Mobile and Social AndroidクライアントSDKがユーザー名を安全にキャッシュし、自動的にログイン画面のユーザー名を設定します。ユーザーは、パスワードを入力してログイン・ボタンをクリックし、認証プロセスを進める必要があります。必要に応じて、ユーザーは異なるユーザー名を入力したり、オプション・ボックスを変更することができます。
機能の有効化
これは、デプロイにあたってサーバー構成を必要としないクライアント側のみの機能です。前述の機能を有効化するには、次のSDK構成パラメータをコードに追加する必要があります。
表10-7 自動ログインおよび資格証明の保存機能の有効化に使用する構成パラメータ
パラメータ | 説明 |
---|---|
|
自動ログイン機能を有効化/無効化するブール値 |
|
資格証明の保存機能を有効化/無効化するブール値 |
|
ユーザー名のみ保存機能を有効化/無効化するブール値 |
ユーザー・プリファレンスの処理
mss
オブジェクトの初期化中に次のプロパティを渡して、オプション・ボックスにデフォルト値を事前移入します。trueにできるのは、次のオプションの中の1つのみです。すべてのオプション・ボックスがfalseの場合、ログイン画面のすべてのオプション・ボックスが空になります。
表10-8 オプション・ボックスのデフォルト値設定に使用する構成パラメータ
パラメータ | 説明 |
---|---|
|
「自動ログイン」オプション・ボックスのデフォルト値を指定するブール値 |
|
「資格証明の保存」オプション・ボックスのデフォルト値を指定するブール値 |
|
「ユーザー名のみ保存」オプション・ボックスのデフォルト値を指定するブール値 |
オプション・ボックスの状態をキーと値のペアとして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マップのキー
キー | 説明 |
---|---|
|
自動ログイン機能を有効化/無効化するブール値 |
|
資格証明の保存機能を有効化/無効化するブール値 |
|
ユーザー名のみ保存機能を有効化/無効化するブール値 |
|
最後の認証に基づく自動ログイン機能に関するユーザーのプリファレンスを指定するブール値 |
|
最後の認証に基づく資格証明の保存機能に関するユーザーのプリファレンスを指定するブール値 |
|
最後の認証に基づくユーザー名のみ保存機能に関するユーザーのプリファレンスを指定するブール値 |
|
ユーザーのユーザー名を指定する文字列値 |
|
ユーザーのパスワードを指定する文字列値 |
次のコード・サンプルで、資格証明の保存フラグを使用してオプション・ボックスの可視性および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);
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
この項では、AndroidクライアントSDKによってスローされるエラー・コードおよびメッセージについて説明します。エラー・コードおよびそれに対応するメッセージは列挙としてコード化され、パブリックAPIとして公開されます。
表10-10 Mobile and Social AndroidクライアントSDKのエラー・コードおよびメッセージ
エラー・コード | 説明 |
---|---|
|
SDKがサーバーに接続できない場合、この例外がスローされます。これは、URISyntaxExceptionやIllegalArgumentExceptionなどが原因で発生する可能性があります。 |
|
ナレッジ・ベース認証(KBA)でユーザーがチャレンジ回答を入力しなかった場合、この例外がスローされます。 |
|
サーバーとの間の認証コールの実行前にユーザーがUIでユーザー名およびパスワードを入力しなかった場合、およびサーバーから401 Unauthorizedの応答があった場合、この例外がスローされます。 |
|
サーバーから返されたトークンの中に、リクエストした必要なトークンが存在しない場合、この例外がスローされます。 |
|
サーバーから返された |
|
|
|
信頼されないSSL証明書がユーザーによって拒否された場合、この例外がスローされます。 |
|
モバイル・セキュリティ構成オブジェクトに認証スキームが指定されていない場合、この例外がスローされます。 |
|
指定された認証URLが有効でない場合、この例外がスローされます。 |
|
サーバーからなんらかの内部エラーが返されたためにユーザー認証に失敗した場合、この例外がスローされます。 |
|
ユーザー名またはパスワードが正しくないために認証が成功しなかった場合、この例外がスローされます。 |
|
SDKが有効なRPログインURLを構築できない場合、この例外がスローされます。 |
|
ビジネス・アプリケーションがSSOエージェント・アプリケーションを開けない場合、この例外がスローされます。SSOエージェント・アプリケーションがデバイスにインストールされていないことが原因である場合があります。別の原因として、サーバーのSSOエージェントおよびSSOクライアントのアプリケーション・プロファイルに入力されているAndroidアプリケーション・シグネチャが、デバイスにインストールされているSSOエージェントおよびSSOクライアントのシグネチャと一致していないことが考えられます。 |
|
ビジネス・アプリケーションが自己認証を行えない場合またはSSOに参加できない場合、この例外がスローされます。これは、サーバー・コンソールの無効な構成が原因です。 |
|
Mobile & Socialサーバーからアプリケーション・プロファイルをダウンロードできない場合、この例外がスローされます。これは、サーバーURL、アプリケーションIDまたはサービス・ドメインがnullまたは空の場合に発生します。 |
|
認証でSSOエージェント・アプリケーションを呼び出すように構成されているブラウザを通じて保護対象URLにアクセスするときに |
|
SDKの |
|
SSOアプリケーションのサービス・ドメインがSSOクライアント・アプリケーションのサービス・ドメインと一致しない場合、この例外がスローされます。 |
|
ユーザーが認証前に |
|
SSOアプリケーションがコール元のビジネス・アプリケーションのアプリケーション・シグネチャを検証できない場合、この例外がスローされます。 |
|
URLスキームを通じていずれかのアプリケーションが初期化されるときに対象のフィールドへの入力がなかった場合、この例外がスローされます。 |
|
SDKで他のすべての例外が発生した場合は、この例外がスローされます。 |