プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Access Management開発者ガイド
11gリリース2 (11.1.2.3.0) for All Platforms
E67354-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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

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

このiOS SDKは、iOS 6.0以上を実行するデバイスをサポートします。この章の内容は次のとおりです。

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 6.0以上を実行するデバイスをサポートします。

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

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

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

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

9.2.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


9.2.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がない古いセレクタも利用可能です。両方が実装された場合、新しいセレクタのみが呼ばれます。

9.2.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

URLスキームは、開かれるアプリケーションを識別します。これは、プロジェクトの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 M&S認証の初期化プロパティについて

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.14項「暗号化モジュールの使用」を参照してください。

表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で設定されている値を超えた場合(「M&S認証の初期化プロパティについて」の項で説明)、ローカルに格納されている資格証明は消去され、オンライン認証が行われるようになります。


注意:

オフライン認証は、サーバーでオフライン認証が許可に設定されている場合のみ動作します。詳細は、『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を使用して、マネージャやその部下に関する情報をリクエストします。これらはOMUserで使用可能です。

  • 次のAPIを使用して、ユーザーのマネージャを取得します。

    - (OMUser *)getManager: (NSError **)error;
    - (OMAsyncOpHandle *)getManagerAsynchronously;
    
  • 次のAPIを使用して、指定したユーザーの部下を取得します。


    注意:

    非同期コールから結果を取得するには、デリゲートを実装する必要があります。詳細は、第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 クライアント証明書を使用した認証

IDM Mobile SDKは、双方向SSL相互認証をサポートします。サーバーのアイデンティティを検証するクライアントに加えて、認証サーバーが双方向SSLを実行するように構成されている場合は、サーバーはクライアントのアイデンティティを検証するためにクライアント証明書を必要とします。言い換えると、これは、サーバーがクライアントを識別して匿名アクセスを回避する追加の認証スキームです。

クライアント証明書に基づく認証(相互認証)は、ユーザー名とパスワードの方法に基づく認証より安全です。これは、パスワードには高いエントロピーがなく、総当たり攻撃に対してぜい弱だからです。また、複雑なパスワードは記憶が困難です。こうした状況では、複雑で、非対称の暗号文を使用して攻撃に対するぜい弱性を低下させる、クライアント証明書が好都合です。

IDM Mobile SDKに用意されているAPIは、SDKを介するネットワーク接続の作成時に、PKCS12エンコードされたクライアント証明書をインポートするためい使用でき、それらの証明書を使用して認証を提供できます。

次の各項では、詳細を説明します。

9.9.1 クライアント証明書のインポート

クライアント証明書は、モバイル・アプリケーションに実行時に提供されるべきですが、アプリケーション開発時にパッケージ化することもできます。


注意:

実行時にファイルを提供する方法の詳細は、次のリンクの「Registering the File Types Your App Supports」ページ(英語)を参照してください。

https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/DocumentInteraction_TopicsForIOS/Articles/RegisteringtheFileTypesYourAppSupports.html


ファイルは、アプリケーションのみが利用できる「Documents」ディレクトリに配置されます。キーチェーンに証明書をインポートして、ファイルの削除も行うIDM Mobile SDK APIをコールする必要があります。

クライアント証明書をインポートするための次の2つのAPIは、OMCertServiceクラスで利用できます。

9.9.1.1 importClientCertificateFromFile:presenter:delegate:

これは証明書をインポートする非同期APIで、結果はOMCertServiceDelegateプロトコル・メソッドを介して提供されます。

  • fileURLは、証明書ファイルのローカルURLです。

  • presenterは、IDM Mobile SDKがパスワードを収集するためにUIを提示するUIビュー・コントローラです。

  • delegateOMCertServiceDelegateオブジェクトで、その-(void)didImportClientCertificate:(NSArray *)certInfo error:(NSError *)errorメソッドがコールされます。

certInfoオブジェクトはNSDictionaryオブジェクトのNSArrayで、インポート済クライアント・アイデンティティの各々に関する情報を含みます。

9.9.1.2 importClientCertificateFromFile:password:error:

これは、証明書をインポートしてNSDictionaryオブジェクトのNSArrayを返す同期メソッドです。メソッドの実行が成功すると、これらのオブジェクトには、インポート済クライアント・アイデンティティに関する情報が含まれます。エラーが発生すると、渡されたエラー参照が移入されます。

  • fileURLは、証明書ファイルのローカルURLです。

  • passwordは、ファイルを復号化するために使用されるパスワードです。

  • errorは、証明書インポート時にエラーが発生する場合に移入される、NSErrorオブジェクトへの参照です。

  • Return Valueは、インポートが成功した場合に返される証明書情報の配列で、そうでない場合の値はNILです。返される情報はありません。

9.9.2 スタンドアロン認証の実行

IDM Mobile SDKは、独立の認証サービスとしてクライアント証明書ベースの認証を提供します。次の手順は、スタンドアロン認証プロセスを説明したものです。

  1. 次は、スタンドアロン・クライアント証明書認証のサンプル・コードです。

    NSMutableDictionary *props = [[NSMutableDictionary alloc] init];
    [props setObject:OM_PROP_AUTHSERVER_CLIENT_CERT forKey:OM_PROP_AUTHSERVER_TYPE];
    [props setObject:@"https://host:port/resource" forKey:OM_PROP_LOGIN_URL];
    [props setObject:@"ClientCertApp" forKey:OM_PROP_APPNAME];
    self.mss = [[OMMobileSecurityService alloc] initWithProperties:props delegate:self];
    [self.mss setup];
    
  2. このコードは、クライアント証明書認証を使用してSDKを初期化します。ダウンロードが必要なアプリケーション・プロファイルはありません。ただし、OMMobileServiceDelegateプロトコルのmobileSecurityService: didReceiveApplicationProfile:error:メソッドがコールされます。認証プロセスは、次のサンプル・コードを使用して開始できます。

    [self.mss startAuthenticationProcess:nil presenterViewController:self];
    
  3. クライアント証明書のチャレンジがIDM Mobile SDKによって受信され、クライアント証明書がインストールされると、ユーザーに対して、適切なクライアント・アイデンティティを選択できる画面が表示されます。サーバーがクライアント証明書を受け入れると、認証は成功し、OMMobileServiceDelegateプロトコルのmobileSecurityService:didFinishAuthentication:error:メソッドがコールされます。

9.9.3 混合モード認証の実行

証明書ベースの認証は、他の認証スキームとも統合できます。認証スキームで、クライアント証明書チャレンジが発生すると、IDM Mobile SDKはインストールされている証明書のリストをユーザーに提示します。ユーザーは証明書を選択する必要があり、その後、認証は認証スキームに従って進行します。他の認証スキームのクライアント証明書認証オプションが確実に存在するようにするには、SDKの初期化時に、次の追加プロパティを追加する必要があります。

[props setObject:@"TRUE" forKey:OM_PROP_PRESENT_CLIENT_IDENTITY_ON_DEMAND];

このプロパティのデフォルト値はfalseです。

9.10 OAuth2.0 for iOS SDKの理解と使用

IDM Mobile SDKは、保護されたリソースにアクセスするために、OAM (M&S) OAuthサーバーを使用した認可を提供します。SDKが9.10.1.1.2項「アクセス・トークン取得」に記されたモバイル・クライアントの権限タイプをサポートしている場合、SDKは任意のOAuth2.0汎用サーバーで機能します。

正しいプロパティを使用してIDM Mobile SDKを初期化した後および認証後には、アプリケーションはアクセス・トークンを取得できる必要があります。

OAuth2.0で追加された新しいプロパティのリストを次に示します。

構成プロパティ 有効な値 必須
OM_PROP_AUTHSERVER_TYPE

(AuthServerType)

String型の定数

OM_PROP_OAUTH_OAUTH20_SERVER

はい
OM_PROP_OAUTH_AUTHORIZATION_GRANT

(OAuthAuthZGrantType)

String型の定数

OM_OAUTH_AUTHORIZATION_CODE

OM_OAUTH_IMPLICIT

OM_OAUTH_RESOURCE_OWNER

OM_OAUTH_CLIENT_CREDENTIALS

OM_OAUTH_ASSERTION

OM_OAUTH_OAM_CREDENTIAL

はい
OM_PROP_OAUTH_AUTHORIZATION_ENDPOINT

(OAuthAuthZEndpoint)

NSString はい
OM_PROP_OAUTH_TOKEN_ENDPOINT

(OAuthTokenEndpoint)

NSString OM_PROP_OAUTH_AUTHORIZATION_GRANTがAUTHORIZATION_CODEである場合は必須
OM_PROP_OAUTH_REDIRECT_ENDPOINT

(OAuthRedirectEndpoint)

NSString はい
OM_PROP_OAUTH_CLIENT_ID

(OAuthClientID)

NSString はい
OM_PROP_OAUTH_SCOPE

(OAuthScope(s))

NSSet はい
OM_PROP_BROWSER_MODE

(BrowserMode)

OM_PROP_BROWSERMODE_EMBEDDED

または

OM_PROP_BROWSERMODE_EXTERNAL

いいえ

ただし、初期化時に値が設定されなかった場合、デフォルトはEXTERNALに設定されます。

OM_PROP_OAUTH_CLIENT_SECRET

(OAuthClientSecret)

NSString いいえ
OM_PROP_OAM_OAUTH_SERVICE_ENDPOINT

(OAMOAuthServiceEndpoint)

NSString いいえ

注意: これは、OAM OAuthモバイル・クライアントでのみ必要とされます

OM_PROP_OAUTH_ASSERTION_JWT (OAuthUserJWTAssertionValue) NSString いいえ
OM_PROP_OAUTH_ASSERTION_SAML2 (OAuthUserSAML2UserAssertionValue) NSString いいえ
OM_PROP_OAUTH_CLIENT_ASSERTION_SAML2 (OAuthClientSAML2AssertionValue) NSString いいえ
OM_PROP_OAUTH_CLIENT_ASSERTION_JWT (OAuthClientJWTAssertionValue) NSString いいえ

9.10.1 OAM Mobile and Social (M&S) OAuth

OAM M&Sサーバーは、モバイルとともに使用できる次のOAuthクライアントをサポートします。

  • Webクライアント: 次で説明するように、これらのクライアントはOAuth GenericフローでIDM Mobile SDKを使用できます。Webベース・クライアントは信頼できるクライアントとみなされ、クライアント・シークレットを持っています。このため、認可サーバーは、リクエストするクライアントのアイデンティティを把握しています。このクライアント・タイプを使用する場合、アプリケーションは、SDK初期化時にクライアント・シークレットを渡すはずです。

  • モバイル・クライアント : モバイル・クライアントは、機密クライアントとみなされません。このため、これらのクライアントはいかなるクライアント・シークレットも持ちません。OAM OAuthサーバーには、エンド・ユーザーのユーザー名およびパスワードとともにデバイス要求を送信することによって、モバイル・クライアントを登録できる方法が用意されています。このフローはOAM OAuthサーバー固有です。動的クライアント登録が実行された後で、IDM Mobile SDKは、クライアント・アサーションとユーザー・アサーションを受信します(SERVER SIDE SSOが無効の場合)。以降のすべてのアクセス・トークン取得リクエストまたは他のトークン操作では、クライアント・アサーションを送信する必要があります。IDM Mobile SDKは、クライアント・アサーションのライフ・サイクルを管理し、これをクライアント・アプリケーションに返しません。

新しいトークン・タイプ 特徴
クライアント・アサーション このトークンは、動的クライアント登録が実行された後に生成されます。このトークンは、認可サーバーに対するすべてのリクエストと一緒に送信する必要があります。サーバーはクライアント・アサーションからのリクエストまたはクライアントを識別し、同じことを検証します。クライアント・アサーションは、通常JWTトークンです。
ユーザー・アサーション 動的クライアント登録にはユーザー認証が含まれるため、M&Sはクライアント・アサーションとともにユーザー・アサーションを生成します。このユーザー・アサーションは、サーバー側のユーザー・セッションをマークします。ユーザー・アサーションは、SERVER SIDE SSOが無効の場合のみ、サーバーにより返されます。

このため、クライアントまたはSDKは、ユーザー・セッションがサーバーで有効になるまでずっと、同じアサーションを使用して、リソース・アクセスのアクセス・トークンを取得できます。

また、SERVER SIDE SSOが有効の場合、SDKまたはクライアントは、すべてのリクエストに次のパラメータを追加することによって、なおもユーザー・アサーションを使用できます。

use_server_side_device_store = true


9.10.1.1 認証

設定の完了後、アプリケーションは、この場合、OAuthの保護されたリソースにアクセスするアクセス・トークンを取得するための認証を実行できるようになります。認証フローは、他のフローと異なりません。

iOSでは、OMMobileSecurityServiceのstartAuthenticationProcess:nil presenterViewController:presenterが、認証プロセスを開始するために使用されます。完了後に、SDKは、OMMobileServiceDelegateの(void)mobileSecurityService: (OMMobileSecurityService *)mobileSecurityServicedidFinishAuthentication: (OMAuthenticationContext *)contexterror: (NSError *)errorをコールバックします。

認証が成功すると、コンテキストには、user_assertionのような他の補助的トークン(利用できる場合)とともに、アクセス・トークンが含まれます。また、認証が成功しなかった場合、認証コンテキストはnull.になります。

認証のこのフローには、次の手順が含まれます。

9.10.1.1.1 動的クライアント登録

モバイル・クライアントは通常、機密とみなされないため、サーバーはこれらのクライアントのためにいかなるシークレットも作成しません。ただし、OAM M&Sサーバーは、クライアントが自身を動的に登録して、ユーザーおよび登録が行われたデバイスに結合されたクライアント・トークン(client_assertion)を取得する方法を提供します。デバイス情報は、サーバーがユーザーとデバイスを追跡して、OAAMプラグインを起動できるようにするために役立ちます(適用できる場合)。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のサーバー側ドキュメントを参照してください。

OAM M&Sは、クライアント登録を実行する2つの方法(2-leggedクライアント登録と3-leggedクライアント登録)をサポートします。クライアント登録フローは、初期化時にアプリケーションにより提供される権限タイプに基づいて、SDKによって決定されます。権限タイプを定義するために使用されるプロパティは、OM_PROP_OAUTH_AUTHORIZATION_GRANT_TYPEです。

  • 2-leggedクライアント登録: これは、権限タイプがRESOURCE_OWNERまたはASSERTIONまたはCLIENT_CREDENTIALSまたはOAM_CREDENTIALSであるときに行われます。このフローの終了後、SDKはユーザー・アサーション・トークンとともにclient_assertionを取得します。


    注意:

    クライアント側にuser_assertionがあるかどうかは、サーバーのSERVER_SIDE_SSOプロパティに設定される値によって決まります。

  • 3-leggedクライアント登録: これは、権限タイプがAUTHORIZATION_CODEであるときに行われます。このフローは、初期化プロパティに基づいて、外部または埋込みのブラウザを呼び出します。通常、このフローの終了時に、IDM Mobile SDKはclient_assertionトークンのみを取得します。

9.10.1.1.2 アクセス・トークン取得

動的クライアント登録が行われ、SDKが有効なclient_assertionトークンを取得したら、アクセス・トークン取得フローに進むことができます。アクセス・トークンは、初期化プロパティOM_PROP_OAUTH_AUTHORIZATION_GRANTを使用して指定された権限タイプを使用して取得できます。表9-3には、権限タイプとそれぞれの適切なプロパティ値に関する情報が記載されています。

表9-3 アクセス・トークンを取得するための権限タイプ

権限タイプ 初期化プロパティ値 メモ

OAM資格証明権限タイプ

初期化プロパティの値はOM_OAUTH_OAM_CREDENTIALです。

2-leggedクライアント登録フローでは、SDKはSERVER_SIDE_SSOプロパティに設定された値に基づいて、client_assertionとuser_assertionトークンを取得します。認証フローを完了するために、SDKは先にclient_assertionを交換してOAuth保護リソースのアクセス・トークンを取得し、続いて、client_assertionとuser_assertionを使用して(利用できる場合)、OAM_ID(USERTOKEN_MT)とOBSSOCookie(USERTOKEN)トークンを取得します。この権限タイプは、OAM_ID Cookieを使用してwebgate保護リソースにアクセスするクライアントのために、サーバーにより提供されます。

リソース所有者権限タイプ

初期化プロパティの値はOM_OAUTH_RESOURCE_OWNERです。

2-leggedクライアント登録が実行されます。SDKは、2-leggedクライアント登録を完了するために、ユーザー名とパスワードを収集します。このため、SDKは、これらのユーザー資格証明を再利用してアクセス・トークンを取得します。このフローでは、SDKはサーバーが送信したSERVER_SIDE_SSOプロパティを引き受けず、常にユーザー資格証明を送信してアクセス・トークンを取得します。クライアント・アサーションが期限切れになるか、無効にされた場合、SDKは再びエンド・ユーザー資格証明を要求して、まずクライアント・アサーションを更新し、続いてアクセス・トークンを取得します。

クライアント資格証明権限タイプ

初期化プロパティの値はOM_OAUTH_CLIENT_CREDENTIALSです。

2-leggedクライアント登録が実行されます。SDKは、認証フローを完了するために、クライアント登録後に取得したclient_assertionを使用してアクセス・トークンを取得します。クライアント・アサーションが期限切れになるか、無効にされた場合、SDKはエンド・ユーザー資格証明を要求して、まずクライアント・アサーションを更新し、続いてアクセス・トークンを取得します。

アサーション権限タイプ

初期化プロパティの値はOM_OAUTH_ASSERTIONです。

2-leggedクライアント登録フローでは、SDKはclient_assertionトークンとuser_assertionトークンを取得します。user_assertionトークンは、SERVER_SIDE_SSOがfalseの場合のみ、サーバーによって利用可能にされます。SDKは、認証フローを完了するために、クライアント登録後に取得したuser_assertionを使用してアクセス・トークンを取得します。この権限タイプは、プロパティ値に基づいてリクエストを適切に形成することによって、SERVER_SIDE_SSO構成プロパティをサーバーから引き受けます。SERVER_SIDE_SSOプロパティがtrueに設定されている場合、SDKはアクセス・トークン・リクエストにoracle_use_server_device_store=trueパラメータを追加します。その際に、サーバー側で作成されたユーザー・セッションをサーバーが再利用することが必要です。また、oracle_use_server_device_store=trueの場合、クライアントが毎回ユーザー・アサーションを送信する必要はありません。

アプリケーションは、初期化プロパティOM_PROP_OAUTH_ASSERTION_JWT(JWTアサーションの場合)およびOM_PROP_OAUTH_ASSERTION_SAML2(SAML2アサーションの場合)を使用して、このフローにカスタム・アサーションを提供できます。SDKは、このアサーションを使用してアクセス・トークンを取得し、認証フローを完了します。

認可コード権限タイプ

初期化プロパティの値はOM_OAUTH_AUTHORIZATION_CODEです。

3-leggedクライアント登録フローが含まれ、SDKはその中でclient_assertionのみを受け取ります。このフローでは、SDKは、初期化プロパティOM_PROP_BROWSER_MODEに基づいて、外部または埋込みのブラウザを呼び出します。認証フローを完了するには、SDKはブラウザを2度呼び出す必要があります。初回はクライアント登録のため、2回目はアクセス・トークン取得のためです。

注意: アプリケーションがOM_PROP_BROWSER_MODEプロパティにBrowserMode.EXTERNALとして値を設定した場合、ユーザーは外部ブラウザに2回資格証明を入力しなくてもよいことがあります。これは、クライアント登録フローそのものにおいて、サーバーがOAM_ID Cookieを外部ブラウザに設定するからで、そのため、ブラウザはアクセス・トークン取得時にログイン資格証明を要求しません。


9.10.2 標準フロー(一般的な実装)


注意:

機密クライアントの場合、クライアント・シークレットを入力する必要があります。

IDM Mobile SDKは、任意のOAuth2.0準拠サーバーに対する認可をサポートします。現在の実装は、次の権限タイプをサポートします。

  • 暗黙の権限タイプ。(「クライアントID」と「認可エンドポイント」は必須)

  • 認可コード権限タイプ。(「client_id」、「認可エンドポイント」および「トークン・エンドポイント」は必須)

  • リソース所有者権限タイプ。(「client_id」と「トークン・エンドポイント」は必須)

  • クライアント資格証明。(「client_id」と「client_secret」は必須)

  • アサーション。(アプリケーションは、アサーションのタイプに応じてOM_PROP_OAUTH_ASSERTION_JWTまたはOM_PROP_OAUTH_ASSERTION_SAML2プロパティを使用して、アサーション値を提供する必要があります)

9.10.2.1 認証スコープ

SDKはスコープのリストを受け入れ、OAuth2.0サーバーを使用してユーザーを認証(有効なアクセス・トークンを取得)します。

ユーザーの認証と、認証サーバーとのユーザーの同意の後、認証サーバーが返すアクセス・トークンがIDM Mobile SDKによって取得され、初期的に指定のスコープに関連付けられます。

そのため、認証プロセスの開始前に、SDKは、リクエストで要求されたスコープに対して有効なアクセス・トークンがあるかどうかを確認します。適合するアクセス・トークンが存在するか、要求されたスコープより広い場合は、SDKは再認証しません。その代わりに、同じ認証コンテキストまたはアクセス・トークンを返します。

認可サーバーでサポートされている場合、IDMMobile SDKはアクセス・トークンをリフレッシュする機能を提供します。アクセス・トークンのライフ・サイクルは、SDKによって制御されます。SDKは、渡されたスコープのアクセス・トークンを取得するAPIと、必要に応じてそれをリフレッシュする機能を提供します。

初期化のためのサンプル・コードを次に示します。

                    NSMutableDictionary  *sdkProps = [[NSMutableDictionary alloc] init];
        [sdkProps setObject:OM_PROP_OAUTH_OAUTH20_SERVER                     forKey:OM_PROP_AUTHSERVER_TYPE];
        [sdkProps setObject:@"<Token Endpoint>"                     forKey:OM_PROP_OAUTH_TOKEN_ENDPOINT];
        [sdkProps setObject:@"<Authorization Endpoint>"                     forKey:OM_PROP_OAUTH_AUTHORIZATION_ENDPOINT];
        [sdkProps setObject:@"<Client ID>"                     forKey:OM_PROP_OAUTH_CLIENT_ID];
        [sdkProps setObject:OM_OAUTH_AUTHORIZATION_CODE                     forKey:OM_PROP_OAUTH_AUTHORIZATION_GRANT];/*The value could be any of the grant type supported by SDK*/
        [sdkProps setObject:@"<Registered Redirect URL>"                     forKey:OM_PROP_OAUTH_REDIRECT_ENDPOINT];
        [sdkProps setObject:OM_PROP_BROWSERMODE_EXTERNAL                     forKey:OM_PROP_BROWSERMODE];
         NSMutableArray *scope = [[NSMutableArray alloc] init];
[scope addObject:@"<OAuth Scope>"];
[sdkProps setObject:[NSSet setWithArray:scope] forKey:OM_PROP_OAUTH_SCOPE];         OMMobileSecurityService *mss = nil;
        mss = [[OMMobileSecurityService alloc] initWithProperties:sdkProps                                                           delegate:self];
        self.mss = mss; /*Please note that initialized SDK object need to be retained atleast till the authentication completes.*/

初期化処理が成功した場合、OMMobileSecurityServiceに対してObjectが返されます。戻り値がない場合、いくつか無効な構成パラメータがあることを示します。パラメータを再構成して初期化処理を再試行する必要があります。

初期化後に、SDKを設定する必要があります。このために次のAPIを使用します。

[self.mss setup];

SDKは、設定コールで、M&Sモバイル・クライアントをダウンロードします。これは非同期APIです。

設定の完了後、mssオブジェクト上でstartAuthenticationProcess:presenterViewController APIをコールして、OAuthフローを開始する必要があります。

スコープのリストは、OMAuthenticationRequestオブジェクトの一部としてこのAPIに渡すことができます。渡された場合、これらのスコープは、次の操作時に渡されるものをオーバーライドします。

        OMAuthenticationRequest *req = [[OMAuthenticationRequest alloc] init];
 
        NSMutableArray *scope = [[NSMutableArray alloc] init];
 
        [scope addObject:@"<OAuth Scope>"];
 
        req.oauthScope = [NSSet setWithArray:scope];
 
        [scope release];
 
        NSError *error = [self.mss startAuthenticationProcess:req presenterViewController:self];

注意:

アプリケーションは、OMMobileSecurityServiceDelegatedidFinishAuthentication: delegateメソッドを実装して、認証後にコントロールを取得する必要があります。

M&Sモバイル・クライアント初期化のサンプル・コードを次に示します。

 NSMutableDictionary *sdkProps = [[NSMutableDictionary alloc] init];
 
[sdkProps setObject:OM_PROP_OAUTH_OAUTH20_SERVER
 
forKey:OM_PROP_AUTHSERVER_TYPE];
 
[sdkProps setObject:@"<M&S servers service endpoint for the desired OAuth service profile>"
 
forKey:OM_PROP_OAUTH_OAM_SERVICE_ENDPOINT];
 
[sdkProps setObject:@"<Mobile Client ID>"
 
forKey:OM_PROP_OAUTH_CLIENT_ID];
 
[sdkProps setObject:OM_OAUTH_RESOURCE_OWNER
 
forKey:OM_PROP_OAUTH_AUTHORIZATION_GRANT_TYPE];
 
NSMutableArray *scope = [[NSMutableArray alloc] init];
 
[scope addObject:@"<OAuth Scope>"];
 
[sdkProps setObject:[NSSet setWithArray:scope] forKey:OM_PROP_OAUTH_SCOPE]; 

9.10.3 新規API

次の3つのAPIが、OMAuthenticationContextクラスに追加されました。

  • -(BOOL)isValidForScopes:(NSSet *)scopes refresh:(BOOL)refresh:

    このAPIは、適合するトークンに対してリフレッシュ・トークンが存在する場合、リフレッシュのスコープのセットとブール値を取ります。

  • -(NSArray *)accessTokensForScopes:(NSSet *)scopes:

    このAPIはスコープのセットを取り、そのスコープのセットに結合したすべての有効なトークンを返します。スコープとしてnilが渡された場合、すべての有効なアクセス・トークンが返されます。


    注意:

    OAuthトークンは、NSArray(名前付きトークン)の、OMAuthenticationContextオブジェクトに存在します。

  • -(void)checkValidityAsynchronouslyForScopes:(NSSet*)scopes andRefreshExpiredTokens:(BOOL)refresh:

    このAPIは、適合するトークンに対してリフレッシュ・トークンが存在する場合、リフレッシュのスコープのセットとブール値を取ります。それは「非同期コール」で、渡されたスコープに対して有効なトークンが存在するかどうかを示します。このAPIは、refreshExpiredTokenの値がtrueに設定されている場合、期限切れのトークンをリフレッシュしようと試みます。アプリケーション開発者は、OMAuthenticationContextDelegateメソッドを実装してデリゲート・コールバックを取得する必要があります。

サンプル・コード:

- (void)checkAuthContextValidity{      self.authContext.delegate = self; //This delegate needs to be set before calling the async API
      NSMutableArray *scope = [[NSMutableArray alloc] init];
     [scope addObject:@"UserProfile.users"];
     [self.authContext checkValidityAsynchronouslyForScopes:[NSSet setWithArray:scope] andRefreshExpiredTokens:YES];
}
//This is the OMAuthenticationDelegate method which needs to be implemented for getting the async API callback
- (void)authenticationContext:(OMAuthenticationContext *)authenticationContext
          didFinishValidation:(BOOL)valid
     forMobileSecurityService:(OMMobileSecurityService *)mobileSecurityService
                     andError:(NSError *)error
{
    if(valid)
    {
          NSMutableArray *scope = [[NSMutableArray alloc] init];
         [scope addObject:@"UserProfile.users"];
         NSArray *token = [authenticationContext tokensForScopes:[NSSet setWithArray:scope]]; //This token can be used for subsequent //requests
    }
    else
    {
         [mobileSecurityService startAuthenticationProcess:nil presenterViewController:self]; //If no valid token exists for passed scopes                                                                                                      //authentication can be started
    }
}

9.10.4 外部ブラウザの使用

デリゲートが実装されていない場合は、サンプル・コードの次のスニペットを使用して実装する必要があります。

application:openURL:sourceApplication:annotation method of UIApplicationDelgate :
        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];

9.10.5 保護されたリソースへのアクセス

OMRESTRequestリクエストで次のAPIを使用して、OAuth保護リソースにアクセスする前に、ヘッダーにアクセス・トークンを挿入します。

- (OMAsyncOpHandle *)executeRESTRequestAsynchronously: (NSMutableURLRequest *)request
 
                                            forScopes: (NSSet *)scopes
 
                                    convertDataToJSON: (BOOL)isJsonRepresentation
 

このAPIは、指定のスコープのヘッダーにアクセス・トークンを追加した後で指定のRESTリクエストを非同期に実行し、ハンドルを非同期操作に返します。コール元は、リクエストの完了前ならいつでも、このハンドルを使用して非同期リクエストを中断できます。RESTリクエストは別のスレッドで実行され、結果はOMRESTRequestDelegateデリゲートを介して返されます。次のフローは、OAuth SIM v3.1でサポートされます。

  • IDとシークレットによるClient_credentialsフロー

  • クライアントの秘密鍵で署名されたJWTベアラー・トークンを使用したClient_credentialsフロー

  • クライアントIDとシークレットおよびリソース所有者パスワードを使用するリソース所有者パスワード・フロー

  • クライアントの秘密鍵とリソース所有者パスワードを使用して署名されたJWTベアラー・トークンを使用するリソース所有者パスワード・フロー

  • クライアントの秘密鍵を使用して署名されたクライアントJWTトークンとユーザーJWTトークンを使用するJwt-bearer(OM_OAUTH_ASSERTION)フロー

  • SIMサーバーにより発行されたクライアントJWTトークンとユーザーJWTトークンを使用するJwt-bearer(OM_OAUTH_ASSERTION)フロー

次の各項で少し詳しく説明します。

9.10.5.1 アイデンティティ・ドメイン・ヘッダー・インジェクションのためのSDKの初期化

SDKをアイデンティティ・ドメイン・ヘッダー・インジェクションのために初期化する際に、次のプロパティを設定する必要があります。

  • OM_PROP_IDENTITY_DOMAIN_NAME

    このパラメータの値には、アイデンティティ・ドメイン名が含まれる必要があります。

  • OM_PROP_IDENTITY_DOMAIN_NAME_IN_HEADER

    これまでSDKではアイデンティティ・ドメインの前にユーザー名を付ける習慣だったため、下位互換性を維持するためにこのプロパティが導入されます。アイデンティティ・ドメインをヘッダーで渡す必要がある場合、このプロパティにtrueを渡します。

9.10.5.2 クライアント・トークンのためのSDKの初期化

SDKをクライアント・トークンのために初期化する際に、次のプロパティを設定する必要があります。

  • OM_PROP_OAUTH_CLIENT_ASSERTION_JWT

    クライアントJWTトークンのための値を含む必要があります。

  • OM_PROP_OAUTH_CLIENT_ASSERTION_SAML2

    クライアントSAML2トークンのための値を含む必要があります。ただし、SIMサーバーは現在JWT Tokenのみサポートするため、このプロパティは無視できます。

9.10.5.3 ユーザー・トークンのためのSDKの初期化

SDKをユーザー・トークンのために初期化する際に、次のプロパティを設定する必要があります。

  • OM_PROP_OAUTH_ASSERTION_JWTユーザーJWTトークンの値を含む必要があります。

  • OM_PROP_OAUTH_ASSERTION_SAML2

    ユーザーSAML2トークンのための値を含む必要があります。ただし、SIMサーバーは現在JWT Tokenのみサポートするため、このプロパティは無視できます。

Android for SIMv3.1のためのサンプル・コードを次に示します。


注意:

サンプル・コードの各プロパティに対応するコメントを読み、SDK初期化時に、アプリケーションの用途に必要なプロパティ名のみを渡す必要があります。初期化プロパティは別として、他はすべて同じまま、つまり、authenticate、isValid、logoutです。

    private Map<String, Object> getConfigMapForSIMv31() {
        Map<String, Object> configMap = new HashMap<String, Object>();
        configMap
                .put(OMMobileSecurityService.OM_PROP_APPNAME, "DemoSIMv3.1App");
        configMap.put(OMMobileSecurityService.OM_PROP_AUTHSERVER_TYPE,
                AuthServerType.OAuth20);
        configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_CLIENT_ID,
                "client_id");
        configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_CLIENT_SECRET,
                "client_secret");
        configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_TOKEN_ENDPOINT,
                "http://www.example.com:1234/token_endpoint");\\
        configMap.put(
                OMMobileSecurityService.OM_PROP_OAUTH_AUTHORIZATION_ENDPOINT,
                "http://www.example.com:1234/authz_endpoint");\\
        configMap
                .put(OMMobileSecurityService.OM_PROP_REMEMBER_USERNAME_ALLOWED,
                        true);
        configMap.put(
                OMMobileSecurityService.OM_PROP_OAUTH_AUTHORIZATION_GRANT_TYPE,
                OAuthAuthorizationGrantType.RESOURCE_OWNER);
 
        configMap.put(OMMobileSecurityService.OM_PROP_IDENTITY_DOMAIN_NAME,
                "DemoTenant");// If this is supplied then the SDK will not
                                // expect the idenity domain to be collected
                                // from user or from the authentcationRequest
                                // object. Instead use the same identity domain passed during init. 
        configMap.put(
                OMMobileSecurityService.OM_PROP_IDENTITY_DOMAIN_NAME_IN_HEADER,
                true);// This property is required if the application wants the
                        // SDK to send the identity domain as the header.
 
 
        configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_ASSERTION_JWT,
                "user assertion");// required when the application wants to use
                                    // assertion as a grant type.
        // configMap
        configMap.put(OMMobileSecurityService.OM_PROP_LOGOUT_URL,
                TesterAppConstants.OAUTH_LOGOUT_URL);
        configMap
                .put(OMMobileSecurityService.OM_PROP_SESSION_ACTIVE_ON_RESTART,
                        true);// required if the application wants the SDK to
                                // persist the authentication context, The
                                // default behavior is not to persist the
                                // authentication context thus forcing re
                                // authentication on application restart.
        configMap.put(OMMobileSecurityService.OM_PROP_OAUTH_REDIRECT_ENDPOINT,
                "myredirecturl://");
        String scope = "scope1,scope2,scope3";
        Set<String> scopeset = new HashSet<String>();
        if (!TextUtils.isEmpty(scope)) {
            String[] scopes = scope.split(",");
            for (String s : scopes) {
                scopeset.add(s);
            }
        }
        if (!scopeset.isEmpty())
            configMap
                    .put(OMMobileSecurityService.OM_PROP_OAUTH_SCOPE, scopeset);
        configMap
                .put(OMMobileSecurityService.OM_PROP_REMEMBER_USERNAME_ALLOWED,
                        true);
        configMap.put(OMMobileSecurityService.OM_PROP_OFFLINE_AUTH_ALLOWED,
                true);
        configMap.put(OMMobileSecurityService.OM_PROP_BROWSER_MODE,
                TesterAppConstants.OAUTH_BROWSER_MODE);
 
        return configMap;
    }

9.10.6 資格証明コレクション

IMPLICITおよびAUTHORIZATION_CODEの権限タイプの場合、SDKは外部または埋込みのブラウザを呼び出します。認可サーバーはブラウザにログイン・ページをロードし、エンド・ユーザーはログイン資格証明を直接、認可サーバーに送信します。RESOURCE_OWNERCLIENT_CREDENTIALSASSERTIONおよびOAM_CREDENTIALの各権限タイプの場合、SDKはネイティブのUIを提供してエンド・ユーザーのログイン資格証明をデフォルトで収集します。ただし、アプリケーションは、資格証明コレクションのためのカスタム・ビューまたはUIを提供するようにSDKに指示できます。詳細は、第9.13項「ログイン・ビューおよびKBAビューのカスタマイズ」を参照してください。


注意:

OAuth2.0では、リソース所有者権限タイプのSDKが資格証明を収集するため、「ユーザー名のみ保存フラグ」を使用できます。詳細は9.16項「資格証明ストア・サービス(KeyChain)の使用」を参照してください。

9.11 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.11.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.12 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;
}

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.13 ログインおよびKBAビューのカスタマイズ

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

9.13.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.13.2 進行状況ビューのカスタマイズの実装

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

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

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

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

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

9.14.1 ハッシング

ハッシング機能を使用して、自動生成されたランダム・ソルト付きの文字列(通常はパスワード)のハッシュ値を取得します。また、次の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:

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

この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:

9.14.3 非対称鍵による暗号化

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

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

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

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

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

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

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

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がユーザー名を安全にキャッシュし、自動的にログイン画面のユーザー名を設定します。ユーザーは、パスワードを入力してログイン・ボタンをクリックし、認証プロセスを進める必要があります。必要に応じて、ユーザーは異なるユーザー名を入力したり、オプション・ボックスを変更することができます。

詳細は、次の項で説明されています。

9.15.1 自動ログインおよび資格証明保存機能の有効化

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

表9-4 自動ログインおよび資格証明保存の構成パラメータ

パラメータ 説明

OM_PROP_AUTO_LOGIN_ALLOWED

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

OM_PROP_REMEMBER_CREDENTIALS_ALLOWED

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

OM_PROP_REMEMBER_USERNAME_ALLOWED

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


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

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

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

パラメータ 説明

OM_AUTO_LOGIN_DEFAULT

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

OM_REMEMBER_CREDENTIAL_DEFAULT

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

OM_REMEMBER_USERNAME_DEFAULT

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


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

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

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

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

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

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

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

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

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

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

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

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

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

キー 説明

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.16 資格証明ストア・サービス(KeyChain)の使用

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

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

次の各項には、OMCredentialStoreの使用方法を示すコード・スニペットが記載されています。

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

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

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

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

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

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

9.16.3 資格証明の削除

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

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

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

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

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

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

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

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

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

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

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

9.16.7 KeyChainItemでのプロパティの格納

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

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

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

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

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

9.16.9 KeyChainItem内のプロパティの削除

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

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

9.16.10 プロパティの取得

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

- (id)getPropertyForKey:(NSString *)key