| Oracle® Fusion Middleware Oracle Access Management開発者ガイド 11gリリース2 (11.1.2.3.0) for All Platforms E67354-04 |
|
![]() 前 |
![]() 次 |
この章では、AndroidクライアントSDKを使用してモバイルおよびソーシャル・サービス・アプリケーションを開発する方法について説明します。このSDKは、Androidデバイス向けのセキュアなモバイル・アプリケーションを開発するためのセキュリティ・レイヤーとして機能します。このSDKを使用することにより、認証、認可、ユーザー・プロファイル・サービスおよびセキュアな記憶域を制御でき、アプリケーションの開発が簡素化されます。Mobile and Social AndroidクライアントSDKによってサポートされるAndroidのバージョンはAndroid 2.2以上です。この章の内容は次のとおりです。
AndroidクライアントSDKを使用したカスタム・モバイル・シングル・サインオン・エージェント・アプリケーションの作成
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.14項「暗号化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エージェント・アプリケーションを作成するには、第10.12項「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
IDM Mobile SDKは、双方向SSL相互認証をサポートします。サーバーのアイデンティティを検証するクライアントに加えて、認証サーバーが双方向SSLを実行するように構成されている場合は、サーバーはクライアントのアイデンティティを検証するためにクライアント証明書を必要とします。言い換えると、これは、サーバーがクライアントを識別して匿名アクセスを回避する追加の認証スキームです。
IDM Mobile SDKには、クライアント・アプリケーションがアプリケーション・キーストアでクライアント証明書をインポートするための様々なAPIが用意されています。
クライアント・アプリケーションは、この機能をスタンドアロンの認証スキームとして使用することも、IDM Mobile SDKによってサポートされている他の任意の認証スキームと併用することもできます。
この機能のために、IDM Mobile SDKは、スタンドアロンのクライアント証明書ベース認証のみを実行するアプリケーション用の新しいAuthServerType.CBAを導入します。
サンプル・コード:
configMap.put(OMMobileSecurityService.OM_PROP_APPNAME, "CBAApp"); configMap.put(OMMobileSecurityService.OM_PROP_AUTHSERVER_TYPE, AuthServerType.CBA); configMap.put(OMMobileSecurityService.OM_PROP_LOGIN_URL, "https://myserver.com:1234/cba/");
クライアント証明書認証は、Mobile and Social認証など、他の認証モジュールとも併用できます。アプリケーションは、初期化処理でOM_PROP_PRESENT_CLIENT_IDENTITY_ON_DEMANDプロパティをtrueとして渡すため、そしてSDKは、認証サーバーにより要求されたときにクライアント・アイデンティティを提示するために必要とされるだけです。クライアント・アプリケーションがこのプロパティを提供しない場合、IDM Mobile SDKは、他の認証スキームを使用するクライアント証明書ベースの認証のサポートを提供しません。次のサンプル・コードで説明します。
configProp.put(OMMobileSecurityService.OM_PROP_APPNAME, "OAuthTesterApp"); configProp.put(OMMobileSecurityService.OM_PROP_AUTHSERVER_TYPE, OAUTH20); configProp.put(OMMobileSecurityService.OM_PROP_BROWSER_MODE, BrowserMode.EMBEDDED); configProp .put(OMMobileSecurityService.OM_PROP_LOGIN_FAILURE_URL, .put(OMMobileSecurityService.OM_PROP_LOGIN_URL,"http://login.com");\\\\ configProp.put(OMMobileSecurityService.OM_PROP_LOGIN_SUCCESS_URL, "http://loginsucess.coml");\\\\ configProp.put(OMMobileSecurityService.OM_PROP_LOGOUT_URL, "http://logout.com");\\\\ configProp.put(OMMobileSecurityService.OM_PROP_PRESENT_CLIENT_IDENTITY_ON_DEMAND, true);
|
注意: アプリケーションが、IDM Mobile SDKの証明書インポート機能を使用して一部のサーバーまたはクライアント証明書をインポートまたはプリロードする場合、SDKの設定、認証またはリソース・アクセスを使用するなんらかのネットワーク接続を行う前に済ませておく必要があります。 |
未解決の問題: Android Lより前は、android webviewはネットワーク要求時に双方向SSLチャレンジに応答できず、そのため、SDKはAndroid L未満で実行されているデバイス上のwebviewで、クライアント証明書認証をサポートしません。同じことが、Androidオープン・ソース・プロジェクトで、問題点として追跡されています(https://code.google.com/p/android/issues/detail?id=53491)。
この項では、いずれかの認証プロセスを初期化する前に証明書をインポートまたはプリロードするIDM Mobile SDKの機能について説明します。
IDM Mobile SDKが提供するOMCertServiceクラスは、コンストラクタでアプリケーション・コンテキストを渡すことによって初期化できます。このクラスは、サーバーおよびクライアント証明書のインポートをサポートし、同時に、次の各項で説明する様々な証明書操作もサポートします。
認証プロセスを開始する前にアプリケーションがサーバー証明書またはルート証明書をインポートすると、認証プロセスで、SDKは「信頼できないサーバー証明書」の警告を表示しません。
IDM Mobile SDKは、サーバー証明書を"X509 Certificate"オブジェクトとしてインポートできます。アプリケーションに証明書がバンドルされていて、アプリケーションの初期化処理時にアプリケーション・リソースから証明書をインポートする必要があるとします。次のサンプル・コード・スニペットが、この処理を記述しています。
OMCertService certService = new OMCertService(this.getApplicationContext());
X509Certificate cert;
try
{
InputStream is = getAssets().open("Cert.cer");
cert = readCertificateFromStream(is);
certService.importServerCertificate(cert);
}
catch (CertificateException e2)
{
// TODO Auto-generated catch block
e2.printStackTrace();
}
catch (IOException e2)
{
// TODO Auto-generated catch block
e2.printStackTrace();
}
X509Certificate readCertificateFromStream(final InputStream is)
throws CertificateException
{
CertificateFactory certFactory = CertificateFactory
.getInstance("X.509");
DataInputStream dis = null;
dis = new DataInputStream(is);
try
{
byte[] certBytes = new byte[dis.available()];
dis.readFully(certBytes);
Certificate cert = certFactory
.generateCertificate(new ByteArrayInputStream(certBytes));
if (cert instanceof X509Certificate)
return (X509Certificate) cert;
else
throw new CertificateException();
}
catch (Exception e)
{
throw new CertificateException(e);
}
finally
{
if (dis != null)
{
try
{
dis.close();
}
catch (IOException e)
{
// do nothing
}
}
}
IDM Mobile SDKは、デバイス内の"file"オブジェクト(たとえばmnt、sdcardやその他の任意の外部記憶域の場所、または、/data/data/myapp/certFile.cerなどアプリケーション記憶域の場所)から証明書をインポートする機能もサポートします。次のサンプルで、この機能について説明します。
OMCertService certService = new OMCertService(this.getApplicationContext());
//assuming that the certificate file is "Cert.cer" and is present in /mnt/sdcard
File file = new File(Environment.getExternalStorageDirectory(),"Cert.cer");
try
{
certService.importServerCertificate(file);
}
catch (CertificateException e1)
{
// import cert failed, check for the cause.
}
IDM Mobile SDKを使用するアプリケーションはすべて、ユーザーまたはクライアントのアイデンティティ証明書をインポートできます。OMCertServiceクラスは、UIと非UIの両方のAPIによってクライアント証明書をインポートする機能を提供します。
次の2つのAPIはOMCertServiceクラスにあり、クライアント証明書をインポートするために利用できます。
public void importClientCertificate(File file, char[] pwd)
このAPIは、アプリケーションによりローカルに維持されるキーストアに、指定されたクライアント証明書ファイルをインポートします。そのためには、アプリケーションが.p12証明書ファイル用の"File"オブジェクトとパスワードを渡す必要があります。次のサンプル・コードは、このAPIの使用法を説明しています。
OMCertService certService = new OMCertService(getApplicationContext());
File file = new File(Environment.getExternalStorageDirectory() + "/"
+ "client.p12");
try
{
certService.importClientCertificate(file, "password".toCharArray());
}
catch (CertificateException e)
{
...
}
public void importClientCertificate(Activity activity, File file, OMCertServiceCallback callback)
このAPIはクライアント証明書をインポートするためにも使用されますが、パスワードを受け付けません。その代わり、パスワードを収集するようユーザーに警告します。
|
注意: このAPIは、常にUIスレッドからコールする必要があります。 |
次のサンプル・コードは、このAPIの使用法を説明しています。
certService.importClientCertificate(this,
new File(Environment.getExternalStorageDirectory() + "/"
+ "newuser.p12"), new OMCertServiceCallback()
{
@Override
public void processClientCertifcateImportResponse(CertificateInfo cert, OMMobileSecurityException mse)
{
if (cert != null)
{
... .... .. ..
}
}
});
OMCertServiceクラスには、インポートされた証明書上での操作を実行するための様々なAPIが用意されています。IDM Mobile SDKを使用すると、インポートされたサーバーおよびクライアント証明書上で次の操作を実行できます。
すべてのインポート済証明書をリストする。
個別の証明書の「証明書情報」を取得します。
インポート済証明書を削除します。
OMCertServiceクラスには、インポート済サーバー証明書上で様々な操作を実行する、次のAPIが用意されています。
public List<OMCertInfo> getAllServerCertificateInfo()
このAPIは、SDKトラストストアでインストールされたすべてのサーバー証明書のリストを返します。これらの証明書は、OMCertInfoによって表示されます。
public void deleteAllServerCertificates()
このAPIは、SDKトラストストアのすべてのインポート済サーバー証明書を削除します。
public void deleteServerCertificate(OMCertInfo)
このAPIは、渡されたOMCertInfoオブジェクトによって表される、指定されたサーバー証明書を削除します。
OMCertServiceクラスには、インポート済クライアント証明書上で様々な操作を実行する、次のAPIが用意されています。
public List<OMCertInfo> getAllClientCertificateInfo ()
このAPIは、SDKキーストアでインストールされたすべてのクライアント証明書のリストを返します。これらの証明書は、OMCertInfoによって表示されます。
public void deleteAllClientCertificates()
このAPIは、SDKトラストストアのすべてのインポート済クライアント証明書を削除します。
public void deleteClientCertificate(OMCertInfo)
このAPIは、渡されたOMCertInfoオブジェクトによって表される、指定されたクライアント証明書を削除します。
この項では、OAuthサービスの機能について説明します。次のトピックが含まれています:
OAuthサービスを使用することで、Access Manager環境で、オープン・スタンダードであるOAuth 2.0 Web認可プロトコルを組織に実装できます。OAuthにより、クライアントは、他のユーザー(リソース所有者)に属するAccess Managerの保護されたリソースにアクセスできます。OAuthサービスを使用することで、組織は新規または既存のAccess Manager環境にOAuth 2.0を実装し、OAuthクライアントがOAuth 2.0フローを使用してAccess Managerで保護されているリソースにアクセスできるようになります。OAuthクライアントは、組織で作成および制御されるアプリケーションまたはサービスか、Access Managerで保護されているリソースにアクセスする必要のある別の組織で作成および制御されるアプリケーションまたはサービスのいずれかです。
|
ヒント: OAuthおよび関連概念の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のOAuthサービスの理解に関する章を参照してください |
IDM Mobile SDKは、保護されたリソースにアクセスするために、OAM Mobile and Social (M&S) OAuth Serverに認可を提供します。
正しいプロパティと認証によるIDM Mobile SDK初期化の後、アプリケーションは、他の認証モード下で行ったのと同じ方法で、アクセス・トークンを取得できます。
表10-7は、OAuth 2.0サービスをサポートするために追加された新しい構成プロパティのリストです。
表10-7 OAuth 2.0の構成プロパティ
| 構成プロパティ | 有効な値 | 必須 |
|---|---|---|
|
OM_PROP_AUTHSERVER_TYPE (AuthServerType) |
Enum (oracle.idm.mobile.OMMobileSecurityService.AuthServerType) AuthServerType.OAuth20 (OAuth20) |
はい |
|
OM_PROP_OAUTH_AUTHORIZATION_GRANT (OAuthAuthZGrantType) |
Enum(oracle.idm.OMMobileSecurityConfiguration.OAuthAuthorizationGrantType)、値は次のいずれか。
|
はい |
|
OM_PROP_OAUTH_AUTHORIZATION_ENDPOINT (OAuthAuthZEndpoint) |
URL/String |
これは、M&S Mobile OAuthクライアントを除き、権限タイプとしてAUTHORIZATION_CODEを使用するすべてのクライアント・タイプで必須です。 |
|
OM_PROP_OAUTH_TOKEN_ENDPOINT (OAuthTokenEndpoint) |
URL/String |
これは、M&S Mobile OAuthクライアントを除くすべてのクライアント・タイプで必須です。 |
|
OM_PROP_OAUTH_REDIRECT_ENDPOINT (OAuthRedirectEndpoint) |
String |
これは、M&S Mobile OAuthクライアントを除くすべてのクライアント・タイプで必須です。 |
|
OM_PROP_OAUTH_CLIENT_ID (OAuthClientID) |
String |
はい |
|
OM_PROP_OAUTH_SCOPE (OAuthScope(s)) |
Set<String> |
いいえ |
|
OM_PROP_BROWSER_MODE (BrowserMode) |
Enum (oracle.idm.mobile.OMMobileSecurityConfiguration.BrowserMode) |
いいえ。 ただし、初期化時に何も設定されない場合、デフォルトのオプションはEXTERNALです。 |
|
OM_PROP_OAUTH_CLIENT_SECRET (OAuthClientSecret) |
String |
いいえ |
|
OM_PROP_OAM_OAUTH_SERVICE_ENDPOINT (OAMOAuthServiceEndpoint) |
String/URL |
いいえ。 これは、OAM OAuthモバイル・クライアントでのみ必要とされます。 |
|
OM_PROP_OAUTH_ASSERTION_JWT (OAuthUserJWTAssertionValue) |
String |
いいえ |
|
OM_PROP_OAUTH_ASSERTION_SAML2 (OAuthUserSAML2UserAssertionValue) |
String |
いいえ |
|
OM_PROP_OAUTH_CLIENT_ASSERTION_SAML2 (OAuthClientSAML2AssertionValue) |
String |
いいえ |
|
OM_PROP_OAUTH_CLIENT_ASSERTION_JWT (OAuthClientJWTAssertionValue) |
String |
いいえ |
OAM M&Sサーバーは、モバイルとともに使用できる次のタイプのOAuthクライアントをサポートします。
Webクライアント: 次で説明するように、これらのクライアントはOAuth GenericフローでIDM Mobile SDKを使用できます。Webベース・クライアントは信頼できるクライアントとみなされ、クライアント・シークレットを持っています。このため、認可サーバーは、リクエストするクライアントのアイデンティティを把握しています。このクライアント・タイプを使用する場合、アプリケーションは、SDK初期化時にクライアント・シークレットを渡すはずです。
モバイル・クライアント : モバイル・クライアントは、機密クライアントとみなされません。このため、クライアント・シークレットを持っていません。OAM OAuthサーバーには、エンド・ユーザーのユーザー名およびパスワードとともにデバイス要求を送信することによって、モバイル・クライアントを動的に登録できる機能が用意されています。このフローはOAM OAuthサーバー固有です。動的クライアント登録が実行された後で、IDM Mobile SDKは、クライアント・アサーションとユーザー・アサーションを受信します(SERVER SIDE SSOが有効でない場合)。以降のすべてのアクセス・トークン取得リクエストまたは他のトークン操作では、クライアント・アサーション・トークンを送信する必要があります。IDM Mobile SDKは、クライアント・アサーションのライフ・サイクルを管理し、これをクライアント・アプリケーションに返しません。
| 新しいトークン・タイプ | 特徴 |
|---|---|
| クライアント・アサーション | このトークンは、動的クライアント登録が実行された後に生成されます。このトークンは、認可サーバーに対するすべてのリクエストと一緒に送信する必要があります。サーバーはクライアント・アサーションからのリクエストまたはクライアントを識別し、同じことを検証します。クライアント・アサーションは、通常JWTトークンです。 |
| ユーザー・アサーション | 動的クライアント登録にはユーザー認証が含まれるため、M&Sはクライアント・アサーションとともにユーザー・アサーションを生成します。このユーザー・アサーションは、サーバー側のユーザー・セッションをマークします。ユーザー・アサーションは、SERVER SIDE SSOが無効の場合のみ、サーバーにより返されます。このため、クライアントまたはSDKは、ユーザー・セッションがサーバー側で有効になるまで、同じアサーションを使用して、すべてのリソース・アクセスのアクセス・トークンを取得できます。
また、SERVER SIDE SSOが有効の場合、SDKまたはクライアントは、すべてのリクエストに次のパラメータを追加することによって、なおもユーザー・アサーションを使用できます。
|
OAuthモバイル・クライアント用にサーバーを構成した後で、アプリケーションは、同じ手順を使用してSDKを初期化できます。サーバーの構成に関する詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のOAuthサービスの構成に関する章を参照してください。SDKの初期化の詳細は、10.10.2.1.2項「サポートされている権限タイプでの作業とアクセス・トークンの取得」のサンプル・コードを参照してください。
設定の完了後、アプリケーションは、OAuthの保護されたリソースにアクセスするアクセス・トークンを取得するための認証を実行できます。認証フローは、他のフローと異なりません。アプリケーションは、OMMobileSecurityService#authenticate() APIを呼び出して認証プロセスを開始するだけで済みます。認証が行われた後、SDKはOMMobileServiceCallback#processAuthenticationResponseを呼び出します。認証が成功すると、コンテキストには、user_assertionのような他の補助的トークン(利用できる場合)とともに、アクセス・トークンが含まれます。認証が成功しなかった場合、認証コンテキストはNULLになります。
認証のこのフローには、次の手順が含まれます。
モバイル・クライアントは通常、機密とみなされないため、サーバーはこれらのクライアントのためにいかなるシークレットも作成しません。ただし、OAM M&Sサーバーは、クライアントが自身を動的に登録して、ユーザーおよび登録の実行元デバイスに結合されたクライアント・トークン(client_assertion)を取得する機能を提供します。デバイス情報は、サーバーがユーザーとデバイスを追跡して、OAAMプラグインを起動できるようにするために役立ちます(適用できる場合)。
OAM Mobile and Socialサーバーは、クライアント登録を実行する2つの方法をサポートします。クライアント登録フローは、初期化時にアプリケーションにより提供される権限タイプに基づいて、SDKによって決定されます。権限タイプを定義するために使用されるプロパティは、OM_PROP_OAUTH_AUTHORIZATION_GRANTです。
2-leggedクライアント登録
2-leggedクライアント登録は、権限タイプがRESOURCE_OWNER、ASSERTION、CLIENT_CREDENTIALSまたはOAM_CREDENTIALSに設定されている場合に実行されます。このフローの終了後、SDKはユーザー・アサーション・トークンとともにclient_assertionを受け取ります。
|
注意: クライアント側にuser_assertionがあるかどうかは、サーバーのSERVER_SIDE_SSOプロパティに設定される値によって決まります。 |
3-leggedクライアント登録
3-leggedクライアント登録は、権限タイプがAUTHORIZATION_CODEに設定されている場合に実行されます。このフローは、初期化プロパティに基づいて、外部または埋込みのブラウザを呼び出します。このフローの完了時に、IDM Mobile SDKはclient_assertionトークンのみを受け取ります。
動的クライアント登録が実行され、10.10.2.1.1項「動的クライアント登録」のとおりにSDKが有効なclient_assertionトークンを取得したら、アクセス・トークン取得フローの実行に進むことができます。アクセス・トークンは、初期化プロパティOM_PROP_OAUTH_AUTHORIZATION_GRANTを使用して指定された次の権限タイプを使用して取得できます。初期化のサンプル・コードを次に示します。
Map<String, Object> configMap = new HashMap<String, Object>();
configMap.put(OMMobileSecurityService.OM_PROP_APPNAME,
"MSOAuthClient1");
configMap.put(OMMobileSecurityService.OM_PROP_AUTHSERVER_TYPE,
AuthServerType.OAuth20);
configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_CLIENT_ID,
"1234567890987654321");
configMap.put(
OMMobileSecurityService.OM_PROP_OAUTH_REDIRECT_ENDPOINT,
"idmtester://");
configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_AUTHORIZATION_GRANT_TYPE,
OAuthAuthorizationGrantType.RESOURCE_OWNER);
Set<String> scopeset = new HashSet<String>();
scopeset.add("UserProfile.users");
scopeset.add("UserProfile.secretkey.management");
configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_SCOPE, scopeset);
configMap.put(
OMMobileSecurityService.OM_PROP_OAM_OAUTH_SERVICE_ENDPOINT,
"http://myhost.example.com:18465/ms_oauth/oauth2/endpoints/oauthservice");
configMap.put(OMMobileSecurityService.OM_PROP_BROWSER_MODE, BrowserMode.EXTERNAL);
リソース所有者権限タイプ
初期化プロパティの値はOAuthAuthorizationGrantType.RESOURCE_OWNER.です。この権限タイプでは、2-leggedクライアント登録フローが実行されます(前述)。SDKは、2-leggedクライアント登録フローを完了するために、ユーザー名とパスワードを収集します。このため、SDKは、これらのユーザー資格証明を再利用してアクセス・トークンを取得します。このフローでは、SDKはサーバーが送信したSERVER_SIDE_SSOプロパティを引き受けず、常にユーザー資格証明を送信してアクセス・トークンを取得します。クライアント・アサーションが期限切れになったり無効にされたりした場合、SDKは再びエンド・ユーザー資格証明を要求して、まずクライアント・アサーションを更新し、続いてアクセス・トークンを取得します。
クライアント資格証明権限タイプ
初期化プロパティの値はOAuthAuthorizationGrantType.CLIENT_CREDENTIALSです。この権限タイプにも、2-leggedクライアント登録が含まれます。SDKは、認証フローを完了するために、クライアント登録後に取得したclient_assertionを使用してアクセス・トークンを取得します。
|
注意: クライアント・アサーションが期限切れになるか、無効にされた場合、SDKはエンド・ユーザー資格証明を要求して、まずクライアント・アサーションを更新し、続いてアクセス・トークンを取得します。 |
アサーション権限タイプ
初期化プロパティの値は、OAuthAuthorizationGrantType.ASSERTIONです。
この権限タイプも2-leggedクライアント登録フローを含み、SDKはその後でclient_assertionトークンとuser_assertionトークンを取得します。前述のように、user_assertionトークンは、SERVER_SIDE_SSOがfalseの場合のみ、サーバーによって利用可能にされます。SDKは、認証フローを完了するために、クライアント登録後に取得したuser_assertionを使用してアクセス・トークンを取得します。この権限タイプは、プロパティ値に基づいてリクエストを適切に形成することによって、SERVER_SIDE_SSO構成プロパティをサーバーから引き受けます。SERVER_SIDE_SSOプロパティがtrueに設定されている場合、SDKはアクセス・トークン・リクエストにoracle_use_server_device_store=trueパラメータを追加します。その際に、サーバー側で作成されたユーザー・セッションをサーバーが再利用することが必要です。
ただし、アプリケーションは、初期化プロパティOM_PROP_OAUTH_ASSERTION_JWT(JWTアサーションの場合)およびOM_PROP_OAUTH_ASSERTION_SAML2(saml2アサーションの場合)を使用して、このフローに使用するカスタム・アサーションを提供できます。SDKは、このアサーションを使用してアクセス・トークンを取得し、認証フローを完了します。
認可コード権限タイプ
初期化プロパティの値はOAuthAuthorizationGrantType.AUTHORIZATION_CODEです。この権限タイプには、3-leggedクライアント登録が含まれます。このフローの後、SDKはclient_assertionのみを受け取ります。このフローでは、SDKは、初期化プロパティOM_PROP_BROWSER_MODEに基づいて、外部または埋込みのブラウザを呼び出します。認証フローを完了するには、SDKはブラウザを2度呼び出す必要があります。初回はクライアント登録のため、2回目はアクセス・トークン取得のためです。
|
注意: アプリケーションがOM_PROP_BROWSER_MODEプロパティにBrowserMode.EXTERNALとして値を設定した場合、ユーザーは外部ブラウザに2回資格証明を入力しなくてもよいことがあります。これは、クライアント登録フローそのものにおいて、サーバーがOAM_ID Cookieを外部ブラウザに設定するからで、そのため、ブラウザはアクセス・トークン取得時にログイン資格証明を要求しません。 |
OAM資格証明権限タイプ:
初期化プロパティの値はOAuthAuthorizationGrantType.OAM_CREDENTIALです。この権限には2-leggedクライアント登録フローも含まれ、その後でSDKはSERVER_SIDE_SSOプロパティに設定された値に基づいて、client_assertionとuser_assertionトークンを取得します。認証フローを完了するために、SDKは先にclient_assertionを交換してOAuth保護リソースのアクセス・トークンを取得し、続いて、client_assertionとuser_assertionを使用して(利用できる場合)、OAM_ID(USERTOKEN_MT)とOBSSOCookie(USERTOKEN)トークンを取得します。この権限タイプは、OAM_ID Cookieを使用してwebgate保護リソースにアクセスするクライアントのために、サーバーにより提供されます。
IDMMobile SDKは、任意のOAuth2.0準拠サーバーに対する認可をサポートします。サポートが追加されるのは現在の認証アーキテクチャに適合するためで、その後に、他のタイプの認証のためのIDMMobile SDKが続きます。SDKは、任意のOAuth2.0汎用サーバーがモバイル・クライアントの次に示す権限タイプをサポートする場合、それに対しても機能します。
現在の実装は、次の権限タイプをサポートします。
暗黙の権限タイプ。(クライアントIDとトークン・エンドポイントは必須)
認可コード・権限タイプ。(client_id、認可エンドポイントおよびトークン・エンドポイントが必須)
リソース所有者権限タイプ(client_idとトークン・エンドポイントが必須)
クライアント資格証明(この場合、client_idとclient_secretが必須)
アサーション(この場合、アプリケーションは、アサーションのタイプにより、OM_PROP_OAUTH_ASSERTION_JWTまたはOM_PROP_OAUTH_ASSERTION_SAML2プロパティのいずれかを使用して、アサーション値を提供する必要があります)
OAuth2.0サーバーでユーザーを認証する(あるいは、有効なアクセス・トークンを取得する)ために、SDKはスコープのセットを受け入れます。
ユーザー認証と、ユーザーの認可サーバーとの同意の後、認可サーバーから返されたアクセス・トークンはIDMMobile SDKによって取得され、初期化時に提供されたスコープに結合されます。
このため、なんらかの認証プロセスを開始する前に、SDKは要求されたスコープの有効なアクセス・トークンをすべて確認します。要求されたスコープに有効なアクセス・トークンがあるか、より広いスコープを持つアクセス・トークンがすでに存在する場合、SDKは再度認証を実行しません。その代わりに、同じ認証コンテキスト(アクセス・トークン)を返します。
IDMMobile SDKは、認可サーバーでサポートされていれば、アクセス・トークンのリフレッシュをサポートします。
アクセス・トークンのライフ・サイクルは、SDKによって制御されます。このため、いずれかのアクセス・トークンが無効である場合、アクセス・トークンが最初にサーバーから返されたリフレッシュ・トークン値を持っていれば、SDKはアクセス・トークンをリフレッシュしようと内部的に試みます。
初期化のためのサンプル・コード:
configProp.put(OMMobileSecurityService.OM_PROP_AUTHSERVER_TYPE,
OMMobileSecurityService.AuthServerType.OAuth20);
configProp.put(OMMobileSecurityService.OM_PROP_OAUTH_CLIENT_ID,
"myhost.example.com");
configProp
.put(OMMobileSecurityService.OM_PROP_OAUTH_AUTHORIZATION_GRANT,
OAuthAuthorizationGrantType.AUTHORIZATION_CODE);
configProp
.put(OMMobileSecurityService.OM_PROP_OAUTH_AUTHORIZATION_ENDPOINT,
"https://accounts.example.com/o/oauth2/auth");
configProp.put(
OMMobileSecurityService.OM_PROP_OAUTH_TOKEN_ENDPOINT,
"https://accounts.example.com/o/oauth2/token");
configProp.put(OMMobileSecurityService.OM_PROP_BROWSER_MODE,
BrowserMode.EMBEDDED);
configProp.put(OMMobileSecurityService.OM_PROP_OAUTH_REDIRECT_ENDPOINT,
"http://localhost");
List<String> scope1 = new ArrayList<String>();
scope1.add("https://www.example.com/auth/userinfo.email");
scope1.add("https://www.example.com/auth/userinfo.profile");
configProp.put(OMMobileSecurityService.OM_PROP_OAUTH_SCOPE, scope1);
configProp.put(OMMobileSecurityService.OM_PROP_APPNAME, appId);
初期化後に、設定を実行した後のMSS上でauthenticate()をコールできます。
カスタムのOMAuthenticationRequestを使用して認証するサンプル・コードを次に示します。
OMAuthenticationRequest authRequest1 = new OMAuthenticationRequest();
List<String> scope3 = new ArrayList<String>();
scope3.add("https://www.example.com/auth/calendar");
authRequest1.setOAuthScopes(scope3));
try
{
mAuthView = getMobileSecuritySevice().authenticate(
authRequest1);
}
catch (OMMobileSecurityException e)
{
e.printStackTrace();
}
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
rl.addView(mAuthView, params1);
OMAuthenticationContext#getTokens(List<String> scopes):
APIは、有効で、渡されたスコープのリストに適合するトークンのリストを返します。渡されたスコープは、SDKによって保持されたアクセス・トークンと関連付けられたスコープに、適合しているか、そのサブセットのはずです。NULLが渡された場合、SDKは、指定の時刻に期限切れでないすべてのアクセス・トークンを返します。
OMAuthenticationContext#isValid(List<String> scopes boolean refreshExpiredToken):
指定のスコープのアクセス・トークンが有効または期限切れの場合、このAPIはそれぞれ、ブール値trueまたはfalseを返します。アクセス・トークンが期限切れの場合、SDKは、ファンクション・コールで渡されたrefreshExpiredTokenに設定された値に基づいて、同じものを内部的にリフレッシュしようと試みます。この値がtrueと設定されている場合、SDKはアクセス・トークンをリフレッシュします。リフレッシュは、次の条件が満たされた場合に可能です。
サーバーがモバイル・クライアントのリフレッシュと、指定の認可権限タイプをサポートしている。
SDKに、以前に取得されたアクセス・トークンに関連付けられた、有効なリフレッシュ・トークン値がある場合。これは、アクセス・トークンのリフレッシュが、OAuthAuthorizationGrantType.Authorization_Codeでのみ可能であることを示しています。
SDKは、OAuth2.0フローにおいて、トークンのマップを返すOMAuthenticationContext#getTokens()と、渡されたスコープに適合するトークンのリストを返すOMAuthenticationContext#getTokens(Set<String>)の両方を介して取得したすべてのトークンを公開します。SDKからトークンを取得するには、次の表を参照してください。
| トークン・タイプ | 名前として使用される定数値 |
|---|---|
| access_token | OMSecurityConstants.OAUTH_ACCESS_TOKEN
("oauth_access_token") |
| user_assertion | OMSecurityConstants.OM_OAUTH_USER_ASSERTION_TOKEN
("user_assertion") |
| usertoken | OMSecurityConstants.USER_TOKEN
("USERTOKEN") |
| oam_id | OMSecurityConstants.OAM_ID
("OAM_ID") |
初期化と認証呼出しは、両方のブラウザ・モード(埋込みまたは外部)に対して同じです。ただし、アプリケーションが外部ブラウザを使用して認証を完了する場合、いくつかの追加の手順が含まれます。これは、SDKが認証フローを完了できるように、レスポンスを認可サーバーからアプリケーションに取得する必要があるためです。次の手順に従います。
アプリケーションまたはアクティビティをデータまたはスキームとともに登録する必要があります。これは、初期化時に示されるリダイレクトURLと同じです。
アクティビティがリダイレクトURLに類似したURLスキームに登録された後、NewIntent()内(単一インスタンス・アクティビティ)またはアクティビティのResume()上でprocessSSORequest(intent)を起動する必要があります。その際に、SDKは内部的にサーバーからのレスポンスを解析し、processAuthenticationResponseレスポンスを経由して、結果AuthcontextまたはOMMobileSecurityExceptionを返します。
このモデルは、SSOベース認証と類似しています。サンプル・コードはこの項にあります。
AndroidManifest.xmlにインテント・フィルタを追加してリダイレクトURL用のアプリケーションを登録し、外部ブラウザが使用されたときにアプリケーションが認可サーバーからのレスポンスを捕捉するようにします。コントロールを再取得して認証プロセスを完了するアクティビティに、インテント・フィルタを追加する必要があります。
「example://」のようにリダイレクトURLを登録する場合
<intent-filter>
<data android:scheme="geektech" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name ="android.intent.category.DEFAULT"/>
</intent-filter>
「http://localhost」のようにリダイレクトURLを登録する場合
<intent-filter> <data android:scheme="http" android:host="localhost" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name ="android.intent.category.DEFAULT"/> </intent-filter>
認証を完了するには、外部ブラウザによって使用されるインテントを取得して、URLスキームがリダイレクトURL (初期化時に指定)として登録されるアクティビティを呼び出す必要があります。続いてOMMobileSecurityServiceインスタンス上でprocessSSORequestをコールする必要があります。
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
System.out.println("MainActivity--- onNewIntent()");
if (intent != null && intent.getData() != null)
{
try
{
getMobileSecuritySevice().processSSORequest(intent);
}
catch (OMMobileSecurityException e)
{
e.printStackTrace();
}
}
}
OAuthサーバーで認証が成功すると、アプリケーションは、個別セットのスコープに対して有効なアクセス・トークンを持つため、認可サーバーにより保護されているリソースにアクセスできるようになります。このリクエストを実行するためには、次の新しいAPIを使用する必要があります。
OMHTTPRequest#executeHTTPRequest(HttpRequest httpRequest
OMHTTPRequestCallback callback, List<String> scopes, boolean isAsync)
このメソッドは、OAuth2.0サーバーで保護されているいかなるWebリソースにアクセスするためにも使用できます。このメソッドは、リクエストで渡されたスコープに基づいてアクセス・トークンをインジェクトし、サーバーからのレスポンスを正常に取得します。要求されたスコープのアクセス・トークンが期限切れの場合、このメソッドはトークンを内部的にリフレッシュします。これは非同期的に実行でき、{@link OMHTTPRequestCallback}オブジェクトを提供します。レスポンスは、リクエストが実行された後、このコールバックを介して委譲されます。
*@param request: an instance of {@link HttpRequest} object
* @param callback
* an instance of {@link OMHTTPRequestCallback} , by on which the
* SDK will delegate the response if the request is asynchronous
* @param isAsync
* boolean if the request is to be performed asynchronously or
* not .
* @return an instance of {@link HttpResponse} If the request is
* asynchronous the result will be sent via
* {@link OMHTTPRequestCallback} instance initially registered.
このメソッドは、OMHTTPRequest#executeHTTPRequest(org.apache.http.HttpRequest、OMHTTPRequestCallback、boolean),OMHTTPRequest#executeHTTPRequest(org.apache.http.HttpRequest、OMHTTPRequestCallback、java.util.List、boolean)が実行されると、SDKによってコールされます。SDKは、このコールバックを介して実行の結果を委譲します。
* @param request
* {@link OMHTTPRequest} instance on which the request is
* executed .
* @param response
* {@link HttpResponse} object obtained after execution of the
* request .This will be null when there is failure during
* execution.
* @param exception
* {@link OMMobileSecurityException} This contains the failure
* details if any.
*/
サンプル・コード:
String authReq1 = "https://www.googleapis.com/oauth2/v1/userinfo";
List<String> scope1 = new ArrayList<String>();
scope1.add("https://www.googleapis.com/auth/userinfo.email");
scope1.add("https://www.googleapis.com/auth/userinfo.profile");
OMHTTPRequest omrequest = new OMHTTPRequest(
getMobileSecuritySevice());
HttpRequest httpRequest = new HttpGet(authReq1);
try
{
omrequest1.executeHTTPRequest(httpRequest1,
new OMHTTPRequestCallback()
{
@Override
public void processHTTPResponse(
OMHTTPRequest request,
HttpResponse response,
OMMobileSecurityException exception)
{
//Handle Your code for parsing response here .
//not adding the source for parsing the response as its up to the app dev how they want to make use of this.
}
}, scope1, true);
}
catch (OMMobileSecurityException e)
{
e.printStackTrace();
}
IMPLICITおよびAUTHORIZATION_CODEの権限タイプの場合、SDKは外部または埋込みのブラウザを呼び出します。認可サーバーは、ブラウザにログイン・ページをロードします。このため、エンド・ユーザーは認可サーバーに直接ログイン資格証明を送信します。
RESOURCE_OWNER、CLIENT_CREDENTIALS、ASSERTIONおよびOAM_CREDENTIALの各権限タイプの場合、SDKはネイティブのUIをデフォルトで送出します。ただし、アプリケーションは、資格証明コレクションのためのカスタム・ビューまたはUIを送出するようにSDKに指示できます。詳細は、第10.13項「ログイン・ビューおよびKBAビューのカスタマイズ」を参照してください。
|
注意: OAuth2.0の場合には(リソース所有者権限タイプの場合のように、SDKが資格証明を収集)、ユーザー名のみ保存フラグが使用されます。資格証明保存セクションに、詳細が表示されます。 |
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-8 自動ログインおよび資格証明の保存機能の有効化に使用する構成パラメータ
| パラメータ | 説明 |
|---|---|
|
|
自動ログイン機能を有効化/無効化するブール値 |
|
|
資格証明の保存機能を有効化/無効化するブール値 |
|
|
ユーザー名のみ保存機能を有効化/無効化するブール値 |
ユーザー・プリファレンスの処理
mssオブジェクトの初期化中に次のプロパティを渡して、オプション・ボックスにデフォルト値を事前移入します。trueにできるのは、次のオプションの中の1つのみです。すべてのオプション・ボックスがfalseの場合、ログイン画面のすべてのオプション・ボックスが空になります。
表10-9 オプション・ボックスのデフォルト値設定に使用する構成パラメータ
| パラメータ | 説明 |
|---|---|
|
|
「自動ログイン」オプション・ボックスのデフォルト値を指定するブール値 |
|
|
「資格証明の保存」オプション・ボックスのデフォルト値を指定するブール値 |
|
|
「ユーザー名のみ保存」オプション・ボックスのデフォルト値を指定するブール値 |
オプション・ボックスの状態をキーと値のペアとして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.13項「ログイン・ビューおよびKBAビューのカスタマイズ」を参照してください。)このフラグは、自動ログインおよび資格証明の保存機能専用で、初期化中に指定された機能が有効化または無効化されているか、これらの機能用にどのUIプリファレンスが設定される必要があるかを示します。また、SDKは、ユーザー名を保存および資格証明を保存オプションのために、必要に応じてユーザー名およびパスワードを送信します。
SDKが提供する基本ログイン・ビューを使用するのではなく、カスタム・ログイン画面を作成する場合は、次を行います。
自動ログイン/資格証明の保存フラグの正しい受信および解釈
機能を有効化するかどうかを示すフラグ用のオプション・ボックスの可視性の制御
ユーザーにビューを表示する際に、UIプリファレンスを示すフラグでオプション・ボックスの状態を更新
送信ボタンが押された後に、オプション・ボックスの状態を読み込み、同じ値を送信
次の表に、認証inputParamsマップ内の資格証明プロパティにアクセスするために使用する必要があるキーを示します。
表10-10 資格証明プロパティへのアクセスに使用する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-11 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で他のすべての例外が発生した場合は、この例外がスローされます。 |