Oracle® Fusion Middleware Oracle Access Management開発者ガイド 11gリリース2 (11.1.2.3.0) for All Platforms E67354-04 |
|
前 |
次 |
この章では、iOSクライアントSDKを使用してモバイルおよびソーシャル・サービス・アプリケーションを開発する方法について説明します。このSDKは、iOS上でセキュアなモバイル・アプリケーションを開発するためのセキュリティ・レイヤーとして機能します。すべてのネイティブなiOSアプリケーションは、Mobile and Socialを使用するために、このSDKを実装する必要があります。
このiOS SDKは、iOS 6.0以上を実行するデバイスをサポートします。この章の内容は次のとおりです。
このSDK (oamms_sdk_for_ios.zip
)は、Oracle Access Management配布パッケージに含まれており、Oracle Technical Network (OTN) Webサイトからダウンロードすることもできます。
この開発者ガイドの他に、SDKでは、HTML形式のAPIドキュメントが提供されています。APIクラス、インタフェース、コンストラクタ、メソッドおよびフィールドの説明については、APIドキュメントを参照してください。
IDM Mobile iOSクライアントSDKは、静的ライブラリとして提供されます。次のモジュールが含まれます。
認証モジュール: ユーザー、デバイスおよびアプリケーションのかわりに認証リクエストを処理します。
セキュア・ストレージ・モジュール: iOS Keychain機能を使用して重要なデータを保存および取得するためのAPIを提供します。
ユーザー・ロール・モジュール: ユーザーおよびアプリケーションが構成されたアイデンティティ・ストアからユーザーおよびグループ詳細を取得できるようにするユーザー・プロファイル・サービスを提供します。
暗号化モジュール: 一般的な暗号化タスクのための直感的なObjective C APIを提供します。
REST Webサービス・ハンドラ・モジュール: Access Managerによって保護されたREST Webサービスへのアクセスを提供します。
注意: iOSモバイル・デバイス用のアプリケーションを開発するには、Mac OS X Snow Leopard以降を実行しているIntelベースのMacにXcode IDE (統合開発環境)がインストールされている必要があります。詳細は、iOS Dev CenterのWebサイトを参照してください。 |
Xcode環境を設定するには、次の手順に従ってください。
使用している開発環境にlibIDMMobileSDK.a
をダウンロードし、それをXcodeに追加します。
oamms_sdk_for_ios.zip
内にあるPublicHeaders
フォルダおよびPublicResources
フォルダをダウンロードします。
PublicHeaders
ディレクトリには、IDM Mobile SDKのヘッダー・ファイルが含まれています。
PublicResources
ディレクトリには、IDM Mobile SDKのリソースが含まれています。
PublicHeaders
およびPublicResources
の内容をプロジェクトに追加します。
次のフレームワークをプロジェクトに追加します。
SystemConfiguration.framework
Security.framework
CoreLocation.framework
重要: プロジェクトをリンクする前に、「Build Settings」の「Other linker flags」に-ObjC および-all_load の2つのフラグを1行で追加します。これらのフラグを使用しない場合、アプリケーションは「selector not recognized」というランタイム例外が発生してクラッシュします。
背景情報とプロジェクトにフラグを追加する方法については、次のページを参照してください。 |
IDM Mobile iOSクライアントSDKを使用してコーディングを開始できるようになりました。
重要: このiOS SDKは、iOS 6.0以上を実行するデバイスをサポートします。 |
この項では、Mobile and Socialサーバーを使用して認証する方法について説明するサンプル・コードを提供します。次のタスクのサンプル・コードが含まれています。
サービス・プロバイダの構成の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイルおよびソーシャル・サービスの構成に関する項を参照してください。
NSMutableDictionary
オブジェクトを作成し、パラメータを指定します。
NSMutableDictionary *sdkProps = [[NSMutableDictionary alloc] init]; [sdkProps setObject:OM_PROP_AUTHSERVER_OAMMS forKey:OM_PROP_AUTHSERVER_TYPE]; [sdkProps setObject:@"http://oammsurl" forKey:OM_PROP_OAMMS_URL]; [sdkProps setObject:@"myApp" forKey:OM_PROP_APPNAME]; [sdkProps setObject:@"MobileServiceDomain" forKey:OM_PROP_OAMMS_SERVICE_DOMAIN];
次に、OMMobileSecurityService
オブジェクトを作成し、プロパティとしてDictionary
オブジェクトを渡します。
OMMobileSecurityService *mss = [[OMMobileSecurityService alloc] initWithProperties:sdkProps delegate:self];
OM_PROP_OAMMS_URL
プロパティ・キーは、Mobile and Socialサーバーにアクセスするために必要なURL(プロトコル、ホスト名およびポート番号を含む)です。HTTPおよびHTTPSプロトコルのみがサポートされています。
OM_PROP_APPNAME
プロパティ・キーは、アプリケーションを識別する一意の識別子です。この文字列値はMobile and Socialサーバー管理コンソールのアプリケーション・プロファイルのセクションにあるアプリケーション名の値に一致している必要があります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または作成に関する項を参照してください。
OM_PROP_OAMMS_SERVICE_DOMAIN
プロパティ・キーは、このアプリケーションのアプリケーション・プロファイルを保持しているMobile and Socialサーバー内のサービス・ドメインの名前です。
次に、OMMobileSecurityService
setup
メソッドをコールします。
[mss setup];
設定メソッドにより、Mobile and Socialサーバーから構成済セキュリティ・ポリシーおよびアプリケーション・プロファイルを取得します。このメソッドは、Mobile and Socialサーバー上で認証、認可およびユーザー・プロファイル・サービスに接続するために必要なサービス・エンドポイント(URL)のリストも取得します。
設定コールは非同期コールであり、完了するとiOSクライアントSDKは次のデリゲート・メソッドをコールします。
mobileSecurityService: (OMMobileSecurityService *)mobileSecurityService didReceiveApplicationProfile:(NSDictionary *)applicationProfile error:(NSError *)error;
注意: アプリケーション開発者によって実装されるデリゲートの名前は、OMMobileServiceDelegateです。 |
このメソッドは、アプリケーション・プロファイルの詳細が格納されたNSDictionary
オブジェクトを返します。
注意: [mss setup] をコールするスレッドは、実行ループが実行されている必要があります。メイン・スレッド以外のスレッドから[mss setup] を呼び出す場合は、実行ループがデフォルト・モードで実行されていることを確認してください。
詳細は、次の場所にある『iOS Developer Library Threading Programming Guide』を参照してください。 |
アプリケーション・プロファイルを受け取ったら、認証プロセスを開始します。次のサンプルに示すように、独自にカスタマイズしたログインおよびKBA(ナレッジ・ベース認証)のビューを認証リクエストに提供します。カスタマイズされたビューが不要な場合は、startAuthenticationProcess
のauthnReq
には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 がない古いセレクタも利用可能です。両方が実装された場合、新しいセレクタのみが呼ばれます。 |
次のメソッドを呼び出して、ユーザーをログアウトします。
[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 (後で説明)から永続データを読み取ることができます。 |
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
これによって、モバイル・アプリケーションで複数の構成パラメータ・セットを管理できます。
SDKの初期化時に次のプロパティを設定できます。
表9-1 iOSクライアントSDKの初期化プロパティ
プロパティ名 | プロパティの値 | 型 |
---|---|---|
|
|
NSString 注意: これは必須プロパティです。 |
|
NSURLオブジェクト、またはNSURLの作成に使用できる有効なNSStringオブジェクト。 このプロパティを使用しない場合は、次のプロパティを指定します。
|
NSStringまたはNSURL |
|
必須プロパティ。NSStringオブジェクトとして渡される任意の有効なサービス・ドメイン名。 |
NSString |
|
必須プロパティ。NSStringオブジェクトとして渡される有効なアプリケーション名。 |
NSString |
|
これはオプション・プロパティですが、これを指定しないとオフライン認証は許可されません。 Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。 |
NSString |
|
ユーザーによるログイン試行の最大許容回数。 これはオプション・プロパティです。このプロパティが指定されない場合、許容されるログイン試行回数は1回のみです。 Mobile and Socialサーバーでも、アプリケーション・プロファイルでこのプロパティを指定できます。サーバーの設定はアプリケーションの設定よりも優先されます。 |
NSNumber |
|
このプロパティを使用して、KeyChain Itemの保護レベルを指定します。 次の値のいずれかを指定する必要があります。
これはオプション・プロパティです。これが指定されない場合、このプロパティのデフォルトは最高レベルである |
NSString |
|
これはオプション・プロパティであり、デフォルト値は |
NSString |
|
デバイスの移動距離が指定された距離(メートル)を超えた場合に、ロケーションの更新が送信されます(有効になっている場合)。 このプロパティを使用して、更新の生成頻度を制御します。 Mobile and Socialサーバーでも、「モバイル・カスタム属性」セクションでキー |
NSNumber |
|
これはオプション・プロパティですが、これを指定しないと自動ログイン機能は無効化されます。 |
NSString |
|
これはオプション・プロパティですが、これを指定しないと資格証明の保存機能は無効化されます。 |
NSString |
|
これはオプション・プロパティですが、これを指定しないとユーザー名の保存機能は無効化されます。 |
NSString |
|
これはオプション・プロパティですが、これを指定しないと自動ログイン・ユーザー・プリファレンスのデフォルト値はfalseになります。 |
NSString |
|
これはオプション・プロパティですが、これを指定しないと資格証明の保存ユーザー・プリファレンスのデフォルト値はfalseになります。 |
NSString |
|
これはオプション・プロパティですが、これを指定しないとユーザー名の保存ユーザー・プリファレンスのデフォルト値は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の暗号スキームのプロパティ属性
プロパティ | 値 | 属性名 | 属性値 |
---|---|---|---|
|
|
|
|
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
Mobile and Socialの認証フローではオフライン認証がサポートされています。
startAuthenticationProcess:presenterViewController:
メソッドに渡されるOMAuthenticationRequest
オブジェクトには、connectivityMode
というプロパティがあります。このプロパティは、OMAuthenticationRequest.h
ファイルに定義されている列挙OMConnectivityMode
の値を受け取ります。
それらの値は次のとおりです。
OMConnectivityOnline
: 常にサーバーとの間で認証が行われます。デバイスがインターネットに接続できない場合は失敗します。
OMConnectivityOffline
: キャッシュされた資格証明を使用してローカルで認証が行われます。デバイスがオンラインでサーバーと接続できる場合であっても、オフライン認証が行われます。
OMConnectivityAuto
: サーバーに接続可能な場合はサーバーとの間で認証が行われます。そうでない場合、デバイスがインターネットに接続されていないときには、オフラインで認証が行われます。
オフライン認証はOMAuthenticationRequest
の一部であるため、この設定は現在のリクエストでのみ有効です。オフライン認証で失敗回数がOM_PROP_MAX_LOGIN_ATTEMPTS
で設定されている値を超えた場合(「M&S認証の初期化プロパティについて」の項で説明)、ローカルに格納されている資格証明は消去され、オンライン認証が行われるようになります。
注意: オフライン認証は、サーバーでオフライン認証が許可に設定されている場合のみ動作します。詳細は、『Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または削除に関する項を参照してください。 |
ソーシャル・アイデンティティ認証とは、Google、Twitter、Facebookなどのサード・パーティのOpenIdおよびOAuthプロバイダに対する認証を可能にするためのOracle Mobile and Socialサーバーの機能です。詳細は、『Oracle Access Management管理者ガイド』の「ソーシャル・アイデンティティの構成」の章を参照してください。
ソーシャル・アイデンティティ認証(リライイング・パーティ認証とも呼ばれています)では、Mobile and Socialサーバーに対する認証と同じAPIを使用してSDKを呼び出せます。ソーシャル・アイデンティティ・サービスに対する認証を行うようにサービス・ドメインを構成する場合、SDKは自動的にリライイング・パーティ認証のフローに従います。認証が正常に行われると、Mobile and Socialサーバーで構成されているURLスキームを使用して制御がアプリケーションに戻されます。
アプリケーションのUIApplicationDelegate
オブジェクトのapplication:openURL:sourceapplication:annotation
メソッドにこのコード・スニペットを追加し、フローを完了させます。このコードは、サーバーから受け取った情報をSDKに渡して認証が完了したことを伝えるのに役立ちます。
// Called when application in invoked via some URL - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { ... ... NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] initWithCapacity:1]; [userInfo setObject:url forKey:OM_RESPONSE_URL]; //Post the notification to IDM Mobile SDK [[NSNotificationCenter defaultCenter] postNotificationName:OM_PROCESS_URL_RESPONSE object:self userInfo:userInfo]; ... ... return TRUE; }
認証が正常に行われた後は、ディクショナリOMAuthenticationContext.accessTokens
のキーOM_ACCESS_TOKEN
を使用して、プロバイダ(存在する場合)からのトークンにアクセスできます。emailid
が構成されている場合は、OMauthenticationContext.userName
としてアクセス可能です。
この項のコード・サンプルで作業する前に、「ユーザー・プロファイル・サービスを伴うアプリケーション作成の概要」を参照して、このSDKに固有でない注意事項と情報を確認してください。
この項のコード・サンプルは、次の3つのカテゴリに分類されます。
ユーザーの詳細を検索および取得するには、OMMobileSecurityService
オブジェクトからOMUserManager
のハンドルを取得します。OMMobileSecurityServiceオブジェクトの詳細は、「iOSクライアントSDKを使用した認証サービスの起動」
を参照してください。
OMUserManager
では、ユーザーの詳細を検索および取得するための同期および非同期APIを提供します。
すべての非同期操作はOMAsyncOpHandle
オブジェクトを返します。このオブジェクトを使用して、完了前に操作を取り消すことができます。完了後に操作を取り消しても、操作は取り消されません。
- (id)getAttribute: (NSString *)attrName returningError: (NSError **)error;
- (NSArray *)searchUsersWithFilter: (NSDictionary *)filter isSimpleSearch: (BOOL)simpleSearch attributesToBeFetched: (NSArray *)attributesToFetch pageSize: (NSInteger)pageSize pagePosition: (NSInteger)pagePosition error: (NSError **)error;
- (OMAsyncOpHandle *)getAttributeAsynchronously: (NSString *)attrName;
- (OMAsyncOpHandle *)searchUsersAsynchronouslyWithFilter:(NSDictionary *)filter isSimpleSearch:(BOOL)simpleSearch attributesToBeFetched:(NSArray *)attributesToFetch pageSize:(NSInteger)pageSize pagePosition:(NSInteger)pagePosition; - (OMUser *)searchUser: (NSString *)user attributes: (NSArray *)attributes shouldPreFetch: (BOOL)preFetch error: (NSError **)error;
- (OMAsyncOpHandle *)searchUserAsynchronously: (NSString *)user attributes: (NSArray *)attributes shouldPreFetch: (BOOL)preFetch error: (NSError **)error; - (OMAsyncOpHandle *)searchAsynchronouslyUser: (NSString*)user attributes: (NSArray *)attributes shouldPreFetch: (BOOL)preFetch;
- (NSError *)deleteUser: (NSString *)userName;
- (OMAsyncOpHandle *)deleteAsynchronouslyUser:(NSString*)userName;
- (NSError *)createUserWithAttributes: (NSDictionary *)attributes;
- (OMAsyncOpHandle *)createUserAsynchronouslyWithAttributes:(NSDictionary *)attributes;
- (OMAsyncOpHandle *)modifyAsynchronouslyUser: (NSString*)user attributes: (NSDictionary *)attributes;
グループの詳細を検索および取得するには、OMMobileSecurityService
オブジェクトからOMRoleManager
のハンドルを取得します。OMMobileSecurityServiceオブジェクトの詳細は、「iOSクライアントSDKを使用した認証サービスの起動」
を参照してください。
OMRoleManager
では、グループの検索、メンバーのグループへの追加およびグループからのメンバーの削除を行うための同期および非同期APIを提供します。
すべての非同期操作はOMAsyncOpHandle
オブジェクトを返します。このオブジェクトを使用して、完了前にいつでも操作を取り消すことができます。完了後に操作を取り消しても、操作は取り消されません。
- (OMRole *)getRoleByName: (NSString *)roleName error: (NSError **)error;
- (OMAsyncOpHandle *)getAsynchronouslyRoleByName: (NSString *)roleName;
- (NSError *)deleteRoleByName: (NSString *)roleName;
- (OMAsyncOpHandle *)deleteAsynchronouslyRoleByName:(NSString*)name;
- (OMUser *)getUserInfo: (NSString *)userName fromRole: (NSString *)roleName error: (NSError **)error;
- (OMAsyncOpHandle *)getAsynchronouslyUserInfo:(NSString *)user fromRole:(NSString *)roleName;
- (NSError *)deleteMember: (NSString *)memberName fromRole: (NSString *)roleName;
- (OMAsyncOpHandle *)deleteAsynchronouslyMember:(NSString *)memberName fromRole:(NSString*)roleName; - (OMAsyncOpHandle *)createAsynchronouslyRoleWithAttributes:(NSArray*)attributes withValues:(NSArray*)values;
- (OMAsyncOpHandle *)modifyAsynchronouslyRole:(NSString*)role attributes:(NSArray*)attributes values:(NSArray*)values;
- (OMAsyncOpHandle *)addUserAsynchronouslyToRole:(NSString *)roleName withAttributes:(NSArray*)attributes withValues:(NSArray*)values;
次のAPIを使用して、マネージャやその部下に関する情報をリクエストします。これらはOMUser
で使用可能です。
次のAPIを使用して、ユーザーのマネージャを取得します。
- (OMUser *)getManager: (NSError **)error; - (OMAsyncOpHandle *)getManagerAsynchronously;
次のAPIを使用して、指定したユーザーの部下を取得します。
- (NSArray *)getReporteesWithAttributes: (NSArray *)attributes returningError: (NSError **)error; - (OMAsyncOpHandle *)getReporteesAsynchronouslyWithAttributes:(NSArray *)attributes;
次の手順に従って、ユーザー・プロファイル・サービスの非同期APIを使用します。
コール元のクラスは、OMEntityDelegate
を実装する必要があります。
デリゲート・メソッド-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
この項では、iOSクライアントSDKを使用してモバイル・シングル・サインオン・エージェント・アプリケーションと連携する方法について説明します。Mobile and Socialでのモバイル・シングル・サインオンに関する概念情報は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイル・シングル・サインオン(SSO)機能の概要に関する項およびMobile and Socialの理解に関する項を参照してください。
Webアプリケーションは、モバイルSSOエージェントによって提供されるシングル・サインオン認証機能を使用することもできます。この機能にはAccess Managerが必要です。
Oracle Access Management管理コンソールにログインします。
「起動パッド」が開きます。
「Access Manager」で、「認証スキーム」をクリックし、「認証スキームの作成」ボタンをクリックします。
認証スキームの作成タブが開きます。
次のようにフォームに入力して、新しい認証スキームを作成します。
名前: MobileSSOScheme
認証レベル: 2
チャレンジ・メソッド: FORM
チャレンジ・リダイレクトURL: /oam/server/
認証モジュール: LDAP
チャレンジURL: /mobilesso?serviceDomain=
MobileServiceDomain
ここで、MobileServiceDomainは、シングル・サインオン用に構成されるドメインの名前です。
コンテキスト・タイプ: customWar
コンテキストの値: /oic_rest
Oracle Access Management管理コンソールで、次の手順を実行します。
アプリケーション・ドメインで新しい認証スキームを作成します。
認証スキーム: MobileSSOScheme
(MobileSSOSchemeは、手順1で作成されたスキームです。)
/mobileapp
などのHTTPリソースを作成し、作成された認証スキーム(MobileSSOScheme)を使用してそのリソースを保護します。これは、モバイルWebブラウザ(iOS用モバイル版Safari)からアクセスでき、WebGateによって保護されるURIです。
IDM Mobile SDKは、双方向SSL相互認証をサポートします。サーバーのアイデンティティを検証するクライアントに加えて、認証サーバーが双方向SSLを実行するように構成されている場合は、サーバーはクライアントのアイデンティティを検証するためにクライアント証明書を必要とします。言い換えると、これは、サーバーがクライアントを識別して匿名アクセスを回避する追加の認証スキームです。
クライアント証明書に基づく認証(相互認証)は、ユーザー名とパスワードの方法に基づく認証より安全です。これは、パスワードには高いエントロピーがなく、総当たり攻撃に対してぜい弱だからです。また、複雑なパスワードは記憶が困難です。こうした状況では、複雑で、非対称の暗号文を使用して攻撃に対するぜい弱性を低下させる、クライアント証明書が好都合です。
IDM Mobile SDKに用意されているAPIは、SDKを介するネットワーク接続の作成時に、PKCS12エンコードされたクライアント証明書をインポートするためい使用でき、それらの証明書を使用して認証を提供できます。
次の各項では、詳細を説明します。
クライアント証明書は、モバイル・アプリケーションに実行時に提供されるべきですが、アプリケーション開発時にパッケージ化することもできます。
注意: 実行時にファイルを提供する方法の詳細は、次のリンクの「Registering the File Types Your App Supports」ページ(英語)を参照してください。 |
ファイルは、アプリケーションのみが利用できる「Documents」ディレクトリに配置されます。キーチェーンに証明書をインポートして、ファイルの削除も行うIDM Mobile SDK APIをコールする必要があります。
クライアント証明書をインポートするための次の2つのAPIは、OMCertService
クラスで利用できます。
+(void)importClientCertificateFromFile:(NSURL *)fileURL presenter:(UIViewController *)presenter delegate:(id)delegate
詳細は、9.9.1.1項「importClientCertificateFromFile:presenter:delegate:」を参照してください。
+(NSArray *) importClientCertificateFromFile:(NSURL *)fileURL password:(NSString *)password error:(NSError **)error;
詳細は、9.9.1.2項「importClientCertificateFromFile:password:error:」を参照してください。
これは証明書をインポートする非同期APIで、結果はOMCertServiceDelegate
プロトコル・メソッドを介して提供されます。
fileURLは、証明書ファイルのローカルURLです。
presenterは、IDM Mobile SDKがパスワードを収集するためにUIを提示するUIビュー・コントローラです。
delegateはOMCertServiceDelegate
オブジェクトで、その-(void)didImportClientCertificate:(NSArray *)certInfo error:(NSError *)error
メソッドがコールされます。
certInfo
オブジェクトはNSDictionaryオブジェクトのNSArrayで、インポート済クライアント・アイデンティティの各々に関する情報を含みます。
これは、証明書をインポートしてNSDictionaryオブジェクトのNSArrayを返す同期メソッドです。メソッドの実行が成功すると、これらのオブジェクトには、インポート済クライアント・アイデンティティに関する情報が含まれます。エラーが発生すると、渡されたエラー参照が移入されます。
fileURLは、証明書ファイルのローカルURLです。
passwordは、ファイルを復号化するために使用されるパスワードです。
errorは、証明書インポート時にエラーが発生する場合に移入される、NSErrorオブジェクトへの参照です。
Return Valueは、インポートが成功した場合に返される証明書情報の配列で、そうでない場合の値はNILです。返される情報はありません。
IDM Mobile SDKは、独立の認証サービスとしてクライアント証明書ベースの認証を提供します。次の手順は、スタンドアロン認証プロセスを説明したものです。
次は、スタンドアロン・クライアント証明書認証のサンプル・コードです。
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];
このコードは、クライアント証明書認証を使用してSDKを初期化します。ダウンロードが必要なアプリケーション・プロファイルはありません。ただし、OMMobileServiceDelegate
プロトコルのmobileSecurityService: didReceiveApplicationProfile:error:
メソッドがコールされます。認証プロセスは、次のサンプル・コードを使用して開始できます。
[self.mss startAuthenticationProcess:nil presenterViewController:self];
クライアント証明書のチャレンジがIDM Mobile SDKによって受信され、クライアント証明書がインストールされると、ユーザーに対して、適切なクライアント・アイデンティティを選択できる画面が表示されます。サーバーがクライアント証明書を受け入れると、認証は成功し、OMMobileServiceDelegate
プロトコルのmobileSecurityService:didFinishAuthentication:error:
メソッドがコールされます。
証明書ベースの認証は、他の認証スキームとも統合できます。認証スキームで、クライアント証明書チャレンジが発生すると、IDM Mobile SDKはインストールされている証明書のリストをユーザーに提示します。ユーザーは証明書を選択する必要があり、その後、認証は認証スキームに従って進行します。他の認証スキームのクライアント証明書認証オプションが確実に存在するようにするには、SDKの初期化時に、次の追加プロパティを追加する必要があります。
[props setObject:@"TRUE" forKey:OM_PROP_PRESENT_CLIENT_IDENTITY_ON_DEMAND];
このプロパティのデフォルト値はfalse
です。
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 |
いいえ
ただし、初期化時に値が設定されなかった場合、デフォルトは |
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 | いいえ |
OAM M&Sサーバーは、モバイルとともに使用できる次のOAuthクライアントをサポートします。
Webクライアント: 次で説明するように、これらのクライアントはOAuth GenericフローでIDM Mobile SDKを使用できます。Webベース・クライアントは信頼できるクライアントとみなされ、クライアント・シークレットを持っています。このため、認可サーバーは、リクエストするクライアントのアイデンティティを把握しています。このクライアント・タイプを使用する場合、アプリケーションは、SDK初期化時にクライアント・シークレットを渡すはずです。
モバイル・クライアント : モバイル・クライアントは、機密クライアントとみなされません。このため、これらのクライアントはいかなるクライアント・シークレットも持ちません。OAM OAuthサーバーには、エンド・ユーザーのユーザー名およびパスワードとともにデバイス要求を送信することによって、モバイル・クライアントを登録できる方法が用意されています。このフローはOAM OAuthサーバー固有です。動的クライアント登録が実行された後で、IDM Mobile SDKは、クライアント・アサーションとユーザー・アサーションを受信します(SERVER SIDE SSOが無効の場合)。以降のすべてのアクセス・トークン取得リクエストまたは他のトークン操作では、クライアント・アサーションを送信する必要があります。IDM Mobile SDKは、クライアント・アサーションのライフ・サイクルを管理し、これをクライアント・アプリケーションに返しません。
新しいトークン・タイプ | 特徴 |
---|---|
クライアント・アサーション | このトークンは、動的クライアント登録が実行された後に生成されます。このトークンは、認可サーバーに対するすべてのリクエストと一緒に送信する必要があります。サーバーはクライアント・アサーションからのリクエストまたはクライアントを識別し、同じことを検証します。クライアント・アサーションは、通常JWTトークンです。 |
ユーザー・アサーション | 動的クライアント登録にはユーザー認証が含まれるため、M&Sはクライアント・アサーションとともにユーザー・アサーションを生成します。このユーザー・アサーションは、サーバー側のユーザー・セッションをマークします。ユーザー・アサーションは、SERVER SIDE SSOが無効の場合のみ、サーバーにより返されます。
このため、クライアントまたはSDKは、ユーザー・セッションがサーバーで有効になるまでずっと、同じアサーションを使用して、リソース・アクセスのアクセス・トークンを取得できます。 また、SERVER SIDE SSOが有効の場合、SDKまたはクライアントは、すべてのリクエストに次のパラメータを追加することによって、なおもユーザー・アサーションを使用できます。
|
設定の完了後、アプリケーションは、この場合、OAuthの保護されたリソースにアクセスするアクセス・トークンを取得するための認証を実行できるようになります。認証フローは、他のフローと異なりません。
iOSでは、OMMobileSecurityServiceのstartAuthenticationProcess:nil presenterViewController:presenterが、認証プロセスを開始するために使用されます。完了後に、SDKは、OMMobileServiceDelegateの(void)mobileSecurityService: (OMMobileSecurityService *)mobileSecurityServicedidFinishAuthentication: (OMAuthenticationContext *)contexterror: (NSError *)errorをコールバックします。
認証が成功すると、コンテキストには、user_assertionのような他の補助的トークン(利用できる場合)とともに、アクセス・トークンが含まれます。また、認証が成功しなかった場合、認証コンテキストはnull.
になります。
認証のこのフローには、次の手順が含まれます。
モバイル・クライアントは通常、機密とみなされないため、サーバーはこれらのクライアントのためにいかなるシークレットも作成しません。ただし、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トークンのみを取得します。
動的クライアント登録が行われ、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プロパティが アプリケーションは、初期化プロパティ |
認可コード権限タイプ |
初期化プロパティの値はOM_OAUTH_AUTHORIZATION_CODEです。 |
3-leggedクライアント登録フローが含まれ、SDKはその中でclient_assertionのみを受け取ります。このフローでは、SDKは、初期化プロパティ 注意: アプリケーションがOM_PROP_BROWSER_MODEプロパティに |
注意: 機密クライアントの場合、クライアント・シークレットを入力する必要があります。 |
IDM Mobile SDKは、任意のOAuth2.0準拠サーバーに対する認可をサポートします。現在の実装は、次の権限タイプをサポートします。
暗黙の権限タイプ。(「クライアントID」と「認可エンドポイント」は必須)
認可コード権限タイプ。(「client_id」、「認可エンドポイント」および「トークン・エンドポイント」は必須)
リソース所有者権限タイプ。(「client_id」と「トークン・エンドポイント」は必須)
クライアント資格証明。(「client_id」と「client_secret」は必須)
アサーション。(アプリケーションは、アサーションのタイプに応じてOM_PROP_OAUTH_ASSERTION_JWT
またはOM_PROP_OAUTH_ASSERTION_SAML2
プロパティを使用して、アサーション値を提供する必要があります)
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];
注意: アプリケーションは、OMMobileSecurityServiceDelegate のdidFinishAuthentication: 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];
次の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 } }
デリゲートが実装されていない場合は、サンプル・コードの次のスニペットを使用して実装する必要があります。
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];
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)フロー
次の各項で少し詳しく説明します。
SDKをアイデンティティ・ドメイン・ヘッダー・インジェクションのために初期化する際に、次のプロパティを設定する必要があります。
OM_PROP_IDENTITY_DOMAIN_NAME
このパラメータの値には、アイデンティティ・ドメイン名が含まれる必要があります。
OM_PROP_IDENTITY_DOMAIN_NAME_IN_HEADER
これまでSDKではアイデンティティ・ドメインの前にユーザー名を付ける習慣だったため、下位互換性を維持するためにこのプロパティが導入されます。アイデンティティ・ドメインをヘッダーで渡す必要がある場合、このプロパティにtrueを渡します。
SDKをクライアント・トークンのために初期化する際に、次のプロパティを設定する必要があります。
OM_PROP_OAUTH_CLIENT_ASSERTION_JWT
クライアントJWTトークンのための値を含む必要があります。
OM_PROP_OAUTH_CLIENT_ASSERTION_SAML2
クライアントSAML2トークンのための値を含む必要があります。ただし、SIMサーバーは現在JWT Tokenのみサポートするため、このプロパティは無視できます。
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; }
IMPLICIT
およびAUTHORIZATION_CODE
の権限タイプの場合、SDKは外部または埋込みのブラウザを呼び出します。認可サーバーはブラウザにログイン・ページをロードし、エンド・ユーザーはログイン資格証明を直接、認可サーバーに送信します。RESOURCE_OWNER
、CLIENT_CREDENTIALS
、ASSERTION
およびOAM_CREDENTIAL
の各権限タイプの場合、SDKはネイティブのUIを提供してエンド・ユーザーのログイン資格証明をデフォルトで収集します。ただし、アプリケーションは、資格証明コレクションのためのカスタム・ビューまたはUIを提供するようにSDKに指示できます。詳細は、第9.13項「ログイン・ビューおよびKBAビューのカスタマイズ」を参照してください。
注意: OAuth2.0では、リソース所有者権限タイプのSDKが資格証明を収集するため、「ユーザー名のみ保存フラグ」を使用できます。詳細は9.16項「資格証明ストア・サービス(KeyChain)の使用」を参照してください。 |
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のユーザー定義パラメータには、
|
次の手順では、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サーバーによって返されるトークンを挿入します。
この項には、モバイル・シングル・サインオン・アプリケーションの作成またはアプリケーションのモバイル・シングル・サインオン・アプリケーションへの変換を開始するための情報が含まれています。モバイル・シングル・サインオン・エージェントとして機能するには、アプリケーションは他のアプリケーション(モバイルSSOクライアント)からの認証リクエストを処理するロジックを含んでいる必要があります。
次の手順に従って、SDKを初期化し構成します。
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
同じクラスに次のメソッドを追加します。
/* 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. } }
didReceiveApplicationProfile:error
メソッドに次のコードを追加します。
if (error) { _profileError = TRUE; } else { _setupDone = TRUE; } if(self.ssoRequestURL != nil && self.ssoAppBundleID != nil) { [self ssoRequestWithURL:self.ssoRequestURL fromApp:self.ssoAppBundleID]; return; }
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]; }
didFinishRegistration:error
メソッドに次のコードを追加します。
[registrationHandle retain]; [self dismissModalViewControllerAnimated:true]; [self.mobileServices sendSSOResponseWithHandles:registrationHandle error:loginError params:self.queryParams]; [registrationHandle release];
UIApplicationDelegate
のapplication: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管理者ガイド』の次のトピックを参照してください。
|
ログインおよびナレッジベース認証(KBA)情報をユーザーより取得するために、カスタム・ビューを作成できます。SDKは、必要に応じてこのビューをユーザーに表示します。それ以外の場合は、SDKはデフォルトのネイティブ・ビューを表示します。次の各項で詳しく説明します。
カスタム・ネイティブ・ビューは、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];
進行状況ビューは、ログイン画面がカスタマイズできた後に表示されます。パターンは、ログイン・ビューのカスタマイズと同様です。アプリケーションは、OMAuthProgressView
クラスの拡張およびOMAuthenticationRequest
でアプリケーションの実装のインスタンスの登録を行う必要があります。次にコード・スニペットを示します。
OMAuthenticationRequest *authReq = [[OMAuthenticationRequest alloc] init]; MyProgressView *myProgressView = [[MyProgressView alloc] initWithFrame:self.view.frame]; authReq.authProgressView = myProgressView; [myProgressView release];
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
の一部として提供され、次の操作に役立ちます。
鍵ペアの生成およびキー・チェーンへの保存
キー・チェーン内の鍵に対する署名および検証操作
キー・チェーン内の鍵に対するラップおよびアンラップ操作
キー・チェーンからの公開鍵の抽出
キー・チェーン内の鍵ペアの削除
Mobile and Social iOSクライアントSDKは、ユーザー資格証明を安全に格納し、それをユーザー操作の有無にかかわらずログイン・サーバーに対して再生できるAPIを提供します。この機能をセキュリティが極端に重要ではないアプリケーションにデプロイすると、ユーザーが簡単にログインできるようになります。この機能には、バージョン11.1.2.2.0以上のMobile and SocialクライアントSDKが必要です。
ユーザーがログイン画面上にある最大3つまでのオプション・ボックスから1つを選択すると、この機能を使用できます。(アプリケーションで、1つ、2つまたは3つ全部のオプションを有効化することを選択できます。)2つ以上のオプションが選択された場合、優先度の高い機能が優先されます。オプションの優先度は、次のとおりです。
そのため、たとえば自動ログインおよび資格証明の保存が選択されている場合、自動ログインが優先されます。
次は、3つのオプションの説明です。
自動ログイン - Mobile and Social iOSクライアントSDKがユーザーの資格証明を安全にキャッシュし、ログイン画面に自動的に提供します。このオプションが指定されると、ログインの際にユーザーの操作が必要なくなります。認証を行う間、ユーザーにフィードバックを提供する進行状況画面が表示されます。
資格証明の保存 - Mobile and Social iOSクライアントSDKがユーザーの資格証明を安全にキャッシュし、自動的にログイン画面のユーザー名およびパスワード・フィールドを設定します。ユーザーは、ログイン・ボタンをクリックして認証プロセスを進める必要があります。必要に応じて、ユーザーは異なる資格証明を入力したり、オプション・ボックスを変更することができます。
ユーザー名のみ保存 - Mobile and Social iOSクライアントSDKがユーザー名を安全にキャッシュし、自動的にログイン画面のユーザー名を設定します。ユーザーは、パスワードを入力してログイン・ボタンをクリックし、認証プロセスを進める必要があります。必要に応じて、ユーザーは異なるユーザー名を入力したり、オプション・ボックスを変更することができます。
詳細は、次の項で説明されています。
これは、デプロイにあたってサーバー構成を必要としないクライアント側のみの機能です。前述の機能を有効化するには、次のSDK構成パラメータをコードに追加する必要があります。
mss
オブジェクトの初期化中に次のプロパティを渡して、オプション・ボックスにデフォルト値を事前移入します。trueにできるのは、次のオプションの中の1つのみです。すべてのオプション・ボックスがfalseの場合、ログイン画面のすべてのオプション・ボックスが空になります。
表9-5 オプション・ボックスのデフォルト値設定に使用する構成パラメータ
パラメータ | 説明 |
---|---|
|
「自動ログイン」オプション・ボックスのデフォルト値を指定するブール値 |
|
「資格証明の保存」オプション・ボックスのデフォルト値を指定するブール値 |
|
「ユーザー名のみ保存」オプション・ボックスのデフォルト値を指定するブール値 |
オプション・ボックスの状態をキーと値のペアとして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-6 資格証明プロパティへのアクセスに使用するデータ・ディクショナリのキー
キー | 説明 |
---|---|
|
自動ログイン機能を有効化/無効化するブール値 |
|
資格証明の保存機能を有効化/無効化するブール値 |
|
ユーザー名のみ保存機能を有効化/無効化するブール値 |
|
自動ログイン機能に関するユーザーのプリファレンスを指定するブール値 |
|
資格証明の保存機能に関するユーザーのプリファレンスを指定するブール値 |
|
ユーザー名のみ保存機能に関するユーザーのプリファレンスを指定するブール値 |
|
ユーザーのユーザー名を指定する文字列値 |
|
ユーザーのパスワードを指定する文字列値 |
資格証明ストア・サービスでは、iOS Keychain Servicesを使用して重要なデータを保存および取得するためのAPIを提供します。
OMMobileSecurityService
オブジェクトから開始して、OMCredentialStore
ハンドルを取得します。OMCredentialStore
を使用して、KeyChainItem
.から重要なデータへの書込みおよび重要なデータの取得を行います。
次の各項には、OMCredentialStore
の使用方法を示すコード・スニペットが記載されています。
この例では、KeyChainItem
で指定されたキーにユーザー名とパスワードを追加します。
- (void)addCredential:(NSString *)userName pwd:(NSString *)password url:(NSString *)key;
これは前のaddCredential
機能のバリエーションです。
- (void)addCredential:(NSString *)userName pwd:(NSString *)password tenantName:(NSString *)tenantName url:(NSString *)key;
この例では、KeyChainItemから資格証明を削除します。真の削除操作はないため、かわりに、ユーザー名およびパスワードがnullに設定されます。
- (void)deleteCredential:(NSString*)key;
この例では、ユーザー名とパスワードが指定されると、ユーザーおよびキーの値を更新します。真の更新操作はないため、updateCredential
はaddCredential
をコールします。
- (void)updateCredential:(NSString*)userName pwd:(NSString*)password url:(NSString*)key;
これは前のupdateCredential
機能のバリエーションです。
- (void)updateCredential:(NSString *)userName pwd:(NSString *)password tenantName:(NSString *)tenantName url:(NSString *)key;
この例では、指定のキーのユーザー名、パスワードおよびテナント名を取得します。
- (OMCredential *)getCredential:(NSString*)key;
この例では、KeyChainItem
でプロパティを格納します。
- (void)storeProperty: (NSString *)property withKey: (NSString *)key;
これは前のstoreProperty
機能のバリエーションです。
- (void)storeProperty: (NSString *)property withKey: (NSString *)key withLabel: (NSString *)label withDescription: (NSString *)description;
KeyChainItem
内の指定したプロパティ・ストアを削除します。プロパティとともに保存されているすべての詳細が削除されます。
- (NSError *)deletePropertyWithKey:(NSString *)key
KeyChainItem
からプロパティを返します。
- (id)getPropertyForKey:(NSString *)key