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

前
 
次
 

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 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サイトを参照してください。

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


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

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

  1. 使用している開発環境にlibIDMMobileSDK.aをダウンロードし、それをXcodeに追加します。

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

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

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

  3. PublicHeadersおよびPublicResourcesの内容をプロジェクトに追加します。

  4. 次のフレームワークをプロジェクトに追加します。

    • 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サーバー内のサービス・ドメインの名前です。

手順2: 設定

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

[mss setup];

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

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

mobileSecurityService: (OMMobileSecurityService *)mobileSecurityService                         
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


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

アプリケーション・プロファイルを受け取ったら、認証プロセスを開始します。次のサンプルに示すように、独自にカスタマイズしたログインおよびKBA(ナレッジ・ベース認証)のビューを認証リクエストに提供します。カスタマイズされたビューが不要な場合は、startAuthenticationProcessauthnReqには0を渡します。カスタマイズされたログイン・ビューが渡されない場合、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を取得します。このメソッドはブール値をとります。trueでは、認証コンテキストがまだ有効かをサーバーに確認し、falseでは、認証コンテキストをローカルで取得し、まだ有効かどうかを確認しません。OMAuthenticationContextの詳細は、APIドキュメントを参照してください。

- (void)mobileSecurityService: (OMMobileSecurityService *)mobileSecurityService
      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;
}

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


注意:

OMMobileServiceDelegateには、mobileSecurityServiceを含むセレクタが含まれるようになります。mobileSecurityServiceがない古いセレクタも利用可能です。両方が実装された場合、新しいセレクタのみが呼ばれます。

手順4: ログアウト

次のメソッドを呼び出して、ユーザーをログアウトします。

[mss logout:false];

Mobile and Socialのログアウト操作には、サーバー内で管理されているトークンを削除するためのREST Webサービスの起動が含まれています。ブール・パラメータのclearRegistrationHandleがtrueの場合、サービスはキーチェーンに格納されているデバイス登録ハンドルをクリアします。falseの場合は、セッション・トークンのみが削除されます。

Webサービスの呼出しに関連しているため、操作が完了した際にOMMobileServiceDelegateで次のデリゲートが呼ばれます。

- (void)mobileSecurityService:(OMMobileSecurityService *)mobileSecurityService
              didFinishLogout:(NSError *)error;

次に、このデリゲートの実装例を示します。

- (void) mobileSecurityService:(OMMobileSecurityService *)mobileSecurityService
                   didFinishLogout:(NSError *)error
    {
        NSString *msg = nil;
        if (error)
            msg = [NSString stringWithFormat:@"%@-%05ld: %@", [error domain],
                   (long)[error code], [error localizedDescription]];
        else
            msg = [NSString stringWithFormat:@"You are logged out successfully"];
 
        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:@"Logout"
                                  message:msg
                                  delegate:self
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }

注意:

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

9.3 URLベースの構成

URLベースの構成では、SDKを使用して簡単にアプリを構成します。これは、次のような仕組みで動作します。まず、SDK構成プロパティを含むURLを作成します。ユーザーがモバイル・ブラウザでURLを開くと、モバイル・アプリケーションはapplication:openURL:sourceApplication:annotationデリゲート・メソッドでそのURLを受信します。モバイル・アプリケーションは、このURLをIDM Mobile SDKに渡す必要があります。SDKは構成パラメータの抽出および永続化を行い、永続化が完了すると、アプリケーションはこの構成を以降の認証で再利用できるようになります。こうすることによって、わかりやすくアプリケーションを構成できます。

構成URLは、次のパターンに従う必要があります。

<urlscheme>://[host]?<parameter1>::=<value1>&<parameter2>::=<value2>&...&<parameterN>::=<valueN>

次に例を示します。

wp://settings?AuthServerType::=OAMMSAuthentication&OAMMSURL::=http://host123.us.example.com:14100
&OAMMSServiceDomain::=MobileServiceDomain&ApplicationName::=WhitePages

urlschemeでは、アプリケーションがオープンかどうかを明示します。これは、プロジェクトのInfoセクションで「URL Schemes」を設定することによってXcodeのiOSプロジェクトに追加できます。URLスキームがOAMコンソールでの設定と一致する必要があることに注意してください。コンソールでwpと定義されたURLスキームは、wp:// in Xcodeと定義する必要があります。URLスキームは一意である必要があります。

アプリケーション内でURLを処理して構成ステップを完了する適切な場所は、アプリケーション・デリゲートです。次にコード・サンプルを示します。

- (BOOL) application:(UIApplication *)application
             openURL:(NSURL *)url
   sourceApplication:(NSString *)sourceApplication
          annotation:(id)annotation
{
/* This snippet assumes "settings" is passed as host in the config URL. Replace it with the actual host passed in the config URL*/
   if([host url] isEqualToString:@"settings"])
   {
       NSSet *sdkPropsFilter = [NSSet setWithObjects:OM_PROP_AUTHSERVER_TYPE,
                                    OM_PROP_OAMMS_URL,
                                    OM_PROP_OAMMS_SERVICE_DOMAIN,
                                    OM_PROP_APPNAME,nil];
       [OMMobileSecurityService parseConfigurationURL:url
                                persistInUserDefaults:true
                                              withKey:nil
                                           andFilters:sdkPropsFilter];
   }
   return YES;
}

モバイル・アプリケーションでは、URLから受け取った構成にいくつかのフィルタを適用することもできます。前述のコードで、andFiltersパラメータを参照してください。アプリケーションはこのパラメータで許可するSDKパラメータのリストを指定できます。IDM Mobile SDKは、構成URLから抽出したその他のURLパラメータを無視します。構成を受信して永続化した後、OMMobileSecurityServiceオブジェクトを初期化できます。withKeyパラメータは、構成パラメータのセットを識別するために使用できます。これを0に設定すると、SDKはデフォルトの構成として取り扱います。

OMMobileSecurityService *mss = [[OMMobileSecurityService alloc] initWithDelegate:self];

これは、NSUserDefaultsに格納されている構成パラメータでOMMobileSecurityServiceオブジェクトを作成します。keyに関連する構成を選択するには、次のセレクタを使用します。

- (id)initWithPropertiesAvailableInNSUserDefaultsWithKey:(NSString *)key

これによって、モバイル・アプリケーションで複数の構成パラメータ・セットを管理できます。

9.4 初期化プロパティ

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

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

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

OM_PROP_AUTHSERVER_TYPE

(AuthServerType)

  • OM_PROP_AUTHSERVER_OAMMS

    (OAMMSAuthentication)

NSString

OM_PROP_OAMMS_URL

(OAMMSURL)

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

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

  • OM_PROP_OAMMS_HOST

  • OM_PROP_OAMMS_PORT

  • OM_PROP_OAMMS_PORT_IS_SSL

NSStringまたはNSURL

OM_PROP_OAMMS_SERVICE_DOMAIN

(OAMMSServiceDomain)

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

NSString

OM_PROP_APPNAME

(ApplicationName)

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

NSString

OM_PROP_OFFLINE_AUTH_ALLOWED

(OfflineAuthAllowed)

trueまたはfalseのいずれか。

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

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

NSString

OM_PROP_MAX_LOGIN_ATTEMPTS

(MaxLoginAttempts)

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

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

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

NSNumber

OM_PROP_KEYCHAIN_DATA_PROTECTION

(KeychainDataProtection)

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

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

  • OM_KEYCHAIN_DATA_ACCESSIBLE_WHEN_UNLOCKED (KeychainDataAccessibleWhenUnlocked)

  • OM_KEYCHAIN_DATA_ACCESSIBLE_AFTER_FIRST_UNLOCK (KeychainDataAccessibleAfterFirstUnlock)

  • OM_KEYCHAIN_DATA_ACCESSIBLE_ALWAYS (KeychainDataAccessibleAlways)

  • OM_KEYCHAIN_DATA_ACCESSIBLE_WHEN_UNLOCKED_THIS_DEVICE_ONLY (KeychainDataAccessibleWhenUnlockedThisDeviceOnly)

  • OM_KEYCHAIN_DATA_ACCESSIBLE_AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY (KeychainDataAccessibleAfterFirstUnlockThisDeviceOnly)

  • OM_KEYCHAIN_DATA_ACCESSIBLE_ALWAYS_THIS_DEVICE_ONLY (KeychainDataAccessibleAlwaysThisDeviceOnly)

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

NSString

OM_PROP_LOCATION_UPDATE_ENABLED

(LocationUpdateEnabled)

trueまたはfalseのいずれか。

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

NSString

OM_PROP_LOCATION_UPDATE_DISTANCE_FILTER

(LocationUpdateDistanceFilter)

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

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

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

NSNumber

OM_PROP_AUTO_LOGIN_ALLOWED

(AutoLoginAllowed)

trueまたはfalseのいずれか。

これはオプション・プロパティですが、これを指定しないと自動ログイン機能は無効化されます。

NSString

OM_PROP_REMEMBER_CREDENTIALS_ALLOWED

(RememberCredentialsAllowed)

trueまたはfalseのいずれか。

これはオプション・プロパティですが、これを指定しないと資格証明の保存機能は無効化されます。

NSString

OM_PROP_REMEMBER_USERNAME_ALLOWED

(RememberUsernameAllowed)

trueまたはfalseのいずれか。

これはオプション・プロパティですが、これを指定しないとユーザー名の保存機能は無効化されます。

NSString

OM_AUTO_LOGIN_DEFAULT

(AutoLoginDefault)

trueまたはfalseのいずれか。

これはオプション・プロパティですが、これを指定しないと自動ログイン・ユーザー・プリファレンスのデフォルト値はfalseになります。

NSString

OM_REMEMBER_CREDENTIALS_DEFAULT

(RememberCredentialDefault)

trueまたはfalseのいずれか。

これはオプション・プロパティですが、これを指定しないと資格証明の保存ユーザー・プリファレンスのデフォルト値はfalseになります。

NSString

OM_REMEMBER_USERNAME_DEFAULT

(RememberUsernameDefault)

trueまたはfalseのいずれか。

これはオプション・プロパティですが、これを指定しないとユーザー名の保存ユーザー・プリファレンスのデフォルト値はfalseになります。

NSString


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

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

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

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

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

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

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

  • OMConnectivityOnline: 常にサーバーとの間で認証が行われます。デバイスがインターネットに接続できない場合は失敗します。

  • OMConnectivityOffline: キャッシュされた資格証明を使用してローカルで認証が行われます。デバイスがオンラインでサーバーと接続できる場合であっても、オフライン認証が行われます。

  • OMConnectivityAuto: サーバーに接続可能な場合はサーバーとの間で認証が行われます。そうでない場合、デバイスがインターネットに接続されていないときには、オフラインで認証が行われます。

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


注意:

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

9.6 ソーシャル・アイデンティティ認証の起動

ソーシャル・アイデンティティ認証とは、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.7 iOSクライアントSDKを使用したユーザー・プロファイル・サービスの起動

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

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

9.7.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.7.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.7.3 組織の使用

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

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

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

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

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

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


注意:

非同期コールから結果を取得するには、デリゲートを実装する必要があります。詳細は、第9章「非同期APIの使用」を参照してください。

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

9.7.4 非同期APIの使用

次の手順に従って、ユーザー・プロファイル・サービスの非同期APIを使用します。

  1. コール元のクラスは、OMEntityDelegateを実装する必要があります。

  2. デリゲート・メソッド-didReceiveEntities:from:withAsynchronousHandle:を実装します。

次のコード・スニペットで、ユーザー検索操作を示します。

    OMUserManager *userManager = [[mss userRoleProfileService] getUserManager];
    userManager.delegate = self; //class that implements OMEntityDelegate
    [userManager searchUsersAsynchronouslyWithFilter:filter isSimpleSearch:YES attributesToBeFetched:attributes pageSize:pageSize pagePosition:pagePosition];
 
// This method receives the asynchronous operation result
-(void)didReceiveEntities:(id)entities error:(NSError *)error from:(id)omObject
       withAsynchronousHandle:(OMAsyncOpHandle *)asyncHandle

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

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

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

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

  1. Oracle Access Management管理コンソールにログインします。

    「起動パッド」が開きます。

  2. 「Access Manager」で、「認証スキーム」をクリックし、「認証スキームの作成」ボタンをクリックします。

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

  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.9 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 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)
    [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のユーザー定義パラメータには、OAMAuthUserAgentPrefixおよびOAMAuthAuthenticationServiceLocationプロパティが含まれている必要があります。モバイル・アプリケーションのヘッダーにも同じプロパティの値を指定する必要があります。

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


9.9.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. Mobile and Social SDKキャッシュでWebGate用アクセス・トークンが使用できない場合、RESTリクエストをMobile and Socialサーバーに送信してWebGate用アクセス・トークンを取得します。

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

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

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

この項には、モバイル・シングル・サインオン・アプリケーションの作成またはアプリケーションのモバイル・シングル・サインオン・アプリケーションへの変換を開始するための情報が含まれています。モバイル・シングル・サインオン・エージェントとして機能するには、アプリケーションは他のアプリケーション(モバイルSSOクライアント)からの認証リクエストを処理するロジックを含んでいる必要があります。次の手順に従って、SDKを初期化し構成します。

  1. OMMobileServiceDelegateを実装するクラスに次のインスタンス変数を導入します。

    BOOL _setupDone; //Indicates if the application profile was downloaded successfully
    NSString *_ssoAppBundleID; //Store the bundle ID of the SSO client app
    NSURL *_ssoRequestURL; // Stores the request URL sent by the client app
    BOOL _profileError; //Indicates if an error occurred in the profile download
    NSDictionary *_queryParams; // Stores query parameters from the SSO request URL
    
  2. 同じクラスに次のメソッドを追加します。

    /* This method is the entry point to handle SSO requests. If the app Profile is not downloaded, it starts the download or it starts by processing the request.
    The App profile download can be triggered from this function if it is not being checked every time the app becomes active. */
    
    - (void) handleRequestWithURL:(NSURL *)url bundleID:(NSString *)appBundleID
    {
        if (!_setupDone)
        {
            self.ssoRequestURL = url;
            self.ssoAppBundleID = appBundleID;
            return;
        }
        [self ssoRequestWithURL:url fromApp:appBundleID];
    }
    
    /* This function invokes the SDK to process the SSO request. */
    
    - (void)ssoRequestWithURL:(NSURL *)url fromApp:(NSString *)appBundleID
    {
        if(_profileError)
        {
            _profileError = FALSE;
            self.ssoAppBundleID = nil;
            self.ssoRequestURL = nil;
            return;
        }
        NSDictionary *params = [self.mobileServices parseURL:url fromApp:appBundleID];
        self.ssoRequestURL = nil;
        self.ssoAppBundleID = nil;
        self.queryParams = params;
    
        /* If this is an SSO request coming from either a native app or a browser
         * then do the SSO flow. Else do application specific logic. */
    
        if ([self.mobileServices isSSORequest:self.queryParams])
        {
            [self.mobileServices processSSORequest:self.queryParams presenter:self]; //It is assumed that the class also extends UIViewController.
        }
    }
    
  3. didReceiveApplicationProfile:errorメソッドに次のコードを追加します。

        if (error)
        {
            _profileError = TRUE;
        }
        else
        {
            _setupDone = TRUE;
        }
     if(self.ssoRequestURL != nil && self.ssoAppBundleID != nil)
        {
            [self ssoRequestWithURL:self.ssoRequestURL fromApp:self.ssoAppBundleID];
            return;
        }
    
    
  4. didFinishAuthentication:errorメソッドに次のコードを追加します。

    if([self.mobileServices isSSORequest:self.queryParams])
        {
            [self dismissModalViewControllerAnimated:NO];
            [error retain];
            [self performSelector:@selector(completeSSOAuthentication:)
                       withObject:(id)error afterDelay:0]; /* This is required because the SSO Agent app  starts the client app registration after authentication. The registration should occur in the next run loop cycle.*/
            return;
        }
    - (void)completeSSOAuthentication:(id)object
    {
        NSError *error = (NSError *)object;
        [self.mobileServices completeSSORequest:self.queryParams presenter:self error:error];
    }
    
  5. didFinishRegistration:errorメソッドに次のコードを追加します。

        [registrationHandle retain];
        [self dismissModalViewControllerAnimated:true];
        [self.mobileServices sendSSOResponseWithHandles:registrationHandle error:loginError params:self.queryParams];
        [registrationHandle release];
    
  6. UIApplicationDelegateapplication:openURL:sourceApplication:annotationメソッドに次を追加します。

    /* This starts the SSO request handle process. You can check the request URL to make sure it is an SSO request. */
    
        [<object of class implementing handleRequestWithURL:bundleID method> handleRequestWithURL:url bundleID:sourceApplication];
    

次に示すのが、application:openURL:sourceApplication:annotationの実装例です。

- (BOOL) application:(UIApplication *)application
             openURL:(NSURL *)url
   sourceApplication:(NSString *)sourceApplication
          annotation:(id)annotation
{
    self.viewController.isConfigUpdate = false;
    NSString *queryString = [url query];
    NSString *host = [url host];
    if ([queryString hasPrefix:@"oamconfig=true&"])
    {
        //do something
    }
    else if([host isEqualToString:@"settings"])
    {
        //do Something
    }
    else
    {
        [self.viewController handleRequestWithURL:url
                                             bundleID:sourceApplication];
    }
    return YES;
}

サンプルのモバイル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.11 ログインおよびKBAビューのカスタマイズ

ログインおよびナレッジベース認証(KBA)情報をユーザーより取得するために、カスタム・ビューを作成できます。SDKは、必要に応じてこのビューをユーザーに表示します。それ以外の場合は、SDKはデフォルトのネイティブ・ビューを表示します。

9.11.1 ネイティブ・ビューのカスタマイズの実装

カスタム・ネイティブ・ビューは、OMAuthViewをサブクラス化し、この項で後から説明するように、一部のメソッドをオーバーライドする必要があります。

ネイティブ・ビューを作成する場合は、次のようにします。

  • OMAuthViewをサブクラス化します。

  • viewLoadedメソッドをオーバーライドします。資格証明の保存機能が一部でも有効化されている場合、authDataディクショナリにはこの機能のための資格証明およびユーザー・プリファレンスが含まれます。

  • retrieveAuthDataメソッドをオーバーライドします。このメソッドで、authdataディクショナリにユーザーの入力を移入する必要があります。

サンプル・コード

MyLoginView.h file
@interface MyLoginView : OMAuthView
   //Declare properties required for getting user input
@end
MyLoginView.m file
@implementation MyLoginView
-(void) viewLoaded
{
   // Get credentials and user preferences from self.authData
}
-(NSDictionary *) retrieveAuthData
{
   // Populate self.authData with user input
}
@end
 

ネイティブ・ビューをSDKに渡す場合は、次のようにします。

  • OMAuthenticationRequestオブジェクトを作成します。

  • authViewおよびkbaViewプロパティにカスタム・ネイティブ・ビュー・オブジェクトを設定します。

  • mss.startAuthenticationProcess:presentViewControllerメソッドにOMAuthenticationRequestオブジェクトを渡します。

サンプル・コード

// Initialize mss object 
OMMobileSecurityService *mss = [[OMMobileSecurityService alloc] initWithProperties:sdkProps delegate:self];
[mss setup];
//Wait for setup to complete
//Create authentication request
OMAuthenticationRequest *authnReq = [OMAuthenticationRequest alloc] init];
MyLoginView *loginView = [[MyLoginView alloc] init];
MyKBAView *kbaView = [[MyKBAView alloc] init];
authReq.authView = loginView;
authReq.kbaView = kbaView;
[mss startAuthenticationProcess:authnReq presenterViewController:myPresenter];

9.11.2 進行状況ビューのカスタマイズの実装

進行状況ビューは、ログイン画面がカスタマイズできた後に表示されます。パターンは、ログイン・ビューのカスタマイズと同様です。アプリケーションは、OMAuthProgressViewクラスの拡張およびOMAuthenticationRequestでアプリケーションの実装のインスタンスの登録を行う必要があります。次にコード・スニペットを示します。

OMAuthenticationRequest *authReq = [[OMAuthenticationRequest alloc] init];
MyProgressView *myProgressView = [[MyProgressView alloc] initWithFrame:self.view.frame];
authReq.authProgressView = myProgressView;
[myProgressView release];

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

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の一部として提供され、次の操作に役立ちます。

  • 鍵ペアの生成およびキー・チェーンへの保存

  • キー・チェーン内の鍵に対する署名および検証操作

  • キー・チェーン内の鍵に対するラップおよびアンラップ操作

  • キー・チェーンからの公開鍵の抽出

  • キー・チェーン内の鍵ペアの削除

9.13 自動ログインおよび資格証明保存機能の使用

Mobile and Social iOSクライアントSDKは、ユーザー資格証明を安全に格納し、それをユーザー操作の有無にかかわらずログイン・サーバーに対して再生できるAPIを提供します。この機能をセキュリティが極端に重要ではないアプリケーションにデプロイすると、ユーザーが簡単にログインできるようになります。この機能には、バージョン11.1.2.2.0以上のMobile and SocialクライアントSDKが必要です。

ユーザーがログイン画面上にある最大3つまでのオプション・ボックスから1つを選択すると、この機能を使用できます。(アプリケーションで、1つ、2つまたは3つ全部のオプションを有効化することを選択できます。)2つ以上のオプションが選択された場合、優先度の高い機能が優先されます。オプションの優先度は、次のとおりです。


1. 自動ログイン
2. 資格証明の保存
3. ユーザー名のみ保存

そのため、たとえば自動ログインおよび資格証明の保存が選択されている場合、自動ログインが優先されます。

次は、3つのオプションの説明です。

  • 自動ログイン - Mobile and Social iOSクライアントSDKがユーザーの資格証明を安全にキャッシュし、ログイン画面に自動的に提供します。このオプションが指定されると、ログインの際にユーザーの操作が必要なくなります。認証を行う間、ユーザーにフィードバックを提供する進行状況画面が表示されます。

  • 資格証明の保存 - Mobile and Social iOSクライアントSDKがユーザーの資格証明を安全にキャッシュし、自動的にログイン画面のユーザー名およびパスワード・フィールドを設定します。ユーザーは、ログイン・ボタンをクリックして認証プロセスを進める必要があります。必要に応じて、ユーザーは異なる資格証明を入力したり、オプション・ボックスを変更することができます。

  • ユーザー名のみ保存 - Mobile and Social iOSクライアントSDKがユーザー名を安全にキャッシュし、自動的にログイン画面のユーザー名を設定します。ユーザーは、パスワードを入力してログイン・ボタンをクリックし、認証プロセスを進める必要があります。必要に応じて、ユーザーは異なるユーザー名を入力したり、オプション・ボックスを変更することができます。

機能の有効化

これは、デプロイにあたってサーバー構成を必要としないクライアント側のみの機能です。前述の機能を有効化するには、次のSDK構成パラメータをコードに追加する必要があります。

表9-3 自動ログインおよび資格証明の保存機能の有効化に使用する構成パラメータ

パラメータ 説明

OM_PROP_AUTO_LOGIN_ALLOWED

自動ログイン機能を有効化/無効化するブール値

OM_PROP_REMEMBER_CREDENTIALS_ALLOWED

資格証明の保存機能を有効化/無効化するブール値

OM_PROP_REMEMBER_USERNAME_ALLOWED

ユーザー名のみ保存機能を有効化/無効化するブール値


ユーザー・プリファレンスの処理

mssオブジェクトの初期化中に次のプロパティを渡して、オプション・ボックスにデフォルト値を事前移入します。trueにできるのは、次のオプションの中の1つのみです。すべてのオプション・ボックスがfalseの場合、ログイン画面のすべてのオプション・ボックスが空になります。

表9-4 オプション・ボックスのデフォルト値設定に使用する構成パラメータ

パラメータ 説明

OM_AUTO_LOGIN_DEFAULT

「自動ログイン」オプション・ボックスのデフォルト値を指定するブール値

OM_REMEMBER_CREDENTIAL_DEFAULT

「資格証明の保存」オプション・ボックスのデフォルト値を指定するブール値

OM_REMEMBER_USERNAME_DEFAULT

「ユーザー名のみ保存」オプション・ボックスのデフォルト値を指定するブール値


オプション・ボックスの状態をキーと値のペアとしてNSUserDefaultsに永続化します。各ログイン接続用のユーザー・プリファレンスが一意に識別されるように、サーバーURLおよびアプリケーションの識別子の組合せをキーとして使用します。

モバイル・デバイスからの資格証明およびプリファレンスの消去

ユーザーの資格証明が最終ログイン以降に変更された場合や、ネットワークやサービスの問題でモバイル・デバイスが認証サービスにアクセスできない場合、認証が失敗することがあります。保存されている資格証明で認証が失敗した場合、SDKはキーチェーンから保存されているパスワード(存在する場合)を削除します。その後ログイン・ページは、ユーザー名のみ保存機能に戻るか、OMMobileServiceデリゲートを使用して制御がモバイル・アプリケーションに戻されるかのどちらかになります。この決定は、OM_PROP_MAX_LOGIN_ATTEMPTSという名前のSDKレベルのパラメータに基づきます。このパラメータは、制御がモバイル・アプリケーションに戻される前に何回の正しくない認証の試行が許可されるかを保存する数値です。

次のシナリオでは、保存されたユーザーのパスワードがSDKによってモバイル・デバイスから消去されます。

  • ユーザー認証に失敗した(たとえば、サーバーのパスワードが有効でなくなった、ユーザーがブロックされている、または別の理由でユーザー認証が失敗した)場合

  • Mobile and Social iOSクライアントSDKのlogoutメソッドが呼ばれた場合

  • セッション・タイムアウトが検知された場合

次のシナリオでは、保存されたユーザー名、パスワードおよびオプション・ボックスの状態がSDKによってモバイル・デバイスから消去されます。

  • clearRegistrationHandlesパラメータをTRUEに設定してMobile and Social iOSクライアントSDKのlogoutメソッドが呼ばれた場合

カスタム・ログイン画面の作成

SDKが提供する基本ログイン・ビューを使用するのではなくカスタム・ログイン画面を作成する場合は、デフォルト・ビューでなくカスタム・ビューが認証に使用されるように、OMAuthViewをサブクラス化してそのオブジェクトを現在の認証リクエスト・オブジェクトに追加する必要があります。Mobile and Social iOSクライアントSDKは、認証データ・ディクショナリを使用してユーザー資格証明およびオプション・ボックスの状態を設定します。この認証データ・ディクショナリは、すべてのOMAuthViewのサブクラスでプロパティとして使用できます。必ずこの値を読み込み、正しくUI要素に表示するようにしてください。同様に、ユーザー資格証明を送信する場合には、必ずUI要素から値を読み込み、正しく認証データ・ディクショナリに設定するようにしてください。

次の表に、認証データ・ディクショナリ内の資格証明プロパティにアクセスするために使用する必要があるキーを示します。

表9-5 資格証明プロパティへのアクセスに使用するデータ・ディクショナリのキー

キー 説明

OM_PROP_AUTO_LOGIN_ALLOWED

自動ログイン機能を有効化/無効化するブール値

OM_PROP_REMEMBER_CREDENTIALS_ALLOWED

資格証明の保存機能を有効化/無効化するブール値

OM_PROP_REMEMBER_USERNAME_ALLOWED

ユーザー名のみ保存機能を有効化/無効化するブール値

OM_AUTO_LOGIN_PREF

自動ログイン機能に関するユーザーのプリファレンスを指定するブール値

OM_REMEMBER_CREDENTIALS_PREF

資格証明の保存機能に関するユーザーのプリファレンスを指定するブール値

OM_REMEMBER_USERNAME_PREF

ユーザー名のみ保存機能に関するユーザーのプリファレンスを指定するブール値

OM_USERNAME

ユーザーのユーザー名を指定する文字列値

OM_PASSWORD

ユーザーのパスワードを指定する文字列値


9.14 資格証明ストア・サービス(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;

KeyChainItem内のプロパティの削除

KeyChainItem内の指定したプロパティ・ストアを削除します。プロパティとともに保存されているすべての詳細が削除されます。

- (NSError *)deletePropertyWithKey:(NSString *)key

プロパティの取得

KeyChainItemからプロパティを返します。

- (id)getPropertyForKey:(NSString *)key