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

前
 
次
 

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

この章では、iOSクライアントSDKを使用してモバイル・サービス・アプリケーションを開発する方法について説明します。このSDKは、iOS上でセキュアなモバイル・アプリケーションを開発するためのセキュリティ・レイヤーとして機能します。すべてのネイティブなiOSアプリケーションは、Mobile and Socialを使用するために、このSDKを実装する必要があります。このiOS SDKは、iOS 4.3以上を実行するデバイスをサポートします。この章の内容は次のとおりです。

9.1 iOSクライアントSDKのスタート・ガイド

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

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

IDM Mobile iOSクライアントSDKは、静的ライブラリとして提供されます。次のモジュールが含まれます。


注意:

iOSモバイル・デバイス用のアプリケーションを開発するには、Mac OS X Snow Leopard以降を実行しているIntelベースのMacにXcode IDE (統合開発環境)がインストールされている必要があります。

詳細は、iOS Dev CenterのWebサイトを参照してください。

https://developer.apple.com/devcenter/ios/index.action


9.1.1 XCodeでのiOSクライアントSDKの使用のスタート・ガイド

XCode環境を設定するには、次の手順に従ってください。

  1. 次の手順に従って、XCodeにlibIDMMobileSDK.aを追加します。

    1. 使用している開発環境にlibIDMMobileSDK.aをダウンロードし、それをプロジェクト・フォルダに追加します。

    2. XCodeを起動して、プロジェクトを開きます。

    3. プロジェクトをクリックして選択し、ターゲットをクリックして、「Build Phases」タブをクリックします。

    4. 「Link Binary With Libraries」を開き、「+」ボタンをクリックします。

    5. 「Other」を選択し、「libIDMMobileSDK.a」を選択します。

  2. oamms_sdk_for_ios.zip内にあるPublicHeadersフォルダおよびPublicResourcesフォルダをダウンロードします。

    PublicHeadersディレクトリには、IDM Mobile SDKのヘッダー・ファイルが含まれています。

    PublicResourcesディレクトリには、IDM Mobile SDKのリソースが含まれています。

  3. 「Add Files to Your-Project-Name」を選択し、PublicHeadersおよびPublicResourcesのコンテンツをプロジェクトに追加します。

  4. プロジェクトの「Build Phases」を開き、「Link Binary with Libraries」を開きます。「+」ボタンをクリックし、次のフレームワークを順に追加します。

    • SystemConfiguration.framework

    • Security.framework

    • CoreLocation.framework


    重要:

    プロジェクトをリンクする前に、「Build Settings」の「Other linker flags」に-ObjCおよび-all_loadの2つのフラグを1行で追加します。これらのフラグを使用しない場合、アプリケーションは「selector not recognized」というランタイム例外が発生してクラッシュします。

    libIDMMobileSDK.aはカテゴリを使用して既存のクラスを拡張するため、リンカーはコア・クラス実装のオブジェクト・コードをカテゴリ実装と関連付ける方法を把握していません。これにより、生成されるアプリケーションで作成されたオブジェクトはカテゴリで定義されたセレクタに応答できません。

    背景情報とプロジェクトにフラグを追加する方法については、次のページを参照してください。

    http://developer.apple.com/library/mac/#qa/qa1490/


    IDM Mobile iOSクライアントSDKを使用してコーディングを開始できるようになりました。


    重要:

    このiOS SDKは、iOS 4.3以上を実行するデバイスをサポートします。


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

この項では、Mobile and Socialサーバーを使用して認証する方法について説明するサンプル・コードを提供します。

サービス・プロバイダの構成方法の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイル・サービスの構成に関する項を参照してください。

手順1: 必要なオブジェクトの初期化

NSMutableDictionaryオブジェクトを作成し、パラメータを指定します。

NSMutableDictionary *sdkProps = [[NSMutableDictionary alloc] init]; 

[sdkProps setObject:OM_PROP_AUTHSERVER_OAMMS forKey:OM_PROP_AUTHSERVER_TYPE];
[sdkProps setObject:@"http://oammsurl" forKey:OM_PROP_OAMMS_URL];
[sdkProps setObject:@"myApp" forKey:OM_PROP_APPNAME];
[sdkProps setObject:@"MobileServiceDomain" forKey:OM_PROP_OAMMS_SERVICE_DOMAIN];

次に、OMMobileSecurityServiceオブジェクトを作成し、プロパティとしてDictionaryオブジェクトを渡します。

OMMobileSecurityService *mss = [[OMMobileSecurityService alloc]                
                                           initWithProperties:sdkProps 
                                                     delegate:self]; 
 

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

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

OM_PROP_OAMMS_SERVICE_DOMAINプロパティ・キーは、このアプリケーションのアプリケーション・プロファイルを保持しているMobile and Socialサーバー内のサービス・ドメインの名前です。

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

[mss setup];

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

設定コールは非同期コールであり、完了するとiOSクライアントSDKは次のデリゲート・メソッドをコールします。

didReceiveApplicationProfile: (NSDictionary *)applicationProfile error:  
 (NSError *)error

注意:

アプリケーション開発者によって実装されるデリゲートの名前は、OMMobileServiceDelegateです。


このメソッドは、アプリケーション・プロファイルの詳細が格納されたNSDictionaryオブジェクトを返します。


注意:

[mss setup]をコールするスレッドは、実行ループが実行されている必要があります。メイン・スレッド以外のスレッドから[mss setup]を呼び出す場合は、実行ループがデフォルト・モードで実行されていることを確認してください。

詳細は、次の場所にある『iOS Developer Library Threading Programming Guide』を参照してください。

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html


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

アプリケーション・プロファイルを受け取ったら、認証プロセスを開始します。次のサンプルに示すように、独自にカスタマイズしたログインおよびKBA(ナレッジ・ベース認証)のビューを認証リクエストに提供します。カスタマイズされたビューが必要ない場合は、startAuthenticationProcessのauthnReqにnilを渡します。カスタマイズされたログイン・ビューが渡されない場合、SDKはデフォルトのログインおよびKBAのビューをスローします。

OMAuthenticationRequest *authnReq = [OMAuthenticationRequest alloc] init];
authnReq.kbaView = myKBAView;
authnReq.authView = myLoginView;
[[mss startAuthenticationProcess:authnReq presenterViewController:myViewController];
 

これにより認証プロセスが開始され、iOSクライアントSDKがMobile and Socialサーバーと連携して認証プロセスを実行します。ユーザーがすでに認証されていて、認証トークンがまだ有効な場合、Mobile and Socialサーバーはキャッシュされたトークンを単に返すのみです。それ以外の場合、サーバーはユーザーにログイン資格証明を提供するように要求します。Mobile and Socialサーバーがナレッジベース認証を使用するように構成されている場合、iOSクライアントSDKはその詳細を自動的に処理します。

次に、iOSクライアントSDKはデリゲートのdidFinishAuthentication:error:メソッドをコールします。このメソッドは、トークンの詳細を持つOMAuthenticationContextを返します。

OMMobileSecurityServiceオブジェクトの[mobileSecurityService authenticationContext]メソッドを使用して、いつでもOMAuthenticatonContextを取得します。OMAuthenticationContextの詳細は、APIドキュメントを参照してください。

- (void)didFinishAuthentication:(OMAuthenticationContext *)context error:(NSError *)error
{
  if (context == nil || error != nil)
  {
     NSString *msg = [[NSString alloc] initWithFormat:@"%@-%d: %@",
     [error domain],
     [error code], [error localizedDescription]];
     UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Err" message:msg delegate:self
                               cancelButtonTitle:@"OK" otherButtonTitles:nil];
     [alertView show];
     [msg release];
     [alertView release];
     return;
  }
 // If successful, proceed with your remaining actions. 
 // This example gets the authenticated user's attributes 
 // and presents it using User Profile Viewer.

 OMUserRoleProfileService* ups = [mss userRoleProfileService];
 OMUserManager *um = [ups getuserManager];
 OMUser *user = [um searchUser:context.userName attributes:nil shouldPreFetch:NO error:&error];
 self.user = user;
 [detailPaneController showProfileButton];
}

この時点で、アプリケーションはMobile and Socialサーバーから取得されたトークンを使用して、追加のWebサービス・コールを行うことができます。


注意:

iOSクライアントSDKは大量のメモリーを消費しません。SDKは登録ハンドル、認証ハンドル、アプリケーション・プロファイルおよびセキュリティ・プロファイルを格納します。iOSがメモリー量が少ないことを警告する通知を送信すると、SDKはそのキャッシュを永続化し、そのメモリーを解放します。必要に応じて、SDKは適宜ファイルまたはKeyChainItem (後で説明)から永続データを読み取ることができます。


9.3 初期化プロパティ

SDKの初期化時に次のプロパティを設定できます。

表9-1 iOSクライアントSDKの初期化プロパティ

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

OM_PROP_AUTHSERVER_TYPE

  • OM_PROP_AUTHSERVER_OAMMS

NSString

OM_PROP_OAMMS_HOST

NSStringオブジェクトとして渡される有効なホスト名。または、OM_PROP_OAMMS_URLオブジェクトを使用してホスト、ポートおよびポート・タイプの詳細を渡すこともできます。

NSString

OM_PROP_OAMMS_PORT

NSStringオブジェクトとして渡される有効なポート番号。または、OM_PROP_OAMMS_URLオブジェクトを使用してホスト、ポートおよびポート・タイプの詳細を渡すこともできます。

NSString

OM_PROP_OAMMS_PORT_IS_SSL

trueまたはfalseのいずれか。または、OM_PROP_OAMMS_URLオブジェクトを使用してホスト、ポートおよびポート・タイプの詳細を渡すこともできます。

NSString

OM_PROP_OAMMS_URL

NSURLオブジェクト、またはNSURLの作成に使用できる有効なNSStringオブジェクト。

このプロパティを使用しない場合は、次のプロパティを指定します。

  • OM_PROP_OAMMS_HOST

  • OM_PROP_OAMMS_PORT

  • OM_PROP_OAMMS_PORT_IS_SSL

NSStringまたはNSURL

OM_PROP_OAMMS_SERVICE_DOMAIN

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

NSString

OM_PROP_APPNAME

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

NSString

OM_PROP_OFFLINE_AUTH_ALLOWED

trueまたはfalseのいずれか。

これはオプション・プロパティですが、これを指定しないとオフライン認証は許可されません。

Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。

NSString

OM_PROP_SESSION_TIMEOUT_VALUE

NSNumberオブジェクトとして渡されるログイン・セッション・タイムアウト値。SDKは、この数値の整数部分のみを受け取ります。

これはオプション・プロパティです。このプロパティが指定されない場合、または値が0の場合は、サーバーがセッションを無効にするまでログイン・セッションは有効です。

Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。

NSNumber

OM_PROP_IDLE_TIMEOUT_VALUE

NSNumberオブジェクトとして渡されるアイドル接続タイムアウト値。SDKは、この数値の整数部分のみを受け取ります。

これはオプション・プロパティです。このプロパティが指定されない場合、または値が0の場合は、サーバーがセッションを無効にするまでログイン・セッションは有効です。

Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。

NSNumber

OM_PROP_MAX_LOGIN_ATTEMPTS

ユーザーによるログイン試行の最大許容回数。

これはオプション・プロパティです。このプロパティが指定されない場合、許容されるログイン試行回数は1回のみです。

Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。

NSNumber

OM_PROP_KEYCHAIN_DATA_PROTECTION

このプロパティを使用して、KeyChain Itemの保護レベルを指定します。

次の値のいずれかを指定する必要があります。

  • OM_KEYCHAIN_DATA_ACCESSIBLE_WHEN_UNLOCKED

  • OM_KEYCHAIN_DATA_ACCESSIBLE_AFTER_FIRST_UNLOCK

  • OM_KEYCHAIN_DATA_ACCESSIBLE_ALWAYS

  • OM_KEYCHAIN_DATA_ACCESSIBLE_WHEN_UNLOCKED_THIS_DEVICE_ONLY

  • OM_KEYCHAIN_DATA_ACCESSIBLE_AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY

  • OM_KEYCHAIN_DATA_ACCESSIBLE_ALWAYS_THIS_DEVICE_ONLY

これはオプション・プロパティです。これが指定されない場合、このプロパティのデフォルトは最高レベルであるOM_KEYCHAIN_DATA_ACCESSIBLE_WHEN_UNLOCKED_THIS_DEVICE_ONLYになります。

NSString

OM_PROP_LOCATION_UPDATE_ENABLED

trueまたはfalseのいずれか。

これはオプション・プロパティであり、デフォルト値はfalseです。場所の更新はデバイスのバッテリを消費するため、必要な場合のみ有効にしてください。

NSString

OM_PROP_LOCATION_UPDATE_DISTANCE_FILTER

デバイスの移動距離が指定された距離(メートル)を超えた場合に、ロケーションの更新が送信されます(有効になっている場合)。

このプロパティを使用して、更新の生成頻度を制御します。

Mobile and Socialサーバーでも、「モバイル・カスタム属性」セクションでキーLocationUpdateEnabledおよび数値を指定することによって、このプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。ロケーションの更新が有効になっており、距離フィルタが設定されていないかまたは無効な場合は、デフォルトの距離フィルタとして1000mが採用されます。

NSNumber


次のOM_PROP_CRYPTO_SCHEME暗号化プロパティはオプションのプロパティです。アプリケーションでオフライン認証が必要であるにもかかわらずこのプロパティが指定されていない場合、デフォルトの暗号スキームはOM_PROP_CRYPTO_SSHA512になります。

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

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

表9-2 iOSクライアントSDKの暗号スキームのプロパティ属性

プロパティ 属性名 属性値

OM_PROP_CRYPTO_SCHEME

OM_PROP_CRYPTO_PLAINTEXT

CryptoScheme

PlainText

OM_PROP_CRYPTO_AES

AES

OM_PROP_CRYPTO_SHA1

SHA-1

OM_PROP_CRYPTO_SHA224

SHA-224

OM_PROP_CRYPTO_SHA256

SHA-256

OM_PROP_CRYPTO_SHA384

SHA-384

OM_PROP_CRYPTO_SHA512

SHA-512

OM_PROP_CRYPTO_SSHA1

SaltedSHA-1

OM_PROP_CRYPTO_SSHA224

SaltedSHA-224

OM_PROP_CRYPTO_SSHA256

SaltedSHA-256

OM_PROP_CRYPTO_SSHA384

SaltedSHA-384

OM_PROP_CRYPTO_SSHA512

SaltedSHA-512


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

Mobile and Socialの認証フローではオフライン認証がサポートされています。

startAuthenticationProcess:presenterViewController:メソッドに渡されるOMAuthenticationRequestオブジェクトには、connectivityModeというプロパティがあります。このプロパティは、OMAuthenticationRequest.hファイルに定義されている列挙OMConnectivityModeの値を受け取ります。

それらの値は次のとおりです。

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


注意:

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


9.5 リライイング・パーティ認証の起動

リライイング・パーティ認証とは、Google、Twitter、Facebookなどのサード・パーティのOpenIdおよびOAuthプロバイダに対する認証を可能にするためのOracle Mobile and Socialサーバーの機能です。詳細は、Oracle Access Management管理者ガイドで、「インターネット・アイデンティティ・サービスの構成」の章を参照してください。

リライイング・パーティ認証では、Mobile and Socialサーバーに対する認証で使用するのと同じAPIを使用してSDKを呼び出すことができます。インターネット・アイデンティティ・サービスに対する認証を行うようにサービス・ドメインを構成する場合、SDKは自動的にリライイング・パーティ認証のフローに従います。認証が正常に行われると、Mobile and Socialサーバーで構成されているURLスキームを使用して制御がアプリケーションに戻されます。

アプリケーションのUIApplicationDelegateオブジェクトのapplication:openURL:sourceapplication:annotationメソッドにこのコード・スニペットを追加し、フローを完了させます。このコードは、サーバーから受け取った情報をSDKに渡して認証が完了したことを伝えるのに役立ちます。

// Called when application in invoked via some URL
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
 
    ...
    ...
 
    NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] 
                                     initWithCapacity:1];
    [userInfo setObject:url forKey:OM_RESPONSE_URL];
 
    //Post the notification to IDM Mobile SDK
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:OM_PROCESS_URL_RESPONSE
                   object:self
                 userInfo:userInfo];
 
    ...
    ...
 
    return TRUE;
}

認証が正常に行われた後は、ディクショナリOMAuthenticationContext.accessTokensのキーOM_ACCESS_TOKENを使用して、プロバイダ(存在する場合)からのトークンにアクセスできます。emailidが構成されている場合は、OMauthenticationContext.userNameとしてアクセス可能です。

9.6 iOSクライアントSDKを使用したユーザー・プロファイル・サービスの起動

この項のコード・サンプルを使用する前に、このSDKに固有ではない情報について、「ユーザー・プロファイル・サービスを使用したアプリケーションの構築」を参照してください。

この項のコード・サンプルは、次の3つのカテゴリに分類されます。

9.6.1 ユーザーの使用

ユーザーの詳細を検索および取得するには、OMMobileSecurityServiceオブジェクトからOMUserManagerのハンドルを取得します。OMMobileSecurityServiceオブジェクトの詳細は、「iOSクライアントSDKを使用した認証サービスの起動」を参照してください。

OMUserManagerでは、ユーザーの詳細を検索および取得するための同期および非同期APIを提供します。

すべての非同期操作はOMAsyncOpHandleオブジェクトを返します。このオブジェクトを使用して、完了前に操作を取り消すことができます。完了後に操作を取り消しても、操作は取り消されません。

- (id)getAttribute: (NSString *)attrName returningError: (NSError **)error;
- (NSArray *)searchUsersWithFilter: (NSDictionary *)filter
                                          isSimpleSearch: (BOOL)simpleSearch
                                   attributesToBeFetched: (NSArray *)attributesToFetch
                                                pageSize: (NSInteger)pageSize
                                            pagePosition: (NSInteger)pagePosition
                                                   error: (NSError **)error;
- (OMAsyncOpHandle *)getAttributeAsynchronously: (NSString *)attrName;
- (OMAsyncOpHandle *)searchUsersAsynchronouslyWithFilter:(NSDictionary *)filter
                                          isSimpleSearch:(BOOL)simpleSearch
                                   attributesToBeFetched:(NSArray *)attributesToFetch
                                                pageSize:(NSInteger)pageSize
                                            pagePosition:(NSInteger)pagePosition;

- (OMUser *)searchUser: (NSString *)user attributes: (NSArray *)attributes
                                     shouldPreFetch: (BOOL)preFetch
                                              error: (NSError **)error;
- (OMAsyncOpHandle *)searchUserAsynchronously: (NSString *)user 
                                   attributes: (NSArray *)attributes
                               shouldPreFetch: (BOOL)preFetch
                                        error: (NSError **)error;
 
- (OMAsyncOpHandle *)searchAsynchronouslyUser: (NSString*)user
                                   attributes: (NSArray *)attributes
                               shouldPreFetch: (BOOL)preFetch;
- (NSError *)deleteUser: (NSString *)userName;
- (OMAsyncOpHandle *)deleteAsynchronouslyUser:(NSString*)userName;
- (NSError *)createUserWithAttributes: (NSDictionary *)attributes;
- (OMAsyncOpHandle *)createUserAsynchronouslyWithAttributes:(NSDictionary *)attributes;
- (OMAsyncOpHandle *)modifyAsynchronouslyUser: (NSString*)user
                                   attributes: (NSDictionary *)attributes;

9.6.2 グループの使用

グループの詳細を検索および取得するには、OMMobileSecurityServiceオブジェクトからOMRoleManagerのハンドルを取得します。OMMobileSecurityServiceオブジェクトの詳細は、「iOSクライアントSDKを使用した認証サービスの起動」を参照してください。

OMRoleManagerでは、グループの検索、メンバーのグループへの追加およびグループからのメンバーの削除を行うための同期および非同期APIを提供します。

すべての非同期操作はOMAsyncOpHandleオブジェクトを返します。このオブジェクトを使用して、完了前にいつでも操作を取り消すことができます。完了後に操作を取り消しても、操作は取り消されません。

- (OMRole *)getRoleByName: (NSString *)roleName
                    error: (NSError **)error;
- (OMAsyncOpHandle *)getAsynchronouslyRoleByName: (NSString *)roleName;
- (NSError *)deleteRoleByName: (NSString *)roleName;
- (OMAsyncOpHandle *)deleteAsynchronouslyRoleByName:(NSString*)name;
- (OMUser *)getUserInfo: (NSString *)userName fromRole: (NSString *)roleName
               error: (NSError **)error;
- (OMAsyncOpHandle *)getAsynchronouslyUserInfo:(NSString *)user
                                      fromRole:(NSString *)roleName;
- (NSError *)deleteMember: (NSString *)memberName
                 fromRole: (NSString *)roleName;
- (OMAsyncOpHandle *)deleteAsynchronouslyMember:(NSString *)memberName
                                       fromRole:(NSString*)roleName;

- (OMAsyncOpHandle *)createAsynchronouslyRoleWithAttributes:(NSArray*)attributes
                                                 withValues:(NSArray*)values;
- (OMAsyncOpHandle *)modifyAsynchronouslyRole:(NSString*)role
                                   attributes:(NSArray*)attributes
                                       values:(NSArray*)values;
- (OMAsyncOpHandle *)addUserAsynchronouslyToRole:(NSString *)roleName
                                  withAttributes:(NSArray*)attributes
                                      withValues:(NSArray*)values;

9.6.3 組織の使用

次のAPIを使用して、マネージャやその部下に関する情報をリクエストします。

ユーザーのマネージャの取得

次のAPIはOMUserで使用可能です。

- (OMUser *)getManager: (NSError **)error;
- (OMAsyncOpHandle *)getManagerAsynchronously;

指定されたユーザーの部下の取得

次のAPIはOMUserで使用可能です。

- (NSArray *)getReporteesWithAttributes: (NSArray *)attributes returningError: (NSError **)error;
- (OMAsyncOpHandle *)getReporteesAsynchronouslyWithAttributes:(NSArray *)attributes;

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

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

9.7.1 Webブラウザからのモバイル・シングル・サインオン・エージェント・アプリケーションの起動

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

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

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

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

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

    • 名前: MobileSSOScheme

    • 認証レベル: 2

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

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

    • 認証モジュール: LDAP

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

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

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

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

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

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

      認証スキーム: MobileSSOScheme

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

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

9.8 REST Webサービスの起動

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

Mobile and Social SDKでは、Access Managerによって保護されているREST WebサービスにアクセスするためにOMRESTRequestクラスを提供しています。まず最初に、SDKを使用し、Mobile and SocialサービスによりOAMサーバーに対して認証します。

次に、OMMobileSecurityServiceオブジェクトおよびデリゲート・オブジェクトを渡すことによって、OMRESTRequestオブジェクトを初期化します。次のいずれかのメソッドを使用できます。

executeRESTRequest: convertDataToJSON: isJsonRepresentation returningResponse: error:  

- または -

executeRESTRequestAsynchronously: convertDataToJSON:

前者は同期コールで、後者は非同期コールです。非同期コールは次のOMRESTRequestDelegateメソッドにより結果を戻します。

didFinishExecutingRESTRequest: data: urlResponse: error: asyncHandle:

次の例は、OMRESTRequestオブジェクトの非同期APIを示しています。

- (void)someMethod
{
    OMMobileSecurityService *mss = ...;
    ...
    //Initialize OMRESTRequest object. In this example, instead of using
    //"initWithMobileSecurityService: delegate:" method, we use init method
    //and set the properties
    OMRESTRequest *restReq = [[OMRESTRequest alloc] init];
    restReq.delegate = self;
    restReq.mobileService = mss;

    NSURL *url = [[NSURL alloc] initWithString:@"http://myresturl.example.com/resturl"];
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithCapacity:1];

    //It is important to set the User-Agent to the value configured in OAM 11g R2
    //Webgate user defined parameters.
    [dictionary setObject:@"OAMMS-Agent" forKey:@"User-Agent"];
    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:url];
    [urlRequest setAllHTTPHeaderFields:dictionary];
    [url release];
    [dictionary release];
    [urlRequest setHTTPMethod:@"GET"];
    OMAsyncOpHandle *opHandle = [restReq executeRESTRequestAsynchronously:urlRequest
                                                        convertDataToJSON:FALSE];
    [urlRequest release];
    OMLog(@"%@", opHandle);
}

-(void) didFinishExecutingRESTRequest:(OMRESTRequest *)RESTRequest
                                 data:(id)data
                          urlResponse:(NSURLResponse *)urlResponse
                                error:(NSError *)error
                          asyncHandle:(OMAsyncOpHandle *)handle
{
    if (error)
    {
        //In case of error, show the error message
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"REST Request Error"
                                                            message:[error localizedDescription]
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }
    else
    {
        //Show the result in the UIAlertView
        NSString *disp = nil;
        if ([data isKindOfClass:[NSDictionary class]])
        {
            NSDictionary *dict = (NSDictionary *)data;
            disp = [[dict OMJSONRepresentation] retain];
        }
        else
        {
            disp = [[NSString alloc] initWithData:data
                                         encoding:NSASCIIStringEncoding];
        }
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Received"
                                                            message:disp
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [disp release];
        [alertView show];
        [alertView release];
    }
}

注意:

OMRESTRequestは、REST WebサービスがOracle Access Management 11g R2 Webgateを使用して保護されている場合のみ、Access Managerから必須トークンを取得できます。

Access Management 11g R2 Webgateのユーザー定義パラメータには、User-Agentプロパティが含まれている必要があります。同じUser-Agentプロパティの値は、そのヘッダーでモバイル・アプリケーションによって指定されている必要があります。

OMRESTRequestは、OMMobileSecurityServiceを使用しないで初期化することもできます。この場合、OMRESTRequest APIはURL値を戻すのみです。


9.8.1 OMRESTRequest APIフローの理解

次の手順では、OMRESTRequest APIの内部フローについて説明します。

1. OMRESTRequest APIがモバイル・アプリケーションによって提供されるURLを呼び出します。

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

   HTTP/1.1 401 Authorization Required
   WWW-Authenticate: OAM-Auth realm="<WebGateName>:<AuthenticationLevel>
   <RelativeRESTURL>", request-ctx="<RequestContext>"
   

3. Mobile and Social SDKは、アプリケーションの有効期間中に取得したアクセス・トークンのキャッシュを保持します。このWebgateのアクセス・トークンがすでにキャッシュに存在する場合、SDKはアプリケーション・リクエストにアクセス・トークンを挿入します。

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

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

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

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

この項には、モバイル・シングル・サインオン・アプリケーションの作成を開始するための情報が含まれています。

モバイル・シングル・サインオン・エージェントとして機能するには、アプリケーションは他のアプリケーション(モバイルSSOクライアント)からの認証リクエストを処理するロジックを含んでいる必要があります。IDM Mobile SDKを初期化し、認証リクエストを作成した後は、ApplicationDelegate.mクラスに次のコードを追加します。

- (BOOL) application:(UIApplication *)application
     openURL:(NSURL *)url
     sourceApplication:(NSString *)sourceApplication
                annotation:(id)annotation
 
{
      NSString *queryString = [url query];
 
      if ([queryString hasPrefix:@"oamconfig=true&"])
      {
         //If it is server settings, store it in NSUserDefaults
 
         [OMMobileSecurityService storeOAMServerSettingsInNSUserDefaults:url];  
         //IDMMobileSDK.h needs to be imported
      }
      else
      {   
       /* This section is application specific. In this else section we need to call handleRequestWithURL:url bundleID:sourceApplication that is the entry point to process SSO requests. */
 
          if(splitViewController != nil)
 
          [self.documentViewController handleRequestWithURL:url 
           bundleID:sourceApplication];
 
          else
          {
 
           UINavigationController *nav = [[tabBarController customizableViewControllers] objectAtIndex:0];
 
           DocumentViewController * doc = [[nav childViewControllers] objectAtIndex:0];
 
           [doc handleRequestWithURL:url bundleID:sourceApplication];
           [nav release];
          }
      } 
      return YES;
}

handleRequestWithURL:url bundleID:sourceApplicationはエントリとなる関数であることに注意してください。これは、セットアップされたOMMobileSecurityServiceオブジェクトにアクセスできるクラス内に実装する必要があります。

次に、handleRequestWithURL:url bundleID:sourceApplicationを実装するクラス内に次のインスタンス変数を導入します。

NSDictionary *_queryParams; 

handleRequestWithURL:url bundleID:sourceApplication関数の実装を次に示します。

- (void)handleRequestWithURL:(NSURL *)url bundleID:(NSString *)appBundleID
 
{
        NSDictionary *params = [_mobileServices parseURL:url fromApp:appBundleID]; //_mobileServices is the object of OMMobileSecurityService
 
        /* If this is a SSO request coming from a native app or browser
        * then do the SSO flow. Else do application specific logic */
 
     if ([_mobileServices isSSORequest:params])
     {
        self.queryParams = params;
 
       [_mobileServices processSSORequest:self.queryParams presenter:self];
       // presenter should be of type UIViewController
 
     }
     else
        {
        // Write Application specific logic
        NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] initWithCapacity:1];
 
        [userInfo setObject:url forKey:OM_RESPONSE_URL];
 
        //Post the notification to IDM Mobile SDK
        [[NSNotificationCenter defaultCenter] postNotificationName:OM_PROCESS_URL_RESPONSE
 
                         object:self
                                 userInfo:userInfo];
 
        [userInfo release];
 
        }
}

最後に、didFinishAuthenticationメソッドに次のコードを追加します。

if(self.queryParams != Nil)
 
      _mobileServices sendSSOResponseWithHandles:nil error:error params:self.queryParams];

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

Mobile and Socialでは、必要なロジックを示すサンプルのSSOエージェント・アプリケーションを提供します。このロジックを任意のビジネス・アプリケーションに適用して、アプリケーションがモバイルSSOエージェントとして機能できるようにします。開始するには、OICSSOAPP.zipを開きます。

iOSモバイルSSOアプリケーションのアプリケーション・デリゲートがopenURLメソッドを実装して、他のアプリケーションからのSSOリクエストを処理する必要があることに注意してください。また、URLスキームはiOSアプリケーションとMobile and Socialサーバーで定義される必要があります。最後に、アプリケーション・プロファイルをMobile and Socialサーバー上のサービス・ドメインに追加する際、モバイル・シングル・サインオン(SSO)構成属性(シングル・サインオンへの参加およびエージェント優先度)を構成します。


注意:

Mobile and Socialサーバー上でのiOS固有の設定の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の次のトピックを参照してください。

  • 固有のiOSアプリケーション設定の詳細は、アプリケーション・プロファイルの編集または作成に関する項を参照してください。

  • モバイルSSOエージェントまたはモバイルSSOクライアントのいずれかとしてSSO対応アプリケーションを構成する方法の詳細は、サービス・ドメインの編集または作成に関する項を参照してください。


9.10 暗号化モジュールの使用

iOSによって提供されている暗号化APIはCのAPIであり、使いにくいものです。Mobile and Social iOSクライアントSDKでは、一般的な暗号化タスクを実行するためのシンプルで使いやすい直感的なObjective CのAPIが提供されます。このSDKでは、ここに記載されているAPIを使用して、オフライン認証用の資格証明を保護および格納します。APIのメソッドの詳細は、SDKのダウンロードに含まれるAPIのドキュメントを参照してください。

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

ハッシング

ハッシング機能を使用して、自動生成されたランダム・ソルト付きの文字列(通常はパスワード)のハッシュ値を取得します。また、次のAPIは出力結果にソルトを追加し、接頭辞としてアルゴリズム名を付加します。これは、ネットワークを介した保存や転送に適しています。生成されたソルトは、必要に応じてoutSaltパラメータを使用して抽出できます。

NSString *secret = "mypassword";
NSString *outSalt;
NSError *error;

NSString *hashValue = [OMCryptoService SHA256HashAndBase64EncodeData:[secret
                                                           dataUsingEncoding:
                                                           NSUTF8StringEncoding]
                                                 withSaltOfBitLength:24
                                                           outSalt:&outSalt
                                                           outError:&error];

このハッシング機能で提供される機能は次のとおりです。

hashData:withSalt:algorithm:appendSaltToOutput:base64Encode:prefixOutputWithAlgorithmName:outError:

対称鍵による暗号化/復号化

このAPIは、対称鍵を使用したデータの暗号化および復号化の実行に役立ちます。次の例は、自動生成されたランダムな対称鍵を使用し、AESアルゴリズムとPKCS7パディングを使用して任意のデータを暗号化するのに役立ちます。

  NSData *plainText = ...
  NSString *outKey;
  NSError *error;
 
  NSString *cipherText = [OMCryptoService encryptData:plainText
                             withSymmetricKeyOfLength:24
                                      outSymmetricKey:&outKey
                                             outError:&error];
 

前述の暗号テキストを復号化するには、次のAPIを使用できます。

  NSString *plainText = [OMCryptoService decryptData:cipherText
                                    withSymmetricKey:outKey
                                            outError:&error];
 
encryptData:withSymmetricKey:initializationVector:algorithm:padding:mode:base64EncodeOutput:prefixOutputWithAlgorithmName:outError:
 decryptData:withSymmetricKey:initializationVector:algorithm:padding:mode:isInputPrefixedWithAlgorithmName:isInputBase64Encoded:outError:

非対称鍵による暗号化

非対称鍵による暗号化のためのAPIはOMCryptoServiceの一部として提供され、次の操作に役立ちます。

9.11 資格証明ストア・サービス(KeyChain)の使用

資格証明ストア・サービスでは、iOS Keychain Servicesを使用して重要なデータを保存および取得するためのAPIを提供します。

OMMobileSecurityServiceオブジェクトから開始して、OMCredentialStoreハンドルを取得します。OMCredentialStoreを使用して、KeyChainItem.から重要なデータへの書込みおよび重要なデータの取得を行います。

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

ユーザー名およびパスワードの追加

この例では、KeyChainItemで指定されたキーにユーザー名とパスワードを追加します。

- (void)addCredential:(NSString *)userName pwd:(NSString *)password url:(NSString *)key;

ユーザー名、パスワードおよびテナント名の追加

これは前のaddCredential機能のバリエーションです。

- (void)addCredential:(NSString *)userName 
                  pwd:(NSString *)password 
           tenantName:(NSString *)tenantName 
                  url:(NSString *)key;

資格証明の削除

この例では、KeyChainItemから資格証明を削除します。真の削除操作はないため、かわりに、ユーザー名およびパスワードがnullに設定されます。

- (void)deleteCredential:(NSString*)key;

ユーザー名およびパスワードの更新

この例では、ユーザー名とパスワードが指定されると、ユーザーおよびキーの値を更新します。真の更新操作はないため、updateCredentialaddCredentialをコールします。

- (void)updateCredential:(NSString*)userName pwd:(NSString*)password  url:(NSString*)key; 

ユーザー名、パスワードおよびテナント名の更新

これは前のupdateCredential機能のバリエーションです。

- (void)updateCredential:(NSString *)userName 
                     pwd:(NSString *)password 
              tenantName:(NSString *)tenantName 
                     url:(NSString *)key;

ユーザー名およびパスワードの取得

この例では、指定のキーのユーザー名、パスワードおよびテナント名を取得します。

- (OMCredential *)getCredential:(NSString*)key;

KeyChainItemでのプロパティの格納

この例では、KeyChainItemでプロパティを格納します。

- (void)storeProperty: (NSString *)property withKey: (NSString *)key;

KeyChainItemでの複数のプロパティの格納

これは前のstoreProperty機能のバリエーションです。

- (void)storeProperty: (NSString *)property 
              withKey: (NSString *)key
            withLabel: (NSString *)label
      withDescription: (NSString *)description;