| Oracle® Fusion Middleware Oracle Access Management開発者ガイド 11g リリース2 (11.1.2.1) B69537-05 | 
 | 
|  前 |  次 | 
この章では、iOSクライアントSDKを使用してモバイル・サービス・アプリケーションを開発する方法について説明します。このSDKは、iOS上でセキュアなモバイル・アプリケーションを開発するためのセキュリティ・レイヤーとして機能します。すべてのネイティブなiOSアプリケーションは、Mobile and Socialを使用するために、このSDKを実装する必要があります。このiOS SDKは、iOS 4.3以上を実行するデバイスをサポートします。この章の内容は次のとおりです。
このSDK (oamms_sdk_for_ios.zip)は、Oracle Access Management配布パッケージに含まれており、Oracle Technical Network (OTN) Webサイトからダウンロードすることもできます。
この開発者ガイドの他に、SDKでは、HTML形式のAPIドキュメントが提供されています。APIクラス、インタフェース、コンストラクタ、メソッドおよびフィールドの説明については、APIドキュメントを参照してください。
IDM Mobile iOSクライアントSDKは、静的ライブラリとして提供されます。次のモジュールが含まれます。
認証モジュール: ユーザー、デバイスおよびアプリケーションのかわりに認証リクエストを処理します。
セキュア・ストレージ・モジュール: iOS Keychain機能を使用して重要なデータを保存および取得するためのAPIを提供します。
ユーザー・ロール・モジュール: ユーザーおよびアプリケーションが構成されたアイデンティティ・ストアからユーザーおよびグループ詳細を取得できるようにするユーザー・プロファイル・サービスを提供します。
暗号化モジュール: 一般的な暗号化タスクのための直感的なObjective C APIを提供します。
REST Webサービス・ハンドラ・モジュール: Access Managerによって保護されたREST Webサービスへのアクセスを提供します。
| 注意: iOSモバイル・デバイス用のアプリケーションを開発するには、Mac OS X Snow Leopard以降を実行しているIntelベースのMacにXcode IDE (統合開発環境)がインストールされている必要があります。 詳細は、iOS Dev CenterのWebサイトを参照してください。 | 
XCode環境を設定するには、次の手順に従ってください。
次の手順に従って、XCodeにlibIDMMobileSDK.aを追加します。
使用している開発環境にlibIDMMobileSDK.aをダウンロードし、それをプロジェクト・フォルダに追加します。
XCodeを起動して、プロジェクトを開きます。
プロジェクトをクリックして選択し、ターゲットをクリックして、「Build Phases」タブをクリックします。
「Link Binary With Libraries」を開き、「+」ボタンをクリックします。
「Other」を選択し、「libIDMMobileSDK.a」を選択します。
oamms_sdk_for_ios.zip内にあるPublicHeadersフォルダおよびPublicResourcesフォルダをダウンロードします。
PublicHeadersディレクトリには、IDM Mobile SDKのヘッダー・ファイルが含まれています。
PublicResourcesディレクトリには、IDM Mobile SDKのリソースが含まれています。
「Add Files to Your-Project-Name」を選択し、PublicHeadersおよびPublicResourcesのコンテンツをプロジェクトに追加します。
プロジェクトの「Build Phases」を開き、「Link Binary with Libraries」を開きます。「+」ボタンをクリックし、次のフレームワークを順に追加します。
SystemConfiguration.framework
Security.framework
CoreLocation.framework
| 重要: プロジェクトをリンクする前に、「Build Settings」の「Other linker flags」に 
 背景情報とプロジェクトにフラグを追加する方法については、次のページを参照してください。 | 
IDM Mobile iOSクライアントSDKを使用してコーディングを開始できるようになりました。
| 重要: このiOS SDKは、iOS 4.3以上を実行するデバイスをサポートします。 | 
この項では、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オブジェクトを返します。
| 注意: [ 詳細は、次の場所にある『iOS Developer Library Threading Programming Guide』を参照してください。 | 
手順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は適宜ファイルまたは | 
SDKの初期化時に次のプロパティを設定できます。
表9-1 iOSクライアントSDKの初期化プロパティ
| プロパティ名 | プロパティの値 | 型 | 
|---|---|---|
| 
 | 
 | NSString | 
| 
 | NSStringオブジェクトとして渡される有効なホスト名。または、 | NSString | 
| 
 | NSStringオブジェクトとして渡される有効なポート番号。または、 | NSString | 
| 
 | 
 | NSString | 
| 
 | NSURLオブジェクト、またはNSURLの作成に使用できる有効なNSStringオブジェクト。 このプロパティを使用しない場合は、次のプロパティを指定します。 
 | NSStringまたはNSURL | 
| 
 | 必須プロパティ。NSStringオブジェクトとして渡される任意の有効なサービス・ドメイン名。 | NSString | 
| 
 | 必須プロパティ。NSStringオブジェクトとして渡される有効なアプリケーション名。 | NSString | 
| 
 | 
 これはオプション・プロパティですが、これを指定しないとオフライン認証は許可されません。 Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。 | NSString | 
| 
 | NSNumberオブジェクトとして渡されるログイン・セッション・タイムアウト値。SDKは、この数値の整数部分のみを受け取ります。 これはオプション・プロパティです。このプロパティが指定されない場合、または値が0の場合は、サーバーがセッションを無効にするまでログイン・セッションは有効です。 Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。 | NSNumber | 
| 
 | NSNumberオブジェクトとして渡されるアイドル接続タイムアウト値。SDKは、この数値の整数部分のみを受け取ります。 これはオプション・プロパティです。このプロパティが指定されない場合、または値が0の場合は、サーバーがセッションを無効にするまでログイン・セッションは有効です。 Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。 | NSNumber | 
| 
 | ユーザーによるログイン試行の最大許容回数。 これはオプション・プロパティです。このプロパティが指定されない場合、許容されるログイン試行回数は1回のみです。 Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。 | NSNumber | 
| 
 | このプロパティを使用して、KeyChain Itemの保護レベルを指定します。 次の値のいずれかを指定する必要があります。 
 これはオプション・プロパティです。これが指定されない場合、このプロパティのデフォルトは最高レベルである | NSString | 
| 
 | 
 これはオプション・プロパティであり、デフォルト値は | NSString | 
| 
 | デバイスの移動距離が指定された距離(メートル)を超えた場合に、ロケーションの更新が送信されます(有効になっている場合)。 このプロパティを使用して、更新の生成頻度を制御します。 Mobile and Socialサーバーでも、「モバイル・カスタム属性」セクションでキー | NSNumber | 
次のOM_PROP_CRYPTO_SCHEME暗号化プロパティはオプションのプロパティです。アプリケーションでオフライン認証が必要であるにもかかわらずこのプロパティが指定されていない場合、デフォルトの暗号スキームはOM_PROP_CRYPTO_SSHA512になります。
このプロパティはMobile and Socialサーバー・コンソールを使用しても設定できます。「カスタム設定」→「モバイル・カスタム属性」を選択し、表の最後の2列にある属性名および属性値を使用します。サーバーの設定はアプリケーションの設定よりも優先されます。
Mobile and Social iOSクライアントSDKに含まれる暗号化モジュールの詳細は、第9.10項「暗号化モジュールの使用」を参照してください。
表9-2 iOSクライアントSDKの暗号スキームのプロパティ属性
| プロパティ | 値 | 属性名 | 属性値 | 
|---|---|---|---|
| 
 | 
 | 
 | 
 | 
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | ||
| 
 | 
 | 
Mobile and Socialの認証フローではオフライン認証がサポートされています。
startAuthenticationProcess:presenterViewController:メソッドに渡されるOMAuthenticationRequestオブジェクトには、connectivityModeというプロパティがあります。このプロパティは、OMAuthenticationRequest.hファイルに定義されている列挙OMConnectivityModeの値を受け取ります。
それらの値は次のとおりです。
OMConnectivityOnline: 常にサーバーとの間で認証が行われます。デバイスがインターネットに接続できない場合は失敗します。
OMConnectivityOffline: キャッシュされた資格証明を使用してローカルで認証が行われます。デバイスがオンラインでサーバーと接続できる場合であっても、オフライン認証が行われます。
OMConnectivityAuto: サーバーに接続可能な場合はサーバーとの間で認証が行われます。そうでない場合、デバイスがインターネットに接続されていないときには、オフラインで認証が行われます。
オフライン認証はOMAuthenticationRequestの一部であるため、この設定は現在のリクエストでのみ有効です。オフライン認証で失敗回数がOM_PROP_MAX_LOGIN_ATTEMPTSで設定されている値を超えた場合(「初期化プロパティ」の項で説明)、ローカルに格納されている資格証明は消去され、オンライン認証が行われるようになります。
| 注意: オフライン認証は、サーバーでオフライン認証が許可に設定されている場合のみ動作します。詳細は、『Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または削除に関する項を参照してください。 | 
リライイング・パーティ認証とは、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としてアクセス可能です。
この項のコード・サンプルを使用する前に、このSDKに固有ではない情報について、「ユーザー・プロファイル・サービスを使用したアプリケーションの構築」を参照してください。
この項のコード・サンプルは、次の3つのカテゴリに分類されます。
ユーザーの詳細を検索および取得するには、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;
グループの詳細を検索および取得するには、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;
次のAPIを使用して、マネージャやその部下に関する情報をリクエストします。
ユーザーのマネージャの取得
次のAPIはOMUserで使用可能です。
- (OMUser *)getManager: (NSError **)error; - (OMAsyncOpHandle *)getManagerAsynchronously;
指定されたユーザーの部下の取得
次のAPIはOMUserで使用可能です。
- (NSArray *)getReporteesWithAttributes: (NSArray *)attributes returningError: (NSError **)error; - (OMAsyncOpHandle *)getReporteesAsynchronouslyWithAttributes:(NSArray *)attributes;
この項では、iOSクライアントSDKを使用してモバイル・シングル・サインオン・エージェント・アプリケーションと連携する方法について説明します。Mobile and Socialでのモバイル・シングル・サインオンに関する概念情報は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイル・シングル・サインオン(SSO)機能の概要に関する項およびMobile and Socialの理解に関する項を参照してください。
Webアプリケーションは、モバイルSSOエージェントによって提供されるシングル・サインオン認証機能を使用することもできます。この機能にはAccess Managerが必要です。
Oracle Access Management管理コンソールにログオンして、「ポリシー構成」タブをクリックします。
「共有コンポーネント」で、「認証スキーム」をクリックし、「作成」ボタンをクリックします。
認証スキームの作成タブが開きます。
次のようにフォームに入力して、新しい認証スキームを作成します。
名前: MobileSSOScheme
認証レベル: 2
チャレンジ・メソッド: FORM
チャレンジ・リダイレクトURL: /oam/server/
認証モジュール: LDAP
チャレンジURL: /mobilesso?serviceDomain=MobileServiceDomain
ここで、MobileServiceDomainは、シングル・サインオン用に構成されるドメインの名前です。
コンテキスト・タイプ: customWar
コンテキストの値: /oic_rest
Oracle Access Management管理コンソールで、次の手順を実行します。
アプリケーション・ドメインで新しい認証スキームを作成します。
認証スキーム: MobileSSOScheme
(MobileSSOSchemeは、手順1で作成されたスキームです。)
/mobileappなどのHTTPリソースを作成し、作成された認証スキーム(MobileSSOScheme)を使用してそのリソースを保護します。これは、モバイルWebブラウザ(iOS用モバイル版Safari)からアクセスでき、Webgateによって保護されるURIです。
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];
    }
}
| 注意: 
 Access Management 11g R2 Webgateのユーザー定義パラメータには、 
 | 
次の手順では、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サーバーによって返されるトークンを挿入します。
この項には、モバイル・シングル・サインオン・アプリケーションの作成を開始するための情報が含まれています。
モバイル・シングル・サインオン・エージェントとして機能するには、アプリケーションは他のアプリケーション(モバイル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によって提供されている暗号化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];
このハッシング機能で提供される機能は次のとおりです。
SHA1、SHA224、SHA256、SHA384、SHA512の各アルゴリズムを使用したハッシングを実行するための便利なAPIが提供されます。
同様の機能を持ち、ソルトなしで動作するAPIのセットも提供されます。
ソルトを個別に保存する必要がある場合にもランダム・ソルト生成メソッドを利用できます。
生成されるハッシュ値をオプションでBase64でエンコードできます。
オプションで出力結果にアルゴリズム名を接頭辞として付加できます。
便利なAPIに加えて、すべての値のカスタマイズが可能なより洗練されたメソッドも提供されます。
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];
 
サポートされるアルゴリズムは、AES128 (キー・サイズは16、24、32)、DES (キー・サイズは8)、3DES (キー・サイズは24)です。
セキュアな対称鍵生成APIが利用可能です。
生成される暗号化テキストをオプションでBase64でエンコードできます。
オプションで出力結果にアルゴリズム名を接頭辞として付加できます。
アルゴリズムの指定、ベクターの初期化、パディングなどが可能な、より洗練されたメソッドが利用可能です。
encryptData:withSymmetricKey:initializationVector:algorithm:padding:mode:base64EncodeOutput:prefixOutputWithAlgorithmName:outError: decryptData:withSymmetricKey:initializationVector:algorithm:padding:mode:isInputPrefixedWithAlgorithmName:isInputBase64Encoded:outError:
非対称鍵による暗号化
非対称鍵による暗号化のためのAPIはOMCryptoServiceの一部として提供され、次の操作に役立ちます。
鍵ペアの生成およびキー・チェーンへの保存
キー・チェーン内の鍵に対する署名および検証操作
キー・チェーン内の鍵に対するラップおよびアンラップ操作
キー・チェーンからの公開鍵の抽出
キー・チェーン内の鍵ペアの削除
資格証明ストア・サービスでは、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;
ユーザー名およびパスワードの更新
この例では、ユーザー名とパスワードが指定されると、ユーザーおよびキーの値を更新します。真の更新操作はないため、updateCredentialはaddCredentialをコールします。
- (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;