Oracle® Fusion Middleware Oracle Access Management開発者ガイド

11g リリース2 (11.1.2)

B69537-02(原本部品番号:E27134-03)

目次

例一覧

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

Oracle Access Managementの新機能

- ガイド変更: 11gリリース2 (11.1.2) 2012年11月ライブラリの更新

- 11gリリース2 (11.1.2)の新機能

- 11g リリース1(11.1.1)の新機能

- 製品およびコンポーネントの名前の変更

第I部 概要

1 Oracle Access Managementコンポーネントによる開発

- 1.1 Oracle Access Managementについて

- 1.2 Access Managerについて

- 1.3 Mobile and Socialについて

- 1.4 Identity Federationについて

- 1.5 Security Token Serviceについて

- 1.6 システム要件と動作保証情報

第II部 Access Managerによる開発

2 アクセス・クライアントの開発

- 2.1 アクセス・クライアントの開発について

- 2.1.1 Access SDKおよびAPIについて

- 2.1.2 Access SDKのインストールについて

- 2.1.3 カスタム・アクセス・クライアントについて

- 2.1.3.1 カスタム・アクセス・クライアントを作成するケース

- 2.1.3.2 アクセス・クライアントのアーキテクチャ

- 2.1.4 アクセス・クライアントのリクエスト処理について

- 2.2 アクセス・クライアントの開発

- 2.2.1 アクセス・クライアントの構造

- 2.2.2 アクセス・クライアントの一般的な実行フロー

- 2.2.3 サンプル・コード: 簡単なアクセス・クライアント

- 2.2.4 注釈付きサンプル・コード: 簡単なアクセス・クライアント

- 2.2.5 サンプル・コード: Javaログイン・サーブレット

- 2.2.6 注釈付きサンプル・コード: Javaログイン・サーブレット

- 2.2.7 サンプル・コード: その他のメソッド

- 2.2.8 注釈付きサンプル・コード: その他のメソッド

- 2.2.9 サンプル・コード: Javaでの証明書ベース認証

- 2.3 メッセージ、例外およびロギング

- 2.3.1 メッセージ

- 2.3.2 例外

- 2.3.3 ロギング

- 2.4 アクセス・クライアント・プログラムの構築

- 2.4.1 開発環境の設定

- 2.4.2 新規アクセス・クライアント・プログラムのコンパイル

- 2.5 アクセス・クライアントの構成およびデプロイ

- 2.5.1 タスクの概要: カスタム・アクセス・クライアントの構成とデプロイ

- 2.5.2 構成要件

- 2.5.3 必要な構成ファイルの生成

- 2.5.4 SSL証明書およびキー・ファイル

- 2.5.4.1 簡易トランスポート・セキュリティ・モード

- 2.5.4.2 証明書トランスポート・セキュリティ・モード

- 2.6 互換性: 11gと10gのAccess SDKおよびAPI

- 2.6.1 11g Access SDKの互換性

- 2.6.2 10g JNI ASDKと11g Access SDKの互換性

- 2.6.3 非推奨: 10g JNI ASDK

- 2.7 旧アプリケーションの移行またはコードの変換

- 2.7.1 開発およびランタイム環境の変更

- 2.7.2 アプリケーションの移行

- 2.7.2.1 移行に固有の構成

- 2.7.3 コードの変換

- 2.7.3.1 10g JNI ASDKと11g Access SDKの相違点の理解

- 2.7.3.2 コードの変換

- 2.8 ベスト・プラクティス

- 2.8.1 アクセス・クライアントでの問題の回避

- 2.8.1.1 スレッド・セーフ・コード

- 2.8.2 アクセス・クライアントに関する問題の特定と解決

- 2.8.3 環境に関する問題の解決

- 2.8.3.1 Java EEコンテナ

- 2.8.3.2 Oracle WebLogic Server

- 2.8.3.3 その他のアプリケーション・サーバー

- 2.8.4 高負荷環境のためのチューニング

3 カスタム認証プラグインの開発

- 3.1 認証プラグインの概要

- 3.1.1 カスタム・プラグインのライフ・サイクルについて

- 3.1.2 計画、認証モデルおよびプラグインについて

- 3.2 マルチステップ認証フレームワークの概要

- 3.2.1 マルチステップ・フレームワークについて

- 3.2.2 プロセスの概要: マルチステップ認証

- 3.2.3 PAUSE状態について

- 3.2.4 収集される情報について

- 3.2.4.1 UserContextData

- 3.2.4.2 UserActionContext

- 3.2.4.3 UserAction

- 3.2.4.4 UserActionMetaData

- 3.3 プラグイン・インタフェースの概要

- 3.3.1 プラグイン・インタフェースについて

- 3.3.1.1 GenericPluginService

- 3.3.1.2 AuthnPluginService

- 3.3.2 プラグイン階層について

- 3.4 サンプル・コード: カスタム・データベース・ユーザー認証プラグイン

- 3.4.1 サンプル・コード: データベース・ユーザー認証プラグイン

- 3.4.2 プラグイン構成メタデータ要件のサンプル

- 3.4.3 プラグインのサンプル・マニフェスト・ファイル

- 3.4.4 プラグインJARファイル構造

- 3.5 認証プラグインの開発

- 3.5.1 カスタム認証プラグインの記述について

- 3.5.2 カスタム認証プラグインの記述

- 3.5.3 認証プラグインのエラー・コード

- 3.5.4 カスタム認証プラグインのコンパイルに必要なJARファイル

4 カスタム・ページの開発

- 4.1 カスタム・ページの概要

- 4.1.1 カスタム・ページの開発について

- 4.1.2 認証とカスタム・ページについて

- 4.2 カスタム・ログイン・ページの開発

- 4.2.1 フォームベース・ログイン・ページの作成

- 4.2.1.1 OAM_REQトークンを返す

- 4.2.1.2 エンド・ポイントを返す

- 4.2.2 ページ・リダイレクション・プロセス

- 4.3 カスタム・エラー・ページの開発

- 4.3.1 プロセスの概要: カスタム・エラー・ページの作成

- 4.3.2 標準エラー・コード

- 4.3.3 デフォルト・ページの位置

- 4.3.4 セキュリティ・レベルの構成

- 4.3.5 パスワード・ポリシー検証エラー・コード

- 4.3.6 セカンダリ・エラー・メッセージの伝播

- 4.3.7 エラー・コードの取得

- 4.3.7.1 コード・サンプル

- 4.3.7.2 パスワード・ポリシー・エラー・コードの取得

- 4.3.7.3 パスワード・ポリシー・ルール

- 4.3.8 エラー・データ・ソースの一覧

- 4.4 外部資格証明コレクタを使用した開発

- 4.4.1 外部資格証明コレクタの考慮事項

- 4.4.2 プロセスの概要: DCCを使用したフォームベース・ログイン・ページの作成

- 4.5 カスタム・ログイン・ページのデプロイ

- 4.6 プログラムによる認証

- 4.6.1 mod_ossoエージェントの使用

- 4.6.1.1 OSSO 10g

- 4.6.1.2 11g OAMサーバー

- 4.6.1.3 プロセスの概要: プログラムによるクライアントの開発

- 4.6.2 要求していないPOSTの使用

- 4.7 認証後のカスタムOSSO Cookieの設定

5 ポリシー・オブジェクトの管理

- 5.1 ポリシー管理APIの概要

- 5.1.1 Access Managerポリシー・モデル

- 5.1.2 セキュリティ・モデル

- 5.1.3 リソースURL

- 5.1.4 URLリソースおよびサポートされているHTTPメソッド

- 5.1.5 エラー処理

- 5.2 互換性

- 5.3 ポリシー・オブジェクトの管理

- 5.3.1 HTTPメソッド

- 5.3.2 メディア・タイプ

- 5.3.3 リソース一覧

- 5.4 例

- 5.4.1 アプリケーション・ドメインの取得

- 5.4.2 新しいアプリケーション・ドメインの作成

- 5.4.3 すべての認証スキームの取得

- 5.4.4 新しい認証スキームの作成

- 5.4.5 特定の認証スキームの取得

- 5.4.6 アプリケーション・ドメイン内のすべてのリソースの取得

- 5.4.7 アプリケーション・ドメイン内のリソースの作成

- 5.4.8 アプリケーション・ドメイン内のすべてのポリシーの取得

- 5.5 クライアント・ツール

6 偽装を管理するアプリケーションの開発

- 6.1 偽装について

- 6.1.1 偽装の概念と用語

- 6.1.2 偽装権限付与の構文

- 6.1.3 SSOサービスを使用した偽装トリガーの呼出し

- 6.1.4 API抽象化を使用しない偽装のトリガー方法

- 6.1.5 偽装セッション中のインパーソネータ・アイデンティティの伝達

- 6.2 偽装サポートの構成

- 6.2.1 oam-config.xmlによる偽装の構成

- 6.2.2 idmConfigToolによる偽装の構成

- 6.2.3 認証スキームの構成

- 6.3 SSOログインおよび偽装のテスト

第III部 Mobile and Socialによる開発

7 Mobile and SocialクライアントSDKを使用したアプリケーションの開発

- 7.1 作業前の準備

- 7.2 モバイル・サービス・アプリケーションの開発の概要

- 7.2.1 ユーザー・プロファイル・サービスを使用したアプリケーションの構築

- 7.3 インターネット・アイデンティティ・サービス・アプリケーションの開発の概要

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

- 8.1 概要

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

- 8.2.1 開始

- 8.2.2 クライアント・トークンの作成

- 8.2.3 ユーザー・トークンの作成

- 8.2.4 アクセス・トークンの作成

- 8.2.5 クライアント・トークンの検証

- 8.2.6 ユーザー・トークンの検証

- 8.2.7 ユーザー・トークンを使用したユーザー参照の実行

- 8.2.8 クライアント・トークンの削除

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

- 8.3.1 ユーザーの使用

- 8.3.1.1 設定

- 8.3.1.2 ユーザーの作成

- 8.3.1.3 ユーザーの読取り

- 8.3.1.4 ユーザーの更新

- 8.3.1.5 ユーザーの削除

- 8.3.1.6 ユーザーの検索

- 8.3.1.7 ユーザー属性の取得と結果の検証

- 8.3.2 グループの使用

- 8.3.2.1 設定

- 8.3.2.2 グループの作成

- 8.3.2.3 グループの読取り

- 8.3.2.4 グループの更新

- 8.3.2.5 グループの削除

- 8.3.2.6 グループの検索

- 8.3.2.7 ページング・サポートを使用したグループの検索

- 8.3.2.8 グループへのユーザーの追加

- 8.3.2.9 グループ・メンバーシップ情報の取得

- 8.3.2.10 グループ内のメンバーの検索

- 8.3.2.11 グループからのメンバーの削除

- 8.3.2.12 グループ所有権の割当て

- 8.3.2.13 グループ所有権情報の取得

- 8.3.2.14 グループ所有者の検索

- 8.3.2.15 グループ所有者の削除

- 8.3.2.16 addMemberOfを使用したグループへのグループ(またはユーザー)の追加

- 8.3.2.17 getMemberOfを使用したグループ・メンバーシップの取得

- 8.3.2.18 searchMemberOfを使用したグループの検索

- 8.3.2.19 deleteMemberOfを使用したグループからのグループ(またはユーザー)の削除

- 8.3.2.20 addOwnerOfを使用したグループ所有権の割当て

- 8.3.2.21 getOwnerOfを使用したグループ所有権情報の取得

- 8.3.2.22 searchOwnerOfを使用したグループ所有者の検索

- 8.3.2.23 deleteOwnerOfを使用したグループからのグループ(またはユーザー)の削除

- 8.3.3 組織の使用

- 8.3.3.1 設定

- 8.3.3.2 ヘルパー・ユーティリティの作成

- 8.3.3.3 マネージャの検証

- 8.3.3.4 直属の部下の検証

- 8.3.3.5 scope=all機能を使用したすべての部下の取得

- 8.3.3.6 Scope=toTop機能を使用したマネージャ連鎖の取得

- 8.3.3.7 プリフェッチ機能を使用した部下の詳細の取得

- 8.3.3.8 プリフェッチ機能を使用したマネージャ・データの取得

- 8.3.3.9 マネージャからの部下の削除

- 8.3.4 ページング・サポートを使用した検索

- 8.4 JavaクライアントSDKを使用した認可サービスの起動

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

- 9.1 iOSクライアントSDKの概要

- 9.1.1 XCodeでのiOSクライアントSDKの使用に関する概要

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

- 9.3 iOSクライアントSDKを使用したHTTP Basic認証の起動

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

- 9.4.1 ユーザーの使用

- 9.4.2 グループの使用

- 9.4.3 組織の使用

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

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

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

- 9.7 Webgateで保護されたリソースの起動

- 9.7.1 OMRESTRequest APIフローの理解

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

10 インターネット・アイデンティティ・サービス・クライアントSDKを使用したアプリケーションの開発

- 10.1 作業前の準備

- 10.2 インターネット・アイデンティティ・サービス・アプリケーションの開発の概要

- 10.2.1 インターネット・アイデンティティ・サービス・クライアントSDKについて

- 10.3 アプリケーション用のアイデンティティ・プロバイダのリストの取得

- 10.4 インターネット・アイデンティティ・サービスとサーバー上で実行されるWebアプリケーションとの統合

- 10.4.1 Mobile and Socialサーバー上のWebアプリケーションの定義

- 10.4.2 インターネット・アイデンティティ・サービス・ログイン・ページとWebアプリケーションとの統合

- 10.4.2.1 事前作成されたインターネット・アイデンティティ・サービス・ログイン・ページの追加

- 10.4.2.2 カスタム・ログイン・ページの構築

- 10.4.3 ユーザー登録の処理

- 10.4.3.1 カスタム・ユーザー登録ページの使用方法

- 10.4.3.2 Mobile and Social組込みユーザー登録ページの使用方法

- 10.4.4 最終的な返信レスポンスの処理

- 10.4.4.1 Secured Attribute Exchange (SAE)トークン・レスポンス属性

- 10.5 Access Managerで保護されているWebアプリケーションとの統合

- 10.6 インターネット・アイデンティティ・サービスとモバイル・アプリケーションとの統合

- 10.6.1 Mobile and Socialサーバー上のモバイル・アプリケーションの定義

11 Mobile and Socialサーバーの機能の拡張

- 11.1 モバイル・サービス用の新しい認証サービス・プロバイダの作成

- 11.1.1 カスタム認証サービス・プロバイダの開発

- 11.1.1.1 TokenServiceインタフェースの実装

- 11.1.1.2 MobileCompositeTokenServiceProviderの拡張

- 11.1.2 カスタム認証サービス・プロバイダの構築

- 11.1.2.1 カスタム認証サービス・プロバイダを構築するには

- 11.1.3 カスタム認証サービス・プロバイダのデプロイ

- 11.1.3.1 カスタム認証サービス・プロバイダをデプロイするには

- 11.2 インターネット・アイデンティティ・サービス用の新しいアイデンティティ・サービス・プロバイダの作成

- 11.2.1 カスタム・アイデンティティ・サービス・プロバイダの開発

- 11.2.2 カスタム・アイデンティティ・サービス・プロバイダの構築

- 11.2.2.1 カスタム・アイデンティティ・サービス・プロバイダを構築するには

- 11.2.3 カスタム・アイデンティティ・サービス・プロバイダのデプロイ

- 11.2.3.1 カスタム・アイデンティティ・サービス・プロバイダをデプロイするには

12 cURLによるMobile and SocialのRESTコールの送信

- リクエストおよびレスポンス・ヘッダーの属性名リファレンス

- X-IDAAS-REST-VERSION

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- 説明

- X-IDAAS-SERVICEDOMAIN

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- 説明

- X-IDAAS-REST-AUTHORIZATION

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- 説明

- AUTHORIZATION

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- 説明

- X-Idaas-Rest-Subject-Type

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- 説明

- X-Idaas-Rest-Subject-Value

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- X-Idaas-Rest-Subject

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- X-Idaas-Rest-Subject-Username

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- X-Idaas-Rest-Subject-Password

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- X-Idaas-Rest-New-Token-Type-To-Create

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- 説明

- X-Idaas-Rest-Application-Context

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- X-Idaas-Rest-Application-Resource

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- X-Idaas-Rest-User-Principal

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- X-Idaas-Rest-Provider-Type

- この属性の使用場所

- 属性タイプ

- cURLサンプル・コマンド

- Mobile and Social RESTセキュリティ・フィルタ・リファレンス

- UIDPASSWORDによる認可

- cURLコマンド

- 予想される出力

- 説明

- HTTP Basicによる認可

- cURLコマンド

- 予想される出力

- 説明

- Access Managerトークンによる認可

- cURLコマンド

- 予想される出力

- 説明

- モバイル・サービスRESTリファレンス: 認証および許可

- クライアント・トークンの認証

- cURLコマンド

- 予想される出力

- 説明

- ユーザー・トークンの認証

- cURLコマンド

- 予想される出力

- 説明

- アクセス・トークンの認証

- cURLコマンド

- 予想される出力

- 説明

- (クライアント)トークンの取得または検証

- cURLコマンド

- 予想される出力

- 説明

- 許可

- cURLコマンド

- 予想される出力

- 説明

- モバイル・サービスRESTリファレンス: モバイル・シングル・サインオン・トークンのコマンド

- モバイル・シングル・サインオン・エージェント・アプリケーションのためのクライアント登録ハンドルの作成

- cURLコマンド

- 予想される出力

- 説明

- モバイル・シングル・サインオン・クライアント・アプリケーションのためのクライアント登録ハンドルの作成(ユーザー名のシナリオ)

- cURLコマンド

- 予想される出力

- 説明

- モバイル・シングル・サインオン・クライアント・アプリケーションのためのクライアント登録ハンドルの作成(ユーザー・トークンのシナリオ)

- cURLコマンド

- 予想される出力

- 説明

- ユーザー・トークンのリクエストの作成

- cURLコマンド

- 予想される出力

- 説明

- アクセス・トークンのリクエストの作成

- cURLコマンド

- 予想される出力

- 説明

- シングル・サインオン・エージェントによる独自に使用するアクセス・トークンを作成するためのリクエスト

- cURLコマンド

- 予想される出力

- 説明

- クライアント登録ハンドルの検証

- cURLコマンド

- 予想される出力

- 説明

- モバイル・サービスRESTリファレンス: ユーザー・プロファイル・サービスのコマンド

- 基本的なユーザー操作

- ユーザーの作成

- ユーザーの読取り

- ユーザーの更新

- ユーザーの削除

- 基本的なグループ操作

- グループの作成

- グループの読取り

- グループの更新

- グループの削除

- memberOf関係の操作

- memberOf関係の作成

- memberOf関係の読取り

- memberOf関係の削除

- members関係の操作

- members関係の作成

- members関係の読取り

- members関係の削除

- manager関係の操作

- manager関係の作成

- manager関係の読取り

- manager関係の削除

- reports関係の操作

- reports関係の作成

- reports関係の読取り

- reports関係の削除

- ownerOf関係の操作

- ownerOf関係の作成

- ownerOf関係の読取り

- ownerOf関係の削除

- personOwner関係の操作

- personOwner関係の作成

- personOwner関係の読取り

- personOwner関係の削除

- groupOwner関係の操作

- groupOwner関係の作成

- groupOwner関係の読取り

- groupOwner関係の削除

- groupOwnerOf関係の操作

- groupOwnerOf関係の作成

- groupOwnerOf関係の読取り

- groupOwnerOf関係の削除

- groupMemberOf関係の操作

- groupMemberOf関係の作成

- groupMemberOf関係の読取り

- groupMemberOf関係の削除

- groupMembers関係の操作

- groupMembers関係の作成

- groupMembers関係の読取り

- groupMembers関係の削除

- ユーザーの検索操作

- ユーザーの検索

- PageSizeおよびPagePosによるユーザーの検索

- 検索パラメータがあり、検索フィルタがないユーザーの検索

- 検索フィルタによるユーザーの検索

- グループの検索

- 関係の検索

- attrsToFetch問合せパラメータ機能

- attrsToFetchによるユーザーの読取り

- attrsToFetchによるグループの検索

- attrsToFetchによる関係の検索

- prefetch問合せパラメータ機能

- prefetchによるユーザーの読取り

- scope問合せパラメータ機能

- scopeによる関係の検索

- 実例

- モバイルSSOエージェントによるクライアント登録ハンドルのリクエスト(クライアント・トークン)

- ビジネス・アプリケーションのかわりのモバイルSSOエージェントによるクライアント登録ハンドルのリクエスト

- ユーザー・トークン・リクエスト

- アクセス・トークン・リクエスト

- Access Managerマスター・トークン認証

- KBAレスポンスによるデバイス登録リクエスト

第IV部 Identity Federationによる開発

13 カスタム・ユーザー・プロビジョニング・プラグインの開発

- 13.1 ユーザー・プロビジョニング・プラグインの概要

- 13.2 プラグイン・インタフェースの概要

- 13.3 サンプル・コード: カスタム・ユーザー・プロビジョニング・プラグイン

- 13.4 ユーザー・プロビジョニング・プラグインの開発

- 13.4.1 プロセスの概要: カスタム・プラグインの開発

- 13.4.2 プラグインのコンパイルに必要なファイル

第V部 Security Token Serviceによる開発

14 カスタム・トークン・モジュールの開発

- 14.1 Oracle Security Token Serviceカスタム・トークン・モジュール・クラスの概要

- 14.2 TokenValidatorModuleクラスの記述

- 14.2.1 TokenValidatorModuleクラスの記述について

- 14.2.2 TokenValidatorModuleクラスの記述

- 14.3 TokenIssuanceModuleクラスの記述

- 14.3.1 TokenIssuanceModuleクラスの記述について

- 14.3.2 TokenIssuanceModuleクラスの記述

第VI部 付録

A デプロイメント固有ページの作成

- A.1 シングル・サインオン・サーバーでのデプロイメント固有ページの使用方法

- A.1.1 パスワード変更ページの動作

- A.1.1.1 パスワードが失効している場合

- A.1.1.2 パスワードが間もなく失効する場合

- A.1.1.3 猶予ログインが有効

- A.1.1.4 パスワード変更の強制

- A.2 デプロイメント固有ページの記述方法

- A.2.1 ログイン・ページのパラメータ

- A.2.2 パスワード変更ページのパラメータ

- A.3 ページのエラー・コード

- A.3.1 OSSO 10gログイン・ページのエラー・コード

- A.4 グローバリゼーション・サポートの追加

- A.4.1 ページに表示する言語の決定

- A.4.1.1 Accept-Languageヘッダーを使用したページの決定

- A.4.1.2 ページ・ロジックを使用した言語の決定

- A.4.2 ページのレンダリング

- A.5 デプロイメント固有ページに関するガイドライン

- A.6 デプロイメント固有ページの例

- A.6.1 カスタム・クラスの使用

- A.7 外部アプリケーションの追加

例一覧

- 2-1 JAccessClient.java

- 2-2 Javaログイン・サーブレットの例

- 2-3 access_test_java.java

- 3-1 XMLメタデータ: データベース・ユーザー認証プラグイン

- 3-2 サンプル・マニフェスト・ファイル

- 3-3 カスタム認証プラグインのエラー・コード

- 4-1 リソース・バンドル・コード

- 4-2 エラー・コード・ページ

- 6-1 SsoService APIを使用してトリガー・メカニズムを抽象化するために必要なメソッド

- 6-2 SsoService APIトリガーの簡略例

- 6-3 imp.begin.urとimp.end.urlの変更を伴うjps-config.xml

- 6-4 API抽象化を使用しない偽装のトリガー方法

- 6-5 元のインパーソネータ・セッションへの復帰

- 6-6 oam-config.xmlでの偽装機能の有効化

- 13-1 UserProvisioning.javaのサンプル

- 13-2 UserPlugin.xmlのサンプル

- 13-3 MANIFEST.MFのサンプル

- 14-1 EmailTokenValidatorModuleImpl.java

- 14-2 EmailTokenIssuanceModule.java

図一覧

- 2-1 アクセス・クライアントのアーキテクチャの詳細

- 2-2 プロセスの概要: リソース・リクエストの処理

- 2-3 フォーム・ベースのアプリケーションのプロセス・フロー

- 3-1 カスタム・プラグインのデプロイ・ワークフロー

- 3-2 認証モデルおよびプラグイン

- 3-3 プラグイン・パッケージ階層

- 3-4 プラグイン・クラス階層

- 3-5 プラグイン・インタフェース階層

- 3-6 プラグイン注釈タイプ階層

- 3-7 プラグイン列挙階層

- 3-8 データベース・ユーザー認証プラグイン・パート1

- 3-9 データベース・ユーザー認証プラグイン・パート2

- 3-10 データベース・ユーザー認証プラグイン・パート3

- 3-11 XSD構成データ: データベース・ユーザー認証プラグイン

- 4-1 認証リクエスト・フロー

- 5-1 ポリシー・モデル

- 5-2 ポリシー・コンテンツ

- 10-1 事前作成されたローカル・ログイン・サポートのあるログイン画面

- 10-2 事前作成されたローカル・ログイン・サポートのないログイン画面

- 10-3 Mobile and Social組込みユーザー登録ページ

表一覧

- 2-1 11g Access SDKの機能

- 2-2 アクセス・クライアントのバリエーション

- 2-3 比較: 11gおよび10g Access APIクラス

- 2-4 パッケージの相違点: com.oblix.accessとoracle.security.am.asdk

- 3-1 プラグイン・ライフサイクルの状態

- 3-2 リクエスト方法の比較

- 3-3 必要なプラグイン・メソッド

- 4-1 エラー情報の種類

- 4-2 標準エラー・コードおよびメッセージ

- 4-3 セキュリティ・レベル別のエラー状態マッピング

- 4-4 パスワード検証エラー・コード

- 4-5 認証プラグインのエラー・データ・ソース

- 5-1 ポリシー・オブジェクト

- 5-2 リソースURL

- 5-3 エラー状態とHTTPリターン・コード

- 5-4 ポリシー・オブジェクトを管理するためのメソッド

- 5-5 Access Managerポリシー・リソースの一覧

- 6-1 偽装の用語

- 6-2 アイデンティティ情報のためのヘッダー

- 7-1 JavaおよびiOSモバイル・サービス・クライアントSDKの特徴と機能

- 10-1 RPClientクラスで必要とされる構成プロパティ

- 10-2 Secured Attribute Exchange (SAE)トークン・レスポンス属性

- A-1 シングル・サインオン・サーバーによりログイン・ページに送信されるログイン・ページ・パラメータ

- A-2 ページからシングル・サインオン・サーバーに送信されるログイン・ページのパラメータ

- A-3 ページに送信されるパスワード変更パラメータ

- A-4 ページにより送信されるパスワード変更ページのパラメータ

- A-5 ログイン・ページのエラー・コード

- A-6 外部アプリケーション・ログイン

- A-7 認証方式

- A-8 追加フィールド

Oracle® Fusion Middleware

Oracle Access Management開発者ガイド

11g リリース2 (11.1.2)

B69537-02(原本部品番号:E27134-03)

2012年11月

このガイドでは、Oracle Access Managementで使用できるSDKおよびAPIを使用して、カスタムのアプリケーションおよびプラグインを記述し、アクセス管理機能をプログラムにより拡張する方法について説明しています。

Oracle Fusion Middleware Oracle Access Management開発者ガイド 11g リリース2 (11.1.2)

B69537-02

Copyright (C) 2000, 2012, Oracle and/or its affiliates.All rights reserved.

原本著者: Trish Fuzesy

原本主協力者:  Kevin Kessler、Michael Teger

原本協力者:  Toby Close、Vadim Lander、Peter Povinec、Umesh Waghode、Jeremy Banford、Sreehari Narasimhaiah

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle およびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

はじめに

このガイドでは、Oracle Access Managementで提供されるSDKおよびAPIを使用して、カスタムのアプリケーションおよびプラグインを記述し、アクセス管理機能をプログラムにより拡張する方法について説明しています。

ここでは、次の項目について説明します。

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

対象読者

このドキュメントは、Oracle Access Managementに精通している開発者を対象としています。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

関連ドキュメント

詳細は、Oracle Fusion Middleware 11gリリース2(11.1.2)のドキュメント・セットに含まれる次のドキュメントを参照してください。

- 『Oracle Fusion Middleware Oracle Access Management管理者ガイド』

- Oracle Fusion Middleware Oracle Access Management Security Token Service Java APIリファレンス

- Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンス

- Oracle Fusion Middleware Oracle Access Management Access Manager拡張性Java APIリファレンス

- Oracle Fusion Middleware Oracle Access Management Identity Federationユーザー・プロビジョニング・プラグインJava APIリファレンス

- Oracle Fusion Middleware Oracle Access Management Mobile and Social Java APIリファレンス

- Oracle Fusion Middleware WebLogic Scripting Toolのコマンド・リファレンス

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

Oracle Access Managementの新機能

この項では、Oracle Access Management 11gで使用できる新機能について説明します。

次の各項で新機能と変更点について説明します。

- ガイド変更: 11gリリース2 (11.1.2) 2012年11月ライブラリの更新

- 11gリリース2 (11.1.2)の新機能

- 11g リリース1(11.1.1)の新機能

- 製品およびコンポーネントの名前の変更

ガイド変更: 11gリリース2 (11.1.2) 2012年11月ライブラリの更新

このガイド(部品番号B69537-02)は、いくつかの部分が更新されています。次の表に、追加または変更された項を示します。

- マルチステップ認証プラグインの開発に関する情報が改訂され、コード例が追加されています。第3章を参照してください。

11gリリース2 (11.1.2)の新機能

Oracle Access Management 11gリリース2 (11.1.2)には、次のコンポーネントが含まれています。新機能については、このガイドの次の各項で説明しています。

- Oracle Access Management Access Manager

- Oracle Access Management Mobile and Social

- Oracle Access Management Identity Federation

- Oracle Access Management Security Token Service

Oracle Access Management Access Manager

このリリースでは、Access Manager Accessソフトウェア開発キット(SDK)に次の機能が追加されました。

- 11g Cookieのサポート
SDKで開発するアクセス・クライアントでは、11gエージェント・プロファイルを使用できます。これにより、OAMサーバーは、このアクセス・クライアント専用に生成された秘密鍵を使用してトークンを暗号化できます。詳細は、第2章を参照してください。

- APIベースの初期化
SDKで開発するアクセス・クライアントは、独自の構成ストアまたはメカニズムのブートストラップ構成を提供することによって初期化できます。詳細は、第2章を参照してください。

- Web SSOエージェントの開発用インタフェース
WebSSOエージェントをAccess Managerと連動できる簡単なインタフェースが用意されています。詳細は、第2章を参照してください。

次のAccess Manager APIが追加されました。

- ポリシー管理API
Oracle Policy Administration APIは、Representational State Transfer(REST)インタフェースをサポートしており、OAMポリシー・オブジェクトをRESTfulなリソースとして管理できます。ポリシー管理APIを使用して、ポリシー・オブジェクトの作成、読取り、更新および削除(CRUD)の各操作ができます。詳細は、第5章を参照してください。

Oracle Access Management Mobile and Social

Mobile and SocialはOracle Access Managementの新しいサービスで、保護されているリソースへのアクセスを要求するユーザーと、リソースを保護するバックエンドのAccess ManagementサービスおよびIdentity Managementサービスの間の橋渡しの役割を果たします。Mobile and Socialには簡易なクライアント・ライブラリが用意されており、開発者はこれを使用して、機能豊富な認証、認可およびアイデンティティ機能を登録済アプリケーションに簡単に追加できます。バックエンドのMobile and Socialサーバーのプラガブルなアーキテクチャにより、システム管理者は、ユーザーがインストールしたソフトウェアを更新しなくても、アイデンティティ管理サービスおよびアクセス管理サービスを追加、変更および削除できます。Mobile and Socialには、iOSデバイス用とJava用のSDKが個別に用意されています。iOSまたはJava SDKを使用できないプラットフォームまたはデバイスでアプリケーションを開発する場合は、Mobile and SocialサーバーにMobile and Social RESTコールを直接送信するコードを記述できます。Mobile and Socialの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。Mobile and Social SDKを使用したアプリケーション開発の詳細は、第III部「Mobile and Socialによる開発」を参照してください。

Oracle Access Management Identity Federation

このリリースでは、Security Token Serviceにユーザー・プロビジョニングAPIが追加されました。このAPIを使用してカスタム・ユーザー・プロビジョニング・プラグインを開発できます。詳細は、第13章を参照してください。

Oracle Access Management Security Token Service

このリリースでは、Security Token Service APIに変更はありません。

11g リリース1(11.1.1)の新機能

11gリリース1では、カスタム・アクセス・クライアントや認証および認可機能の拡張機能を作成するための、純粋なJavaソフトウェア開発キット(SDK)を提供しています。このリリースは、Oracle Access Manager 10g JNI SDKとの互換性も確保しており、移行することでOracle Access Manager 11gリリースを使用できます。

製品およびコンポーネントの名前の変更

Oracle Access Managerの多くのコンポーネント名は変更ありません。ただし、重要な変更点がいくつかあります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のOracle Access Managementの新機能に関する項を参照してください。

第I部

概要

ここでは、Oracle Access Managementの各コンポーネントを紹介するとともに、SDKおよびAPIを使用した開発について説明します。

第I部は、次の章で構成されています。

- 第1章「Oracle Access Managementコンポーネントによる開発」

1 Oracle Access Managementコンポーネントによる開発

この章では、Oracle Access Managementの各コンポーネントについて、およびソフトウェア開発キット(SDK)やアプリケーション・プログラミング・インタフェース(API)を使用した開発について説明します。この章の内容は次のとおりです。

- 第1.1項「Oracle Access Managementについて」

- 第1.2項「Access Managerについて」

- 第1.3項「Mobile and Socialについて」

- 第1.4項「Identity Federationについて」

- 第1.5項「Security Token Serviceについて」

- 第1.6項「システム要件と動作保証情報」

1.1 Oracle Access Managementについて

Oracle Access Managementリリース11.1.2では、複数の統合コンポーネントにより集約されたマルチサービスが提供されます。

- Oracle Access Management Access Manager (Access Manager)で提供される認証およびSSO

- Oracle Access Management Identity Federation (Identity Federation)で提供されるフェデレーテッドSSO

- Oracle Access Management Mobile and Social (Mobile and Social)で提供されるモバイル・セキュリティおよびソーシャル・アイデンティティ

- Oracle Access Management Security Token Service (Security Token Service)で提供されるセキュリティ・トークン・サービス

Oracle Access Managementコンポーネントで提供されるSDKやAPI、関連のJavadocおよびこのガイドを使用してアプリケーションを開発することで、環境をカスタマイズしたり、機能を拡張したりできます。

1.2 Access Managerについて

Access Managerは、重要なアクセス制御サービスを一元化するエンタープライズ・レベルのソリューションであり、認証、認可、Webシングル・サインオン、ポリシー管理、強制エージェント管理、セッション制御、システム監視、レポート、ロギングおよび監査の機能を提供する統合ソリューションです。

このリリースでは、用意されているJava Access SDKやAccess Manager APIを使用して、独自のアクセス・クライアント、カスタム認証プラグイン、カスタム・ログイン・ページおよびカスタム・エラー・ページを作成したり、Access Managerポリシーをプログラムによって管理できるほか、偽装機能を有効化したり、管理用カスタム・ユーザー・インタフェースを開発できます。

Access Managerの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

Access Manager SDKおよびAPIを使用したアプリケーション開発の詳細は、第II部「Access Managerによる開発」を参照してください。

1.3 Mobile and Socialについて

Mobile and Socialは、保護されているリソースへのアクセスを必要とするユーザーと、リソースを保護するバックエンドのAccess ManagementサービスおよびIdentity Managementサービスの間の橋渡しの役割を果たします。Mobile and Socialには簡易なクライアント・ライブラリが用意されており、開発者はこれを使用して、機能豊富な認証、認可およびアイデンティティ機能を登録済アプリケーションに簡単に追加できます。バックエンドのMobile and Socialサーバーのプラガブルなアーキテクチャにより、システム管理者は、ユーザーがインストールしたソフトウェアを更新しなくても、アイデンティティ管理サービスおよびアクセス管理サービスを追加、変更および削除できます。Mobile and Socialには、iOSデバイス用とJava用のSDKが個別に用意されています。iOSまたはJava SDKを使用できないプラットフォームまたはデバイスでアプリケーションを開発する場合は、Mobile and SocialサーバーにMobile and Social RESTコールを直接送信するコードを記述できます。

Oracle Access ManagementのMobile and Socialの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

Mobile and Social SDKを使用したアプリケーション開発の詳細は、第III部「Mobile and Socialによる開発」を参照してください。

1.4 Identity Federationについて

Identity Federationにより、組織は集中ユーザー・リポジトリを導入したり、データ・ストアを同期させる必要なく、セキュリティ境界を超えてアカウントとアイデンティティをセキュアにリンクできます。また、ドメイン・シングル・サインオンを横断して実装できる相互運用可能な手段が提供され、アイデンティティと資格証明を維持管理、運用するためのオーバーヘッドも発生しません。クラウド、WebサービスおよびB2B取引の結果として、今日では、フェデレーテッド認証があらゆるWebアクセス管理ソリューションのコア・エレメントとなっています。このリリースから、SAMLベースのフェデレーション・サービスはシングル・アクセス管理サーバーに直接は集約されていません。この初期リリースでの集約は、サービス・プロバイダ機能に限定されています。この初期リリースでは、どのアイデンティティ・プロバイダ機能を使用する場合も、引き続きOracle Identity Federation 11gR1のインストールが必要になります。ただし、Oracle Access Management 11gR2とOracle Identity Federation 11gR1のリンクは、非常にシンプルかつ高度に統合されています。

Oracle Access ManagementのIdentity Federationの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

このリリースでは、そのまま使用できるソリューションが要件に適合しない場合、カスタムのユーザー・プロビジョニング・プラグインを開発できます。Identity Federation APIを使用したアプリケーション開発の詳細は、第IV部「Identity Federationによる開発」を参照してください。

1.5 Security Token Serviceについて

Security Token Serviceは、セキュリティ・トークンを発行、検証、交換する標準準拠のセキュリティ・ソリューションです。信頼できる認証局として機能するので、エンタープライズWebサービス・インフラストラクチャにおいて、適切なセキュリティ・トークン・ポリシーをWebサービス・プロバイダとコンシューマ全体に強制するために使用できます。また、インフラストラクチャの階層をまたがってアイデンティティおよびセキュリティ情報を伝播する手段を提供します。

Oracle Access ManagementのSecurity Token Serviceの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

このリリースでは、検証するトークンがSecurity Token Serviceにおいてデフォルトでサポートされていない場合、独自の検証および発行モジュール・クラスを記述できます。Security Token Serviceを使用したトークンの開発の詳細は、第V部「Security Token Serviceによる開発」を参照してください。

1.6 システム要件と動作保証情報

ハードウェアとソフトウェアの要件、プラットフォーム、データベースおよびその他の情報の詳細は、システム要件と動作要件のドキュメントを参照してください。いずれのドキュメントもOracle Technology Network (OTN)から入手できます。

システム要件のドキュメントには、ハードウェアとソフトウェアの要件、ディスク領域とメモリーの最小要件、必要なシステム・ライブラリ、パッケージまたはパッチなどの情報が記載されています。

http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-requirements-100147.html

動作要件のドキュメントには、サポートされているインストール・タイプ、プラットフォーム、オペレーティング・システム、データベース、JDKおよびサードパーティ製品が記載されています。

http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.html

第II部

Access Managerによる開発

ここでは、Oracle Access Management Access Manager SDKおよびAPIを使用したアプリケーション開発について説明します。

第II部は、次の章で構成されています。

- 第2章「アクセス・クライアントの開発」

- 第3章「カスタム認証プラグインの開発」

- 第4章「カスタム・ページの開発」

- 第5章「ポリシー・オブジェクトの管理」

- 第6章「偽装を管理するアプリケーションの開発」

2 アクセス・クライアントの開発

Oracle Access Management Access Manager (Access Manager)では、カスタム・アクセス・クライアントを作成するための純粋なJavaソフトウェア開発キット(SDK)およびアプリケーション・プログラミング・インタフェース(API)を提供しています。この章では、カスタム・アクセス・クライアントの開発方法と次の項目について説明します。

- 第2.1項「アクセス・クライアントの開発について」

- 第2.2項「アクセス・クライアントの開発」

- 第2.3項「メッセージ、例外およびロギング」

- 第2.4項「アクセス・クライアント・プログラムの構築」

- 第2.5項「アクセス・クライアントの構成およびデプロイ」

- 第2.6項「互換性: 11gと10gのAccess SDKおよびAPI」

- 第2.7項「旧アプリケーションの移行またはコードの変換」

- 第2.8項「ベスト・プラクティス」

2.1 アクセス・クライアントの開発について

Webgateは、リソースに対するHTTPリクエストを捕捉して、認証と認可のためにOAMサーバーに転送するWebサーバー・プラグインです。Webgateは、アクセス・リクエストに対する実際の強制ポイントとして機能するWebサーバー・エージェントです。複数のWebgateがそのまま使用できる状態で用意されており、アクセス・リクエストを捕捉するOracle HTTP Serverにインストールできます。

アクセス・クライアントとは、11g Access SDKおよびAPIを使用して開発されたカスタムWebgateのことです。標準のWebgateが適切でない場合は、カスタム・アクセス・クライアントを記述してデプロイすることにより、WebリソースまたはWeb以外のリソース(HTTP以外)に対するユーザーまたはアプリケーションからのリクエストを処理できます。

この項の内容は次のとおりです。

- Access SDKおよびAPIについて

- Access SDKのインストールについて

- カスタム・アクセス・クライアントについて

- アクセス・クライアントのリクエスト処理について

2.1.1 Access SDKおよびAPIについて

11g Access SDKおよびAPIは、Javaアプリケーション開発者を対象とし、密結合されている高パフォーマンスの統合の開発を目的としています。詳細は、このガイドの他にOracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンスを参照してください。

Access SDKは、オラクル社が様々なエンタープライズ・プラットフォーム(32ビットおよび64ビットの両方のモードを使用)およびハードウェアの組合せで認証した、プラットフォーム非依存パッケージです。これは、Oracle Fusion Middlewareアプリケーション間でサポートされているJDKバージョンで提供されています。

oracle.security.am.asdkパッケージでは、11g Java APIを提供しています。11gバージョンは10g JNI APIとよく似ていますが、11g OAMサーバーで使用するための拡張機能が備わっています。11g Access SDKは、10gベースのcom.oblix.accessインタフェースをサポートすることで下位互換性を提供しています。機能的な観点からすると、11g Access SDKは10g (10.1.4.3) Access SDKのパリティを維持しており、11g APIレイヤーを使用して既存のカスタム・コードを記述しなおすことができます。

注意:

10g (10.1.4.3)のcom.oblix.accessパッケージおよびクラスは非推奨です。非推奨APIは、機能改良などの理由から使用が推奨されておらず、通常はそれに代わるAPIが提供されます。非推奨APIは今後の実装で削除される可能性があります。

開発者はあらゆる新規開発において11g Access SDKを使用することを強くお薦めします。

Access SDKのインストール後は、サブディレクトリおよびファイルの相対的な場所を変更しないでください。変更すると、APIが正しくビルドおよび操作できなくなります。次のAccess SDKパッケージが含まれています。

- oracle.security.am.asdk: 11g OAMサーバー機能を利用するための拡張機能を提供する認証および認可API。11g Access SDK APIは、Oracle Access Manager 10gR3 (10.1.4.3)またはOracle Access Manager 11gR1 (11.1.1.5+)バージョンのサーバーで使用できます。

- com.oblix.access: これは10gバージョンの認証および認可APIに11gリリース用の拡張機能をいくつか加えたものです。10g JNI ASDKで記述されたプログラムとの下位互換性を保つために用意されています。

11g Access SDKには、認証および認可機能が組み込まれています。ただし、管理APIは組み込まれていません(たとえば、11gポリシー・マネージャAPIはありません)。

Access SDKの最も一般的な用途は、Access Managerとその他のアプリケーション(Oracleまたはサード・パーティ)とのカスタム統合の開発を可能にすることです。使用例を次に示します。

- Oracleがデフォルトで統合を提供していないWebサーバーまたはアプリケーション・サーバー用のカスタム・アクセス・クライアントの開発。

- Access Manager認証プロセスの一部として格納される可能性があるセッション情報へのアクセス。

- ユーザー・プリンシパルのHTTPヘッダーを信頼せず、Access ManagerセッションCookieの有効性を確認。

表2-1では、11g Access SDKの主な機能について説明します。

表2-1 11g Access SDKの機能

機能

説明

インストール

クライアント・パッケージ: oamasdk-api.jarおよび11gエージェントの動作に必要なその他のJPS jarファイルを格納した1個のzipファイルで構成されています。サポート・ファイル(署名およびTLSネゴシエーション用)は含まれておらず、個別に生成する必要があります。

サーバー関連コード: コアAccess Managerサーバー・インストールの一部として組み込まれています。

注意: Oracle Access Manager 10g (10.1.4.3)で開発されたアクセス・クライアントおよびプラグインは11gリリースで使用できます。Oracle Access Manager 10g (10.1.4.3)バンドル・パッチは、11gで使用するためのJava SDKコード拡張機能を配布する目的で使用します。

組込みバージョニング

次のことが可能です。

- インストールされているAccess SDKバージョンの判別

- 連動できる互換バージョンの検証(Oracle Access Manager 10g (10.1.4.3)および11g)
一致しない場合、Access SDK関数が停止し、情報メッセージがログに記録され、表示されます。

ロギング

Access SDKロギング・メカニズムにより、ローカル・ファイルに表示する詳細のレベル(情報、警告およびエラーの各レベル)を指定できます。メッセージは、問題を解決するための十分な詳細を提供します。たとえば、互換性のないAccess SDKパッケージが使用されている場合、ログ・メッセージには、バージョン不一致に関する詳細と、遵守する必要があるバージョン基準が含まれます。

SDKが指定期間内に大量のログを生成した場合、ファイル制限または期間に基づいてログのロールオーバーを構成できます。たとえば、ファイル制限に達した場合(または一定時間が経過した場合)、ログ・ファイルはアーカイブ・ディレクトリにコピーされ、新規ログ・ファイルが開始されます。

2.1.2 Access SDKのインストールについて

Java Access SDK Client for Access Manager 11gをインストールするには、次の手順を実行します。

1. Oracle Technology Networkからoam-java-asdk.jarファイルをダウンロードします。

2. ファイルoam-java-asdk.zipの中身をローカル・ディレクトリに展開します。

3. oamasdk-api.jarをCLASSPATHに追加します。場合に応じて、次のいずれかを選択します。

- JRF以外の環境を使用している場合は、次のjarファイルをCLASSPATHに追加します。

identitystore.jar
jps-api.jar
jps-common.jar
jps-internal.jar
jps-unsupported-api.jar
oraclepki.jar
osdt_cert.jar
osdt_core.jar
osdt_xmlsec.jar

- アクセス・クライアントを10gモードで構成している場合は、次のjarファイルをCLASSPATHに追加します。

jps-api.jar

- アクセス・クライアントを11gモードで構成している場合は、次のjarファイルをCLASSPATHに追加します。

jps-api.jar
jps-common.jar
jps-internal.jar
jps-unsupported-api.jar
oraclepki.jar
osdt_cert.jar
osdt_core.jar
osdt_xmlsec.jar

4. JRF環境を使用している場合、OAM_11Gモードで実行するために次のコードをsystem-jazn-data.xmlに追加します。

<grant>
<grantee>
<codesource>
<url>... ...</url>
</codesource>
</grantee>
<permissions>
<permission>
<class>oracle.security.jps.service.credstore.CredentialAccessPermission</class>
<name>context=SYSTEM,mapName=OAMAgent,keyName=*</name>
<actions>read</actions>
</permission>
<permissions>
<grant>

2.1.3 カスタム・アクセス・クライアントについて

Access SDKを使用すると、認証、認可、監査など保護されたリソースへのアクセスを制御する目的で、Access Managerとのカスタム統合を開発できます。通常このアクセス制御を実現するには、Access SDKランタイムとインタフェースするためのAccess Client APIを起動するアプリケーションまたはプラグインであるカスタム・アクセス・クライアントを開発およびデプロイします。

アクセス・クライアント側のキャッシュがAccess SDKランタイム内で内部的に使用され、処理オーバーヘッドがさらに抑えられます。Access SDKランタイムとOAMサーバーの連携により、動的構成管理が透過的に実行され、それによって、管理コンソールで行ったアクセス・クライアント構成の変更が、対象となるAccess SDKランタイムに自動的に反映されます。

アクセス・クライアントAPIのすべてまたはサブセットを使用することで、目的の機能に応じて、様々なタイプのカスタム・アクセス・クライアントを開発できます。APIは通常、ユーザーとの通信に使用される保護されたリソースおよびネットワーク・プロトコルのタイプは認識しません。たとえば、HTTPプロトコルの詳細およびHTTP Cookieの用途はAccess SDKの範囲外です。非HTTPリソースを保護するアクセス・クライアントは、HTTPリソースを保護するエージェントと同じくらい容易に開発できます。

カスタム・アクセス・クライアント単独で、または他のアクセス・クライアントと組み合せて実行できる一般的な機能は、次のとおりです。

- 資格証明をAccess Managerおよびその構成済ユーザー・リポジトリに対して検証してユーザーを認証します。

- ユーザーを認証し、リソースへのアクセスについて認可の有無をチェックします。

- ユーザーを認証し、セッション・トークンで表された一意のAccess Managerセッションを作成します。

- ユーザーにより提供されたセッション・トークンを検証し、保護されたリソースへのユーザーのアクセス権を認可します。

- セッション・トークンまたは名前付きセッション識別子がある場合は、Access Managerセッションを終了します。

- 名前付きユーザー識別子を指定し、指定ユーザーのAccess Managerセッションを列挙します。

- Access Managerのカスタム・セッション属性を保存または取得します。

アクセス・クライアントの一部の操作は、指定されたアクセス・クライアント・インスタンスによる使用に制限されています。例は、Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンスのOperationNotPermittedを参照してください。

アクセス・クライアントは、OAMサーバーで保護されたLDAPドメイン内のリソースへのユーザーのアクセス・リクエストを処理します。一般的には、リソース・リクエストを受け取るサーブレット(プラグイン)またはスタンドアロン・アプリケーションにカスタム・アクセス・クライアント・コードを埋め込みます。このコードは、Access Manager APIライブラリを使用して、OAMサーバー上での認証および認可サービスを実行します。

リソースが保護されていない場合、アクセス・クライアントはリクエストされたリソースに対する自由なアクセスをユーザーに許可します。リソースが保護されていて、ユーザーがアクセスを得るために特定の資格証明を提示できるように認可されている場合は、アクセス・クライアントがそのユーザー資格証明の取得を試み、OAMサーバーが資格証明を確認できるようにします。ユーザーの認証とリソースへの認可が成功すると、アクセス・クライアントは、ユーザーがリソースを利用できるようにします。

アクセス・クライアントには、表2-2に示すように各種要素に応じてバリエーションがあります。

表2-2 アクセス・クライアントのバリエーション

バリエーション

説明

アプリケーションのタイプ

スタンドアロン・アプリケーション対サーバー・プラグインです。

開発言語

各開発言語により、APIの基礎となる機能へのインタフェースを選択できます。

11gでは、Javaがカスタム・アクセス・クライアントの唯一の開発言語です。

リソース・タイプ

HTTPおよびHTTP以外の両方のリソースを保護します。

資格証明の取得

他のメソッド間における、HTTPフォーム・ベース入力、セッション・トークンの使用およびコマンドライン入力を有効にします。

記述およびデプロイされたカスタム・アクセス・クライアントは、標準のWebgateと同じようにOracle Access Management管理者が管理します。管理コンソールによるカスタム・アクセス・クライアントの管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

2.1.3.1 カスタム・アクセス・クライアントを作成するケース

一般に、Oracle Access Managerによってまだデフォルト・ソリューションが用意されていないリソースへのアクセスを制御する必要がある場合に、標準のWebgateのかわりに、カスタム・アクセス・クライアントをデプロイします。これには次のような場合が含まれます。

- HTTP以外のリソースの保護。

- 特殊機能を実装するために開発したカスタムWebサーバーの保護(リバース・プロキシなど)。

- HTTPとHTTP以外のリソースの組合せを保護するためのシングル・サインオン(SSO)の実装。
たとえば、Oracle WebLogic ServerクラスタおよびOracle WebLogic Server以外のリソースが含まれる企業環境内でのSSOを容易にするアクセス・クライアントを作成できます。

2.1.3.2 アクセス・クライアントのアーキテクチャ

各アクセス・クライアントは、次の3種類のリソースから構築されます。

1. カスタム・アクセス・クライアント・コード
サーブレットまたはスタンドアロン・アプリケーションに組み込まれます。11gリリースでは、Java言語プラットフォームを使用してアクセス・クライアント・コードを記述します。

2. 構成情報

- OBAccessClient.xmlファイル: プライマリ構成ファイル。アクセス・クライアント・プロファイルを構成する構成情報が格納されています。

- cwallet.ssoおよびjps-config.xmlファイル: 11gエージェントの場合のみ。

- トランスポート・セキュリティ・モードが簡易または証明書の場合、次のファイルが必要です。

- oamclient-truststore.jks: 証明書発行局のCA証明書が含まれるJKS形式の信頼ストア・ファイル。

- oamclient-keystore.jks: アクセス・クライアントに対して発行された証明書および秘密鍵が含まれるJKS形式のキー・ストア・ファイル。

- password.xml: グローバル・パス・フレーズの値を保持するXMLファイル。秘密鍵ファイルの保護を解除する際にも同じパスワードが使用されます。

3. Access Manager APIライブラリ
アクセス・クライアントとOAMサーバー間の連携を可能にします。

図2-1は、ホスト・サーバーにインストールされたアクセス・クライアント・コンポーネント間の関係を示しています。

図2-1 アクセス・クライアントのアーキテクチャの詳細

「図2-1 アクセス・クライアントのアーキテクチャの詳細」の説明

2.1.4 アクセス・クライアントのリクエスト処理について

第2.1.3.2項「アクセス・クライアントのアーキテクチャ」で説明しているリソースのタイプにより生じる多様性にかかわらず、アクセス・クライアントの多くは同じ基本ステップに従ってユーザー・リクエストを処理します。

ユーザーまたはアプリケーションが、アクセス・クライアントがインストールされているサーバー上で動作するサーブレットまたはアプリケーションに対してリソース・リクエストを発行すると、そのサーブレットまたはアプリケーションに埋め込まれたアクセス・クライアント・コードが図2-2に示す基本プロセスを開始します。

図2-2は、リソース・リクエストの処理方法を示しています。

図2-2 プロセスの概要: リソース・リクエストの処理

「図2-2 プロセスの概要: リソース・リクエストの処理」の説明

プロセスの概要: リソース・リクエストの処理

1. アクセス・クライアント・コードが埋め込まれているアプリケーションまたはサーブレットが、ユーザーのリソース・リクエストを受け取ります。

2. アクセス・クライアントにより、ResourceRequest構造体が構成されます。この構造体は、リクエストされたリソースが保護されているかどうかをアクセス・クライアント・コードがOAMサーバーに問い合せるために使用されます。

3. OAMサーバーが応答します。

4. 状況に応じて、次のいずれかが発生します。

- リソースが保護されていない場合、アクセス・クライアントはDenyOnNotProtectedフラグの値に基づいて、リソースに対するアクセス権を付与または拒否します。デフォルト値はtrueです。
Access Manager 11gエージェントの場合、DenyOnNotProtectedフラグは常にtrueであり、変更できません。

- リソースが保護されている場合、アクセス・クライアントがAuthenticationScheme構造体を構成、使用して、ユーザーがどの資格証明を提示する必要があるかをOAMサーバーに問い合せます。このステップは、アクセス・クライアントでリソース別の認証スキームを使用できる場合にのみ必要です。

5. OAMサーバーが応答します。

6. アプリケーションは、フォームまたはその他の手段を使用してユーザー資格証明を要求します。場合によっては、ユーザー資格証明が次の一部としてすでに発行されていることがあります。

- 有効なセッション・トークン

- Webブラウザからの入力

- アクセス・クライアント・アプリケーションを起動したコマンドライン・スクリプトの引数またはキーボード入力

7. ユーザーがアプリケーションに応答します。

8. アクセス・クライアントによりUserSession構造体が構成され、この構造体を通して、OAMサーバーはユーザー資格証明を取得し、資格証明をOracle Access Managerユーザー・ディレクトリ内のユーザー・プロファイルにマップします。

9. 資格証明が有効と判定されると、アクセス・クライアントがユーザーのセッション・トークンを作成し、認可リクエストをOAMサーバーに送信します。このリクエストには、ユーザーID、ターゲット・リソースの名前およびリクエストされた操作が含まれています。
Access SDKを使用して開発されたアクセス・クライアントの場合、SSOトークンが名前なしの文字列型として発行されます。既存のUserSessionオブジェクトに対してgetSessionToken()を使用すると、そのセッションのトークンが返されます。既存のトークンがある場合は、そのトークンを使用してユーザー・セッション・オブジェクトを構成できます。トークンは暗号化されおり、ユーザーには理解できませんが、内部的には10g形式または11g形式になっています。

10. アクセス・クライアントはリソースへのアクセス権をユーザーに付与しますが、これはユーザーがリクエストした特定のリソースに対する操作を行う権限がある場合に限られます。

図2-2に示したフローは、認可プロセスのメイン・パスのみを表しています。その後に分岐する次の場合については、通常、サーブレットまたはアプリケーション内の追加コード部分によって処理されます。

- リクエストされたリソースが保護されていない場合。

- 保護されたリソースに関連付けられている認証チャレンジ・メソッドがアプリケーションでサポートされていない場合。

- ユーザーが、指定された条件で有効な資格証明を提示できなかった場合。

- その他のエラー状態が発生した場合。

- 特殊な状況や機能を処理するために、開発者がアクセス・クライアントに追加のカスタム・コードを組み込んである場合。

カスタム・アクセス・クライアントを記述する場合、ユーザーをバックチャネル経由で認証できます。

2.2 アクセス・クライアントの開発

この項で説明する項目は、次のとおりです。

- アクセス・クライアントの構造

- アクセス・クライアントの一般的な実行フロー

- サンプル・コード: 簡単なアクセス・クライアント

- 注釈付きサンプル・コード: 簡単なアクセス・クライアント

- サンプル・コード: Javaログイン・サーブレット

- 注釈付きサンプル・コード: Javaログイン・サーブレット

- サンプル・コード: その他のメソッド

- 注釈付きサンプル・コード: その他のメソッド

- サンプル・コード: Javaでの証明書ベース認証

2.2.1 アクセス・クライアントの構造

一般的なアクセス・クライアント・アプリケーションの構造は、アクセス・クライアント・セッションの設定に必要な一連のイベントを大まかにミラー化しています。

アクセス・クライアント・アプリケーション構造の概要

1. 必要なライブラリをインクルードまたはインポートします。

2. リソースを取得します。

3. 認証スキームを取得します。

4. 認証スキームに必要となるユーザー資格証明を収集します。

5. ユーザー・セッションを作成します。

6. リソースに対するユーザー認可をチェックします。

7. クリーン・アップします(Javaは自動ガベージ・コレクションを使用)。

8. 停止します。

2.2.2 アクセス・クライアントの一般的な実行フロー

HTTPフォーム・ベースのアクセス・クライアントのアプリケーションとプラグインは、すべて図2-3に示すような同じ基本パターンを実行します。

図2-3は、フォーム・ベースのアプリケーションのプロセス・フローを示しています。

図2-3 フォーム・ベースのアプリケーションのプロセス・フロー

「図2-3 フォーム・ベースのアプリケーションのプロセス・フロー」の説明

プロセスの概要: アクセス・クライアントによるフォーム・ベースのアプリケーションの実行

1. ライブラリをインポートします。

2. SDKを初期化します。

3. ResourceRequestオブジェクトを作成します。

4. リクエストされたリソースが保護されているかどうかを判別します。
リソースが保護されていない場合: リソースが保護されていない場合、アクセス・クライアントはDenyOnNotProtectedフラグの値に基づいて、リソースに対するアクセス権を付与または拒否します。デフォルト値はtrueです。Access Manager 11gエージェントの場合、DenyOnNotProtectedフラグは常にtrueであり、変更できません。

5. リクエストされたリソースが保護されている場合: AuthenticationSchemeオブジェクトを作成します。

6. HTTPフォーム・ベースの認証スキームの場合: ユーザーIDとパスワードを含む構造体を作成し、UserSessionオブジェクトを作成して、ユーザーが認証されるかどうかを判定します。

7. HTTPフォーム・ベースでない認証スキームの場合: アクセスを拒否して理由を報告し、APIを停止し、プログラムを終了します。

8. ユーザーが認証された場合: ユーザーが認可されるかどうかを判定します(ステップ10)。

9. ユーザーが認証されていない場合: アクセスを拒否して理由を報告し、APIを停止し、プログラムを終了します。

10. ユーザーが認可された場合: アクセスを許可し、APIを停止し、プログラムを終了します。

11. ユーザーが認可されなかった場合: アクセスを拒否して理由を報告し、APIを停止し、プログラムを終了します。

注意:

このテスト・アプリケーション、あるいはその他のいずれかの例を実行する場合、アクセス・システムが正しくインストールおよび設定されていることを確認してください。特に、サンプル・プログラムで必要とされるURLと認証スキームに完全に一致するリソースが保護されるように構成されているかどうかを確認してください。アプリケーション・ドメインの作成およびアプリケーション・ドメインによるリソースの保護の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

2.2.3 サンプル・コード: 簡単なアクセス・クライアント

この例は、簡易アクセス・クライアント・プログラムです。これは、動作中のアクセス・クライアントに必要な最小限のタスクの実装方法を示しています。

- OAMサーバーに接続します。

- HTTPフォーム・チャレンジ・メソッドを採用した認証スキームを使用してログインします。

- HTTP GETリクエストを使用してリソースの認証を確認します。

- Access SDK APIの例外を捕捉およびレポートします。

通常、このコール順序は、フォーム・チャレンジ・メソッドを使用するアクセス・クライアントに共通です。フォーム・メソッドのアクセス・クライアント間の主な違いは、認証に必要な資格証明と保護するリソース・タイプです。

JAccessClient.javaの完全なリストは例2-1に示しています。このコードをテキスト・ファイルJAccessClient.javaに一字一句すべてコピーし、Access Manager SDKがインストールされているコンピュータ上でこれを実行できます。

この例の注釈付きバージョンは、第2.2.4項「注釈付きサンプル・コード: 簡単なアクセス・クライアント」を参照してください。これにより、11g Java Access Manager APIコールに慣れることができます。

例2-1 JAccessClient.java

import java.util.Hashtable;
import oracle.security.am.asdk.*;

public class JAccessClient {
public static final String ms_resource = "//Example.com:80/secrets/
index.html";
public static final String ms_protocol = "http";
public static final String ms_method = "GET";
public static final String ms_login = "jsmith";
public static final String ms_passwd = "j5m1th";
public static final String m_configLocation = "/myfolder";
public static void main(String argv[]) {
AccessClient ac = null;
try {
ac = AccessClient.createDefaultInstance(m_configLocation,
AccessClient.CompatibilityMode.OAM_10G);

ResourceRequest rrq = new ResourceRequest(ms_protocol, ms_resource,
ms_method);
if (rrq.isProtected()) {
System.out.println("Resource is protected.");
AuthenticationScheme authnScheme = new AuthenticationScheme(rrq);
if (authnScheme.isForm()) {
System.out.println("Form Authentication Scheme.");
Hashtable creds = new Hashtable();
creds.put("userid", ms_login);
creds.put("password", ms_passwd);
UserSession session = new UserSession(rrq, creds);
if (session.getStatus() == UserSession.LOGGEDIN) {
if (session.isAuthorized(rrq)) {
System.out.println("User is logged in and authorized for the"
+"request at level " + session.getLevel());
} else {
System.out.println("User is logged in but NOT authorized");
}
//user can be loggedout by calling logoff method on the session object
} else {
System.out.println("User is NOT logged in");
}
} else {
System.out.println("non-Form Authentication Scheme.");
}
} else {
System.out.println("Resource is NOT protected.");
}
}
catch (AccessException ae) {
System.out.println("Access Exception: " + ae.getMessage());
}
ac.shutdown();
}
}

2.2.4 注釈付きサンプル・コード: 簡単なアクセス・クライアント

資格証明を保持する標準Javaライブラリ・クラス・ハッシュテーブルをインポートします。

import java.io.Hashtable;

Access SDK APIクラスのJava実装が含まれるライブラリをインポートします。

import oracle.security.am.asdk.*;

このアプリケーションにJAccessClientと命名します。

public class JAccessClient {

このアプリケーションは最も単純な例のため、リソースへのユーザー・アクセス・リクエストに関連したパラメータを表すためにグローバル定数を宣言することとします。

このパラメータ・セットは、実際のアプリケーションでは通常、リクエスト元アプリケーション、HTTPフォーム入力またはコマンドライン入力から渡される文字列の配列として受信されます。次に例を示します。

public static final String ms_resource = "//Example.com:80/secrets/index.html";
public static final String ms_protocol = "http";
public static final String ms_method = "GET";
public static final String ms_login = "jsmith";
public static final String ms_passwd = "j5m1th";

Javaインタプリタ上でメイン・メソッドを起動します。argvという名前の文字列配列がメイン・メソッドに渡されます。この例では、jsmithというユーザーが、j5m1thというパスワードを使用して、HTTPリソースの//Example.com:80/secrets/index.htmlをリクエストします。GETは、リクエスト先リソースに対して実行するHTTP操作です。サポートされているHTTP操作およびアプリケーション・ドメインによるリソースの保護の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

public static void main(String argv[]) {

メイン・メソッド内のすべての関連するプログラム文をtryという大きなブロック内に配置し、プログラム終了までにすべての例外をこの捕捉用ブロックで捕捉できるようにします。

AccessClient ac = null;

try {

Access SDKを初期化するために、構成ファイルObAccessClient.xmlのディレクトリの場所を指定して、AccessClientインスタンスを作成します。Access SDKを初期化するための構成場所を指定するには複数の方法があります。詳細は、Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンスを参照してください。

作成する必要があるのはAccessClientのインスタンスのみであり、これがAccess SDK APIを初期化します。AccessClient.CompatibilityMode.OAM_10Gは、10gと11g両方のサーバーと互換性のある古い10gエージェント・モードで動作するようにAccess SDKを初期化することを示しています。デフォルトでは、この互換性モードを指定しないと、デフォルトのOAM_11Gが使用されます。この場合、エージェントは11gエージェント・モードで動作し、11g OAMサーバーとしか対話できません。

ac = AccessClient.createDefaultInstance(m_configLocation ,
AccessClient.CompatibilityMode.OAM_10G);

ResourceRequestコンストラクタを次の3つのパラメータとともに使用して、rrqという名前の新規のリソース・リクエスト・オブジェクトを作成します。

- ms_protocol: リクエストするリソースのタイプを示します。未指定の場合、デフォルト値はHTTPです。使用可能な値としてEJBもありますが、ここでの例にはこれは使用しません。カスタム・タイプを作成することもできます。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

- ms_resource: リソース名です。この特定の例でリクエストされたリソース・タイプはHTTPであるため、次のようにリソース名の先頭にホスト名およびポート番号を追加することは有効です。

//Example.com:80/secrets/index.html

- ms_method: リソースに対して実行する操作のタイプです。リソース・タイプがHTTPの場合、指定可能な操作はGETとPOSTです。EJBタイプのリソースでは、操作はEXECUTEにかぎります。カスタム・リソース・タイプの場合、リソース・タイプを設定する際に、許可する操作を定義します。リソース・タイプの定義およびアプリケーション・ドメインによるリソースの保護の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

ResourceRequest rrq = new ResourceRequest(ms_protocol,
ms_resource, ms_method);

リクエスト先リソースrrqが認証スキームによって保護されているかどうかを確認します。

if (rrq.isProtected()) {

リソースが保護されている場合は、そのことをレポートします。

System.out.println("Resource is protected.");

AuthenticationSchemeコンストラクタを使用して、authnSchemeという名前の認可スキーム・オブジェクトを作成します。リソース・リクエストrrqを指定し、この特定のリソースに特定の認可スキームが関連付けられているかどうかを、AuthenticationSchemeに確認させます。

AuthenticationScheme authnScheme =new AuthenticationScheme(rrq);

フォーム・ベースの認可スキームが使用されているかどうかを判別します。

if (authnScheme.isForm()) {

認可スキームがチャレンジ・メソッドとしてHTTPフォームを使用している場合、そのことを報告してから、ユーザー名(userid)およびユーザー・パスワード(password)を表すname:valueペアを保持するための、credsという名前のハッシュテーブルを作成します。ms_loginおよびms_passwdの値をハッシュテーブルに読み込みます。

System.out.println("Form Authentication Scheme.");
Hashtable creds = new Hashtable();
creds.put("userid", ms_login);
creds.put("password", ms_passwd);

UserSessionコンストラクタを使用して、sessionという名前のユーザー・セッション・オブジェクトを作成します。リソース・リクエストをrrqに、認証スキームをcredsに指定して、認証試行が成功したかどうかを示す状態情報が含まれる新規の構造体をUserSessionが戻すようにします。

UserSession session = new UserSession(rrq, creds);

UserSession状態情報に対してgetStatusメソッドを起動し、ユーザーが正常にログインできたか(認証されたか)どうかを確認します。

if (session.getStatus() == UserSession.LOGGEDIN) {

ユーザーが認証されている場合は、リソース・リクエスト構造体rrqに指定したリソースへのアクセスをユーザーが認可されるかどうかを確認します。

if (session.isAuthorized(rrq)) {
System.out.println(
"User is logged in " +
"and authorized for the request " +

sessionという名前のユーザー・セッションに対してgetLevelメソッドによって戻される認可レベルを確認します。

"at level " + session.getLevel());

rrqに指定されたリソースに対してユーザーが認可されていない場合は、ユーザーは認証されているが、リクエストしたリソースへのアクセスは認可されていないことを報告します。

} else {
System.out.println("User is logged in but NOT authorized");

ユーザーが認証されていない場合は、そのことを報告します。(実際のアプリケーションでは、ユーザーに認証のための機会をさらに与える場合があります)。

} else {
System.out.println("User is NOT logged in");

認証スキームでHTTPフォーム・ベースのチャレンジ・メソッドが使用されていない場合は、そのことを報告します。実際のアプリケーションでは、このようなとき、basic(useridとpasswordのみを要求する)、certificate(SSL over HTTPSまたはTLS over HTTPS)、またはsecure(リダイレクトURLによるHTTPS)など、認可スキームに指定されている他のチャレンジ・メソッドを提供するように分岐する場合があります。チャレンジ・メソッドおよびユーザー認証の構成の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

} else {
System.out.println("non-Form Authentication Scheme.");
}

リソースが保護されていない場合は、そのことを報告します。(アクセス・クライアントはリソースを保護しようとしなくなるので、ユーザーはリクエストしたリソースへのアクセスを自動的に取得します)

} else {
System.out.println("Resource is NOT protected.");
}
}

前述のtryブロック内でエラーが発生した場合は、オブジェクトaeから関連テキスト・メッセージを取得して、これを報告します。

catch (AccessException ae) {
System.out.println(
"Access Exception: " + ae.getMessage());
}

アプリケーションにおいてユーザーのログアウトが必要な場合は、UserSessionクラスのオブジェクト上でログオフ・メソッドを起動できます。

これで、OAMサーバーへのコールが終了になるため、APIを停止して、このコールでAPIが保持してきたメモリーを解放します。

ac.shutdown();
}
}

プログラムを終了します。このアプリケーションで作成した構造体が使用するメモリーは、不要になった時点でJava Garbage Collectionにより自動的にクリーンアップされるので、割当て解除する必要はありません。

2.2.5 サンプル・コード: Javaログイン・サーブレット

この例では、第2.2.3項「サンプル・コード: 簡単なアクセス・クライアント」で説明した、アクセス・クライアントを定義するAPIコールの基本パターンを実行しています。ただしこの例は、Webサーバーまたはアプリケーション・サーバー内で実行されるJavaサーブレットとして実装されています。アクセス・クライアント・サーブレットは、この環境では、Webアプリケーションのユーザーに対してさらに重要な役割を果すことができます。サーブレットは、セッション・トークンをユーザーのHTTPセッション内に格納することで、ユーザーがシングル・サインオンできるようにします。つまり、最初のリクエストで確立された認証済OAMサーバー・セッション情報は、1回認可確認した後でも破棄されません。格納されたセッション・トークンは、破棄されずに、Beanやその他のサーブレットなどのサーバー側アプリケーション・コンポーネントで利用できるようになり、これらのコンポーネントが同じ資格証明をリクエストするためにユーザーに繰り返し割り込む必要がなくなります。セッション・トークン、ObSSOCookiesおよびシングル・サインオンの構成の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

このJavaサーブレットの例では、mod_osso、Access Manager WebgateまたはOpenSSO Policy Agentによって保護されたリソースに対してSSOを提供していません。

このサンプル・ログイン・サーブレットは、カスタム・ログイン・ページ上のフォームでuserid/passwordパラメータを受け付け、ユーザーにAccess Managerへのログインの機会を提供します。ログインが成功した場合、サーブレットは、セッション・トークンをUserSessionオブジェクト内に格納します。これにより、同じHTTPセッション内の後続のリクエストは認証ステップをバイパスし(後続のリクエストが最初のリクエストと同じ認証スキームを使用する場合)、シングル・サインオンを実現します。

Javaログイン・サーブレットの完全なリストは、例2-2に示しています。このコードは、Webサーバーまたはアプリケーション・サーバーに組み込むプラグインのベースとして使用できます。第2.2.6項「注釈付きサンプル・コード: Javaログイン・サーブレット」は、このコードの注釈付きバージョンです。

例2-2 Javaログイン・サーブレットの例

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import oracle.security.am.asdk.*;

public class LoginServlet extends HttpServlet {

public void init(ServletConfig config) throws ServletException {
try {

AccessClient ac = AccessClient.createDefaultInstance("/myfolder" ,
AccessClient.CompatibilityMode.OAM_10G);
} catch (AccessException ae) {
ae.printStackTrace();
}
}

public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
AuthenticationScheme authnScheme = null;
UserSession user = null;
ResourceRequest resource = null;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>LoginServlet: Error Page</TITLE></HEAD>");
out.println("<BODY>");
HttpSession session = request.getSession( false);
String requestedPage = request.getParameter("request");
String reqMethod = request.getMethod();
Hashtable cred = new Hashtable();
try {
if (requestedPage == null || requestedPage.length()==0) {
out.println("<p>REQUESTED PAGE NOT SPECIFIED\n");
out.println("</BODY></HTML>");
return;
}
resource = new ResourceRequest("http", requestedPage, "GET");
if (resource.isProtected()) {
authnScheme = new AuthenticationScheme(resource);
if (authnScheme.isBasic()) {
if (session == null) {
String sUserName = request.getParameter("userid");
String sPassword = request.getParameter("password");
if (sUserName != null) {
cred.put("userid", sUserName);
cred.put("password", sPassword);
user = new UserSession(resource, cred);
if (user.getStatus() == UserSession.LOGGEDIN) {
if (user.isAuthorized(resource)) {
session = request.getSession( true);
session.putValue( "user", user);
response.sendRedirect( requestedPage );
} else {
out.println("<p>User " + sUserName + " not" +
" authorized for " + requestedPage + "\n");
}
} else {
out.println("<p>User" + sUserName + "NOT LOGGED IN\n");
}
} else {
out.println("<p>USERNAME PARAM REQUIRED\n");
}
} else {
user = (UserSession)session.getValue("user");
if (user.getStatus() == UserSession.LOGGEDIN) {
out.println("<p>User " + user.getUserIdentity() + " already"+
"LOGGEDIN\n");
}
}
} else {
out.println("<p>Resource Page" + requestedPage + " is not"+
" protected with BASIC\n");
}
} else {
out.println("<p>Page " + requestedPage + " is not protected\n");
}
} catch (AccessException ex) {
out.println(ex);
}
out.println("</BODY></HTML>");
}
}

2.2.6 注釈付きサンプル・コード: Javaログイン・サーブレット

システム入出力および基本機能を実装する標準Javaパッケージをインポートします。

import java.io.*;
import java.util.*;

サーブレット関連機能を実装する2つのJava拡張機能パッケージをインポートします。

import javax.servlet.*;
import javax.servlet.http.*;

Access SDK APIのJava実装であるoracle.security.am.asdk.jarパッケージをインポートします。

import oracle.security.am.asdk.*;

このサーブレットは、Java Enterprise Editionでサポートされている汎用HttpServletの機能をベースにビルドされており、LoginServletという名前です。

public class LoginServlet extends HttpServlet {

サーブレット・エンジンはinitメソッドを1回コールして、アクセス・クライアントを初期化します。initメソッドでは、構成ファイルObAccessClient.xmlの場所を渡し、AccessClientをインスタンス化してAccess SDKを初期化できます。アクセス・クライアントの作成の詳細は、Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンスを参照してください。OAM_10G互換性フラグは、10gと11g両方のサーバーと互換性を保つようにAccess SDKを初期化します。OAM_10G互換性フラグは、10gと11g両方のサーバーと互換性のある古い10gエージェント・モードでAccess SDKを初期化します。デフォルトでは、この互換性モードを指定しないと、デフォルトのOAM_11Gが使用されます。この場合、エージェントは11gエージェント・モードで動作し、11g OAMサーバーとしか対話できません。

初期化に失敗した場合は、そのことを該当のエラー・メッセージとともに報告します。

public void init() {
AccessClient ac =
AccessClient.createDefaultInstance("/myfolder" ,
AccessClient.CompatibilityMode.OAM_10G);
} catch (AccessException ae) {
ae.printStackTrace();
}
}

javax.servlet.serviceメソッドを起動し、ユーザーのリソース・リクエストを処理します。

public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {

メンバーをnullとして初期化します。これらはリソース・リクエストの処理に使用するアクセス構造を格納し、このアプリケーションが使用するレスポンス・タイプをtext/htmlに設定します。

AuthenticationScheme authnScheme = null;
UserSession user = null;
ResourceRequest resource = null;
response.setContentType("text/html");

LoginServlet: Error Pageという名前の出力ストリームを開き、ユーザーのブラウザにリダイレクトします。

PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>LoginServlet: Error Page</TITLE></HEAD>");
out.println("<BODY>");

このユーザーのセッションがすでに存在するかどうかを確認します。パラメータとしてfalseを指定してgetSessionメソッドを起動すると、既存のサーブレット・セッション(UserSessionではない)の値が戻され(セッションが存在する場合)、存在しない場合はNULLが戻されます。

HttpSession session = request.getSession(false);

ターゲット・リソースの名前を取得して、これをrequestedPage変数に代入し、リクエストに使用されたHTTPメソッド(GET、POST、PUTなど)の名前を取得して、これをreqMethod変数に代入します。

String requestedPage = request.getParameter(Constants.REQUEST);
String reqMethod = request.getMethod();

credという名前のハッシュテーブルを作成し、ユーザーの資格証明を格納します。

Hashtable cred = new Hashtable();

requestedPage変数が空のまま戻された場合は、ターゲット・リソースの名前が正しく指定されていないことを報告し、サーブレットを終了します。

try {
if (requestedPage == null) {
out.println("<p>REQUESTED PAGE NOT SPECIFIED\n");
out.println("</BODY></HTML>");
return;
}

リクエストしたページの名前が戻された場合は、ResourceRequest構造体を作成して、次を設定します。

- リソース・タイプ: HTTP

- HTTPメソッド: GET

- resource: requestedPage変数に設定されている値

resource = new ResourceRequest("http", requestedPage, "GET");

ターゲット・リソースが保護されている場合は、リソース・リクエスト用にAuthenticationScheme構造体を作成し、名前をauthnSchemeとします。

if (resource.isProtected()) {
authnScheme = new AuthenticationScheme(resource);

ターゲット・リソースに関連付けられている認証スキームがHTTP basicで、現在ユーザー・セッションが存在しない場合は、javax.servlet.servletrequest.getParameterを起動してユーザーの資格証明であるユーザー名とパスワードを戻し、それぞれsUserNameとsPasswordの変数に代入します。

次の文でauthnScheme.isBasicコールを正しく動作させるには、次のように、ユーザー名とパスワードをユーザーのHTTPリクエストの問合せ文字列内に含める必要があります。

http://host.example.com/resource?username=bob&userpassword=bobspassword

ここで、resourceは、リクエスト先のリソース、bobはリクエスト元のユーザー、bobspasswordはユーザーのパスワードです。

authnScheme.isFormの追加コード

注意:

authnScheme.isBasicのかわりにauthnScheme.isFormを使用する場合は、追加コードを記述して、次のステップを実装する必要があります。

1. 元のリクエストを処理して、フォーム・ベースのログインが必要なことを判断します。

2. ログイン・フォームに関する302リダイレクト・レスポンスを送信し、HTTPセッションに元のリソース情報を保存します。

3. ユーザー名とパスワードとともにポストされたフォーム・データを処理して、ユーザーを認証します。

4. HTTPリソースから元のリソースを取得し、そのリソースに関する302リダイレクト・レスポンスを送信します。

5. 元のリクエストをもう1回処理しますが、今回はHTTPセッション内に格納されているUserSessionを使用して処理します。

if (authnScheme.isBasic()) {
if (session == null) {
String sUserName = request.getParameter(Constants.USERNAME);
String sPassword = request.getParameter(Constants.PASSWORD);

ユーザー名が存在する場合は、credという名前のハッシュテーブルに、関連パスワードとあわせて読み取ります。

if (sUserName != null) {
cred.put("userid", sUserName);
cred.put("password", sPassword);

resourceという名前のResourceRequest構造体とcredハッシュテーブルの情報に基づいて、ユーザー・セッションを作成します。

user = new UserSession(resource, cred);

戻されたユーザーのステータス・コードがLOGGEDINの場合、そのユーザーの認証は成功しています。

if (user.getStatus() == UserSession.LOGGEDIN) {

ターゲット・リソースへのアクセスをユーザーが認可されるかどうかを確認します。

if (user.isAuthorized(resource)) {

サーブレット・ユーザー・セッション(UserSessionと混同しないでください)を作成し、そこにユーザーの名前を追加します。

session = request.getSession( true);
session.putValue( "user", user);

ユーザーのブラウザをターゲット・ページにリダイレクトします。

response.sendRedirect(requestedPage);

ターゲット・リソースへのアクセスをユーザーが認可されなかった場合は、そのことを報告します。

} else {
out.println("<p>User " + sUserName + " not authorized
for " + requestedPage + "\n");
}

ユーザーが正しく認可されていない場合は、そのことを報告します。

} else {
out.println("<p>User" + sUserName + "NOT LOGGED IN\n");
}

ユーザー名が入力されていない場合は、そのことを報告します。

} else {
out.println("<p>USERNAME PARAM REQUIRED\n");
}

セッションがすでに存在する場合は、USERを取得し、これをuserセッション変数に代入します。

} else {
user = (UserSession)session.getValue("user");

ユーザーがログインできた場合、つまりユーザーの認証が成功した場合は、そのことをユーザー名とともに報告します。

if (user.getStatus() == UserSession.LOGGEDIN) {
out.println("<p>User " + user.getUserIdentity() + " already
LOGGEDIN\n");
}
}

ターゲット・リソースがbasic認証スキームで保護されていない場合は、そのことを報告します。

} else {
out.println("<p>Resource Page" + requestedPage + " is not protected
with BASIC\n");
}

ターゲット・リソースがどの認証スキームによっても保護されていない場合は、そのことを報告します。

} else {
out.println("<p>Page " + requestedPage + " is not protected\n");
}

エラーが発生した場合は、トレースバックを報告します。

} catch (AccessException ex) {
oe.println(ex);
}

出力をユーザーのブラウザにストリームとして送信します。

out.println("</BODY></HTML>");
}
}

2.2.7 サンプル・コード: その他のメソッド

次のサンプル・プログラムは、第2.2.3項「サンプル・コード: 簡単なアクセス・クライアント」で説明した、サンプル・アプリケーションJAccessClient.javaで確立されている基本パターンをベースとして構築されており、追加でいくつかのOAMサーバー・メソッドを起動しています。たとえば、セッション・オブジェクトを点検して、現在の認証スキームに関連付けられているポリシー・ルール内にどのアクションおよび名前付きレスポンスが現在構成されているかを確認します。

このデモを実行するには、アプリケーションを実行する前にOAMサーバーによりいくつかのアクションを構成する必要があります。認証アクションおよびユーザー認証の構成の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。例2–3には、このサンプル・アプリケーションの完全なリストが記載されています。このコードの注釈付きバージョンは、第2.2.8項「注釈付きサンプル・コード: その他のメソッド」を参照してください。

例2-3 access_test_java.java

import java.util.*;
import oracle.security.am.asdk.*;

public class access_test_java {

public static void main(String[] arg) {
String userid, password, method, url, configDir, type,
location;
ResourceRequest res;
Hashtable parameters = null;
Hashtable cred = new Hashtable();
AccessClient ac = null;
if (arg.length < 5) {
System.out.println("Usage: EXPECTED: userid password Type
HTTP-method"
+" URL [Installdir [authz-parameters] [location]]]");
return;
} else {
userid    = arg[0];
password  = arg[1];
type      = arg[2];
method    = arg[3];
url      = arg[4];
}
if (arg.length >= 6) {
configDir = arg[5];
} else {
configDir = null;
}
if (arg.length >= 7 && arg[6] != null) {
parameters = new Hashtable();
StringTokenizer tok1 = new StringTokenizer(arg[6], "&");
while (tok1.hasMoreTokens()) {
String nameValue = tok1.nextToken();
StringTokenizer tok2 = new StringTokenizer(nameValue,
"=");
String name = tok2.nextToken();
String value = tok2.hasMoreTokens() ? tok2.nextToken() :
"";
parameters.put(name, value);
}
}
location = arg.length >= 8 ? arg[7] : null;
try {
ac = AccessClient.createDefaultInstance(configDir ,
AccessClient.CompatibilityMode.OAM_10G);

} catch (AccessException ae) {
System.out.println("OAM Server SDK Initialization
failed");
ae.printStackTrace();
return;
}
cred.put("userid", userid);
cred.put("password", password);
try {
res = new ResourceRequest(type, url, method);
if (res.isProtected()) {
System.out.println("Resource " + type + ":" + url + "
protected");
} else {
System.out.println("Resource " + type + ":" + url + "
unprotected");
}
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Failed to created new resource
request");
return;
}
UserSession user = null;
try {
user = new UserSession(res, cred);
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Failed to create new user session");
return;
}
try {
if (user.getStatus() == UserSession.LOGGEDIN) {
if (location != null) user.setLocation(location);
System.out.println("user status is " + user.getStatus());

if (parameters != null ? user.isAuthorized(res,
parameters) :
user.isAuthorized(res)) {
System.out.println("Permission GRANTED");
System.out.println("User Session Token =" +
user.getSessionToken());
if (location != null) {
System.out.println("Location = " +
user.getLocation());
}
} else {
System.out.println("Permission DENIED");
if (user.getError() == UserSession.ERR_NEED_MORE_DATA)
{
int nParams =
res.getNumberOfAuthorizationParameters();
System.out.print("Required Authorization Parameters
(" +
nParams + ") :");
Enumeration e =
res.getAuthorizationParameters().keys();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
System.out.print(" " + name);
}
System.out.println();
}
}
}
else
{
System.out.println("user status is " + user.getStatus());
}
} catch (AccessException ae)
{
System.out.println("Failed to get user authorization");
}
String[] actionTypes = user.getActionTypes();
for(int i =0; i < actionTypes.length; i++)
{
Hashtable actions = user.getActions(actionTypes[i]);
Enumeration e = actions.keys();
int item = 0;
System.out.println("Printing Actions for type " +
actionTypes[i]);
while(e.hasMoreElements())
{
String name = (String)e.nextElement();
System.out.println("Actions[" + item +"]: Name " + name + "
value " +  actions.get(name));
item++;
}
}
AuthenticationScheme auths;
try
{
auths = new AuthenticationScheme(res);
if (auths.isBasic())
{
System.out.println("Auth scheme is Basic");
}
else
{
System.out.println("Auth scheme is NOT Basic");
}
}
catch (AccessException ase)
{
ase.printStackTrace();
return;
}
try
{
ResourceRequest resNew = (ResourceRequest) res.clone();
System.out.println("Clone resource Name: " +
resNew.getResource());
}
catch (Exception e)
{
e.printStackTrace();
}
res = null;
auths = null;
ac.shutdown();
}
}

2.2.8 注釈付きサンプル・コード: その他のメソッド

基本ユーティリティ、列挙およびトークン処理機能を実装する標準のJavaライブラリをインポートします。

import java.util.*;

Access SDK APIライブラリをインポートします。

import oracle.security.am.asdk.*;

このクラスにaccess_test_javaという名前を付けます。

public class access_test_java {

argという名前の配列で渡される値を格納する、7つの変数文字列を宣言します。

public static void main(String[] arg) {
String userid, password, method, url, configDir, type, location;

現在のResourceRequestをresに設定します。

ResourceRequest res;

まだ空になっていない可能性を考慮して、ハッシュテーブル・パラメータをnullに初期化します。

Hashtable parameters = null;

credという名前の新規のハッシュテーブルを作成します。

Hashtable cred = new Hashtable();

AccessClient参照をnullに初期化します。

AccessClient ac = null;

argという名前の配列に含まれている文字列が5個未満の場合、コマンドライン入力で予期している構文と内容を報告します。これは順序が指定された5個の必須引数、およびオプションの変数であるconfigDir、authz-parametersおよびlocationです。

if (arg.length < 5) {
System.out.println("Usage: EXPECTED: userid password type
HTTP-method URL [configDir [authz-parameters] [location]]]");

最初に指定された引数が5個未満の場合、メイン・メソッドを終了することで事実上プログラムの実行を終了します。

return;
} else {

argという名前の配列に5個以上の文字列がある場合は、最初の5個の引数(arg[0]からarg[4])をuserid、password、type、method、urlの変数に代入します。

userid = arg[0];
password = arg[1];
type = arg[2];
method = arg[3];
url = arg[4];
}

argに6個以上の引数がある場合は、配列内の6番目の文字列をconfigDir変数に代入します。

if (arg.length >= 6)
configDir = arg[5];

argに6個以上の引数がない場合、つまり、5個未満ではないことをすでに確認し、ちょうど5個の引数があることがわかっている場合は、configDirをNULLに設定します。

else
configDir = null;

argに7個以上の文字列があり、arg[6] (authz-parameters変数に暗黙のうちに割り当てられる)が空ではない場合、parametersという名前の新規のハッシュテーブルを作成します。authz-parameters文字列の構文の形式: p1=v1&p2=v2&...

if (arg.length >= 7 && arg[6] != null) {
parameters = new Hashtable();

デリミタとしてアンパサンド記号(&)を使用して、tok1という名前の文字列トークン関数を作成し、arg[6]を解析します。これにより、arg[6]がpn=vnの形式でトークンの配列に分解されます(nはトークンの連番)。

StringTokenizer tok1 = new StringTokenizer(arg[6], "&");

tok1のすべてのアイテムについて、直後のトークンをnameValue変数として戻します。このようにして、nameValueに文字列pn=vnが代入されます(nはトークンの連番)。

while (tok1.hasMoreTokens()) {
String nameValue = tok1.nextToken();

デリミタとして等記号(=)を使用して、tok2という名前の文字列トークン関数を作成し、nameValueを解析します。このようにして、pn=vnをpnとvnのトークンに分解します。

StringTokenizer tok2 = new StringTokenizer(nameValue, "=");

最初のトークンをname変数に代入します。

String name = tok2.nextToken();

2番目のトークンをvalueに代入します。tok2に他のトークンが残っている場合は、直後のトークンを戻し、これをvalueに代入します。残っていない場合は、空文字列をvalueに代入します。

String value = tok2.hasMoreTokens() ? tok2.nextToken() : "";

parametersハッシュテーブルにnameとvalueを挿入します。

parameters.put(name, value);
}
}

arg内に8個以上の引数がある場合は、arg[7]をlocation変数に代入します。ない場合は、locationを空にします。

location = arg.length >= 8 ? arg[7] : null;

他のオプションを使用して提供する構成ファイルの場所がnullである場合、configDirを使用してAccessClientインスタンスを作成します。アクセス・クライアントの作成の詳細は、Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンスを参照してください。

try {
ac = AccessClient.createDefaultInstance(configDir ,
AccessClient.CompatibilityMode.OAM_10G);
}

初期化の試行によりエラーが発生した場合は、トレースバックとともに標準エラー・ストリームに当該のエラー・メッセージ(ae)を報告します。

catch (AccessException ae) {
System.out.println("
OAM Server SDK Initialize failed");
ae.printStackTrace();

メイン・メソッドを終了することで、事実上プログラムを終了します。

return;
}

各変数、ユーザーIDおよびパスワードをcredという名前のハッシュテーブルに読み取ります。

cred.put("userid", userid);
cred.put("password", password);

resという名前のResourceRequestオブジェクトを作成すると、変数タイプ、URLおよびメソッドの値がOAMサーバーから戻されます。

try {
res = new ResourceRequest(type, url, method);

リクエストしたリソースresが保護されているかどうかを確認して、該当するメッセージを表示します。

if (res.isProtected())
System.out.println("Resource " + type ":" + url + " protected");
else
System.out.println("Resource " + type + ":" + url + " unprotected");
}

ResourceRequest構造体を作成できなかった場合は、エラー・メッセージtとともに障害を報告します。

catch (Throwable t) {
t.printStackTrace();
System.out.println("Failed to create new resource request");

メイン・メソッドを終了することで、事実上プログラムを終了します。

return;
}

UserSessionパラメータのuserを空に設定します。

UserSession user = null;

ResourceRequest構造体のresとAuthenticationScheme構造体のcredの値を戻す、userという名前のUserSession構造体を作成します。

try
user = new UserSession(res, cred);

UserSession構造体を作成できなかった場合は、エラー・メッセージtとともに障害を報告します。

catch (Throwable t) {
t.printStackTrace();
System.out.println("Failed to create new user session");

メイン・メソッドを終了することで、事実上プログラムを終了します。

return;
}

ユーザーが現在ログインしているかどうか、つまりこのユーザーの認証が成功しているかどうかを確認します。

try
{
if (user.getStatus() == UserSession.LOGGEDIN) {

ユーザーがログインしている場合は、location変数が空でないかどうかを確認します。locationが空でない場合は、AccessClientのlocationパラメータにこのlocation変数の値を設定し、OAMサーバーが戻すステータス・コードとともに、ユーザーがログインしていることを報告します。

if (location != null) user.setLocation(location);
System.out.println("user status is " + user.getStatus());

認可をチェックします。これを行うには、parametersが存在するかどうかを確認します。存在する場合は、parametersに格納されているパラメータをアタッチしたときにターゲット・リソースへのアクセスがユーザーに認可されるかどうかを確認します。parametersが存在しない場合は、ターゲット・リソースへのアクセスがユーザーに認可されているかどうかを確認します。

try {
if (parameters != null ? user.isAuthorized(res, parameters) :
user.isAuthorized(res)) {

存在するすべてのパラメータを指定したときにユーザーがリソースへのアクセスを認可される場合は、権限が付与されたことを報告します。

System.out.println("Permission GRANTED");

さらに、ユーザー・セッション・トークンをシリアル番号付きで表示します。

System.out.println("User Session Token =" + user.getSessionToken());

location変数が空でない場合は、その値を報告します。

if (location != null) {
System.out.println("Location = " + user.getLocation());
}

リソースへのアクセスをユーザーが認可されなかった場合は、権限が拒否されたことを報告します。

} else {
System.out.println("Permission DENIED");

UserSessionがERR_NEED_MORE_DATAを戻す場合は、nParams変数を認可に必要なパラメータの数に設定し、その数値をユーザーに報告します。

if (user.getError() == UserSession.ERR_NEED_MORE_DATA) {
int nParams = res.getNumberOfAuthorizationParameters();
System.out.print("Required Authorization Parameters (" +
nParams + ") :");

resという名前のResourceRequestオブジェクトのgetAuthorizationParametersメソッドによって戻されるハッシュテーブルのkeysパラメータの値として、eを設定します。

Enumeration e = res.getAuthorizationParameters().keys();

eに含まれているすべての要素の名前を報告します。

while (e.hasMoreElements()) {
String name = (String) e.nextElement();
System.out.print(" " + name);
}
System.out.println();
}

そうでない場合は、次の文に進みます。

else
}
}

ユーザーがログインできなかった場合は、現在のユーザー・ステータスを報告します。

else
System.out.println("user status is " + user.getStatus());

エラーが発生した場合は、認可の試行が失敗したことを報告します。

catch (AccessException ae)
System.out.println("Failed to get user authorization");
}

ここで、現行のユーザー・セッションに現在設定されているすべてのアクションを報告します。これを行うには、getActionTypesメソッドによって戻される文字列からactionTypesという名前の配列を作成します。次に、actionTypes内の各文字列をactionsという名前のハッシュテーブルに読み取ります。actionsに含まれている各キーの名前および値を報告します。

String[] actionTypes = user.getActionTypes();
for(int i =0; actionTypes[i] != null; i++){
Hashtable actions = user.getActions(actionTypes[i]);
Enumeration e = actions.keys();
int item = 0;
System.out.println("Printing Actions for type " + actionTypes[i]);
while(e.hasMoreElements()) {
String name = (String)e.nextElement();
System.out.println("Actions[" + item +"]: Name " + name + " value " +
actions.get(name));
item++;
}
}

ResourceRequestオブジェクトのresに対するauthsという名前のAuthenticationSchemeオブジェクトの作成を試みます。

AuthenticationScheme auths;
try
auths = new AuthenticationScheme(res);

AuthenticationSchemeを作成できなかった場合は、エラー・メッセージaseとともに障害を報告します。

catch (AccessException ase) {
ase.printStackTrace();

メイン・メソッドを終了することで、事実上プログラムを終了します。

return;
}

認可スキームがBasicかどうかを確認します。

try
{
if (auths.isBasic())

Basicの場合は、そのことを報告します。

System.out.println("Auth scheme is Basic");

Basicではない場合は、そのことを報告します。

else
System.out.println("Auth scheme is NOT Basic");

コピー・コンストラクタを使用して、元オブジェクトresからresNEWという名前の新規のResourceRequestオブジェクトを作成します。

ResourceRequest resNew = (ResourceRequest) res.clone();

新しくクローニングしたオブジェクトの名前を報告します。

System.out.println("Clone resource Name: " + resNew.getResource());

なんらかの理由によりResourceRequestオブジェクトがクローニングできなかった場合は、対応するトレースバックによって障害を報告します。

}
catch (Exception e) {
e.printStackTrace();
}

ResourceRequestオブジェクトresとAuthenticationSchemeオブジェクトauthsをNULLに設定し、Access SDK APIを切断します。

res = null;
auths = null;
ac.shutdown();
}
}

2.2.9 サンプル・コード: Javaでの証明書ベース認証

次のコードの抜粋では、X.509証明書を処理するアクセス・クライアントのJavaでの実装例を示しています。この抜粋は、管理者がアクセス・システムに証明書ベースの認証を構成する場合に適しています。

証明書はBase64でエンコードされている必要があります。OAMサーバーでは、ユーザーの識別にのみこの証明書を使用します。有効期間、ルート認証が信頼されているかどうかなどの検証は実行されません。

File oCertFile = new File("sample_cert.pem");
FileInputStream inStream = new FileInputStream(oCertFile);
CertificateFactory cf =
CertificateFactory.getInstance("X.509");

// cert must point to a valid java.security.cert.X509Certificate instance.
X509Certificate cert = (X509Certificate)
cf.generateCertificate(inStream);

// Convert the certificate into a byte array
byte[] encodecCert = cert.getEncoded();

// Encode the byte array using Base 64-encoding and convert it into a string
String base64EncodedCert = new String(Base64.encodeBase64 (encodedCert));

// Create hashtable to hold credentials
Hashtable creds = new Hashtable();

// Store the Base 64-encoded under the key "certificate"
cred.put("certificate", base64EncodedCert);

// Create ResourceResource request object including all information about the // // resource being accessed
ResourceRequest resourceRequest = new ResourceRequest(resourceType, resourceUrl, operation);

// Create a UserSession with the requestRequest and the cred hashtable
UserSession userSession = new UserSession(resourceRequest, creds);

// The above statement will throw an exception if the certificate cannot be mapped // to a valid user by the OAM Server.

この抜粋に関連するインポート文を次に示します。

import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.io.FileInputStream;
import oracle.security.am.common.nap.util.Base64;

2.3 メッセージ、例外およびロギング

この項では、ステータスまたはエラーを示すためにAccess SDKで使用されるメッセージおよび例外について説明します。

Access SDKにより生成される実行ログについても説明します。実行ログは、実行された操作に関する情報を提供します。たとえば、操作ステータス、発生したエラーまたは例外、およびトラブルシューティングに役立つ一般情報があります。

この項で説明する項目は、次のとおりです。

- メッセージ

- 例外

- ロギング

2.3.1 メッセージ

Access SDKは、ステータスまたはエラーの状態を示すローカライズ済メッセージをサポートします。例外としてアプリケーションに提供されるエラー・メッセージもローカライズされます。これらのローカライズ済エラー・メッセージは、Access SDKログ・ファイルに記録されます。

2.3.2 例外

次のタイプの例外は、アプリケーションにエラーの状態を示すために使用されます。

- OperationNotPermittedException
Access SDKには、一連のセッション管理APIが用意されています。権限を持つアクセス・クライアントのみが、これらのセッション管理操作を実行できます。Access SDKを初期化するには、指定のエージェント・プロファイルにAllowManagementOperationsフラグが設定されている必要があります。

アクセス・クライアントがこれらの操作の実行を許可されていない場合、11g OAMサーバーがエラーを返します。サーバーがエラーを返すと、Access SDKがこの例外をスローします。

- AccessException
操作の実行中に予期しないリカバリ不能なエラーが発生すると、Access SDK APIはAccessExceptionをスローします。

2.3.3 ロギング

Access SDKでは、ログの生成にJavaロギングAPIが使用されます。具体的には、oracle.security.am.asdkパッケージにAccessLoggerクラスが含まれ、このクラスはAccess SDKログを生成します。

Access SDKログを生成するには、アプリケーションの起動時にログ構成ファイルを指定する必要があります。このログ構成ファイルはアプリケーション実行中のJavaプロパティとして指定しますが、この場合、Javaプロパティ-Djava.util.logging.config.fileはlogging.propertiesへのパスです。

次に例を示します。

java -Djava.util.logging.config.file=JRE_DIRECTORY/lib/logging.properties

logging.propertiesファイルは、VMがロードされた直後に構成され準備が整うログ出力、ハンドラ、フォーマッタおよびフィルタの数を定義します。状況に応じて、必要なロギング・レベルを構成することもできます。

logging.propertiesファイルのjava.util.logging.FileHandler.patternプロパティに対して、ログ・ファイル・パスを指定する必要があります。ファイル名のみを指定した場合、ファイルはカレント・ディレクトリの下に作成されます。

logging.propertiesファイルの例は次のとおりです。

# "handlers" specifies a comma separated list of log Handler
# classes.  These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
# Add handlers to the root logger.
# These are inherited by all other loggers.
handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

# Set the logging level of the root logger.
# Levels from lowest to highest are
# FINEST, FINER, FINE, CONFIG, INFO, WARNING and SEVERE.
# The default level for all loggers and handlers is INFO.
.level= ALL

# Configure the ConsoleHandler.
# ConsoleHandler uses java.util.logging.SimpleFormatter by default.
# Even though the root logger has the same level as this,
# the next line is still needed because we're configuring a handler,
# not a logger, and handlers don't inherit properties from the root logger.
java.util.logging.ConsoleHandler.level =INFO
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter

# The following special tokens can be used in the pattern property
# which specifies the location and name of the log file.
#   / - standard path separator
#   %t - system temporary directory
#   %h - value of the user.home system property
#   %g - generation number for rotating logs
#   %u - unique number to avoid conflicts
# FileHandler writes to %h/demo0.log by default.
java.util.logging.FileHandler.pattern=%h/asdk%u.log

# Configure the FileHandler.
# FileHandler uses java.util.logging.XMLFormatter by default.
#java.util.logging.FileHandler.limit = 50000
#java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level=ALL

ログ出力のサンプルを次に示します。

Apr 19, 2011 5:20:39 AM AccessClient createClient
FINER: ENTRY
Apr 19, 2011 5:20:39 AM ObAAAServiceClient setHostPort
FINER: ENTRY
Apr 19, 2011 5:20:39 AM ObAAAServiceClient setHostPort
FINER: RETURN
Apr 19, 2011 5:20:39 AM ObAAAServiceClient setHostPort
FINER: ENTRY
Apr 19, 2011 5:20:39 AM ObAAAServiceClient setHostPort
FINER: RETURN
Apr 19, 2011 5:20:39 AM AccessClient createClient
FINER: RETURN
Apr 19, 2011 5:20:39 AM AccessClient initialize
FINER: read config from server, re-init if needed
Apr 19, 2011 5:20:39 AM AccessClient updateConfig
FINER: ENTRY
Apr 19, 2011 5:20:39 AM AccessClient readConfigFromServer
FINER: ENTRY
Apr 19, 2011 5:20:39 AM ObAAAServiceClient getClientConfigInfo
FINER: ENTRY
Apr 19, 2011 5:20:39 AM ObAAAServiceClient sendMessage
FINER: ENTRY
Apr 19, 2011 5:20:39 AM oracle.security.am.common.nap.util.NAPLogger log
FINER: Getting object using poolid primary_object_pool_factory
Apr 19, 2011 5:20:39 AM oracle.security.am.common.nap.util.pool.PoolLogger logEntry
FINER: PoolLogger : main entered: KeyBasedObjectPool.acquireObject
Apr 19, 2011 5:20:39 AM oracle.security.am.common.nap.util.NAPLogger log
FINEST: Creating pool with id = primary_object_pool_factory
Apr 19, 2011 5:20:39 AM oracle.security.am.common.nap.util.pool.PoolLogger log
FINER: PoolLogger:main : Maximum Objects = 1Minimum Objects1
Apr 19, 2011 5:20:39 AM oracle.security.am.common.nap.util.pool.PoolLogger logEntry
FINER: PoolLogger : main entered: constructObject
Apr 19, 2011 5:20:39 AM oracle.security.am.common.nap.ObMessageChannelImpl <init>

2.4 アクセス・クライアント・プログラムの構築

この項で説明する項目は、次のとおりです。

- 開発環境の設定

- 新規アクセス・クライアント・プログラムのコンパイル

2.4.1 開発環境の設定

必要な環境は次のとおりです。

- JDK 1.6.0以上をインストールします。

- 11g Access SDKをインストールします。

- JAVA_HOME環境変数がJDKインストール・ディレクトリを指すように定義します。たとえば、UNIX型オペレーティング・システムでは、次のコマンドを実行します。

setenv JAVA_HOME <JDK install dir>/bin

- PATH環境変数を、JAVA_HOME/binが指す場所に変更します。たとえば、UNIX型オペレーティング・システムでは、次のコマンドを実行します。

setenv PATH $JAVA_HOME/bin:$PATH

- CLASSPATH環境変数を、JDKおよびAccess SDK jarファイルを指すように変更します。たとえば、UNIX型オペレーティング・システムでは、次のコマンドを実行します。

setenv CLASSPATH $JAVA_HOME/lib/tools.jar:$ACCESSSDK_INSTALL_DIR/oamasdk-api.jar:$CLASSPATH

CLASSPATH変数に必要なすべてのjarファイルのリストは、第2.1.2項「Access SDKのインストールについて」を参照してください。

2.4.2 新規アクセス・クライアント・プログラムのコンパイル

開発環境の構成後(第2.4.1項「開発環境の設定」を参照)、次のようなコマンドを使用してアクセス・クライアント・プログラムをコンパイルできます。

Javac –cp <location of Access SDK jar> SampleProgram.java

必要に応じて、CLASSPATH、アクセス・クライアント・プログラム名などの詳細を変更します。CLASSPATHに追加するjarファイルの詳細は、第2.1.2項「Access SDKのインストールについて」を参照してください。

2.5 アクセス・クライアントの構成およびデプロイ

アクセス・クライアントの開発後、テストおよび使用の前に、実際のAccess Manager 11g環境でデプロイする必要があります。この項では、Access SDKを使用して開発されたアクセス・クライアントをデプロイする前に必要な構成手順について説明します。アクセス・クライアントのデプロイメント・プロセスは、その他のAccess Managerエージェントのデプロイメント・プロセスに類似しています。

この項の内容は次のとおりです。

- タスクの概要: カスタム・アクセス・クライアントの構成とデプロイ

- 構成要件

- 必要な構成ファイルの生成

- SSL証明書およびキー・ファイル

2.5.1 タスクの概要: カスタム・アクセス・クライアントの構成とデプロイ

次の概要では、Oracle Access Managementの管理者資格証明を使用してユーザーが実行する必要があるタスクを説明します。アクセス・クライアント・プログラムはすでに開発され、コンパイル済であることが前提です。

1. Access SDKのjarファイルを取得し、アクセス・クライアントの作成に使用するコンピュータにこれをコピーします。詳細は、第2.1.2項「Access SDKのインストールについて」を参照してください。

2. 保護対象のアプリケーションをホストしているコンピュータにアクセス・クライアントをコピーします。

3. アクセス・クライアントを構成します。

4. 必要なJava環境があることを確認します。
アクセス・クライアントがスタンドアロン環境にある場合、Java Development Kit (JDK)またはJavaランタイム環境(JRE)を使用できます。アクセス・クライアントがサーブレット・アプリケーションである場合、Java EEまたはJava EEコンテナで使用可能なJava環境を使用できます。

5. Access SDKのjarファイルがCLASSPATHにあることを確認します。JRF以外の環境(スタンドアロン・アプリケーション)を使用している場合は、必要なJPS jarファイルがCLASSPATHにあることを確認します。詳細は、第2.1.2項「Access SDKのインストールについて」を参照してください。

6. アクセス・クライアントをデプロイするには、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のコンソールを使用したエージェントおよびアプリケーションの登録に関する項を参照してください。

2.5.2 構成要件

Access SDK構成は、次のファイルで構成されます。

- ObAccessClient.xml
この構成ファイル(ObAccessClient.xml)は、Access Managerサーバーのホスト、ポート、アクセス・クライアントの動作を決定する他の構成アイテムなど、各種詳細が含まれます。たとえば、アイドル・セッション時間などがあります。

ObAccessClient.xmlを使用するかわりに、ブートストラップ構成を提供して11.1.2 Access SDKを初期化する方法もあります。アクセス・クライアントまたはアプリケーションは、独自の構成ストアまたは他のメソッドのブートストラップ構成を使用できます。OAMサーバーのホストやポート番号などの構成の詳細は、AccessClient.createDefaultInstanceを使用して呼び出すことができます。プログラムによる初期化の詳細は、Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンスを参照してください。

- cwallet.sso
このOracleウォレット・ファイルは、11gエージェントをAccess Managerに登録する際に作成されるアーティファクトです。cwallet.ssoファイルには、エージェントに対して発行されたトークンをOAMサーバーが暗号化するときに使用する秘密鍵が格納されています。

cwallet.ssoファイルは、他のファイルと同じ場所に保存することも、他の場所に保存することもできます。そのパスをjps-config.xmlで、jps-config.xmlの位置に対する相対パスとして宣言する必要があります。

- jps-config.xml
このファイルは、cwallet.ssoファイルを読み込むためのライブラリで必要とされます。このファイルは、Access SDKの構成ディレクトリに格納されている必要があります。次のいずれかの場所に格納できます。

- デフォルトでは、<current working dir>/config/jps-config.xml (クライアント・インストールzipファイルを解凍すると、テンプレートが抽出されます)です。ここで、<current working dir>は、クライアント・インストールzipファイルを解凍したディレクトリです。または

- -Doracle.security.jps.config=jps-config.xml file locationで指定できます。ファイルの場所をJavaコマンドでプロパティとして渡す必要があります。

サンプルのjps-config.xmlファイルがクライアント・インストール・パッケージzipファイルに含まれています。

- SSL用のJKSキーストア
このファイルは、トランスポート・セキュリティ・モードが簡易または証明書である場合のみ必要です。10g OAMサーバーおよび11g OAMサーバーのどちらも、エージェントとの通信においてオープン、簡易および証明書のトランスポート・セキュリティ・モードをサポートしています。資格証明は、Oracle Access Protocol (OAP)を使用して渡されます。OAPをオープン・モードで使用すると、通信が傍受に対して脆弱になるため、本番環境ではオープン・モードで使用しないでください。オープン・モードは、テスト環境でのみ使用してください。

Access SDKを使用して開発されたアクセス・クライアントは、エージェントと呼ばれます。OAMサーバーが構成されているモードによっては、アクセス・クライアントを同じモードで通信するよう構成する必要があります。

すべての10gエージェントで同じグローバル・キーを共有する10gエージェントと異なり、11gエージェントはそれぞれ固有のエージェント・キーを持ちます。11gエージェント・キーはcwallet.ssoに格納されています。このキーを使用して、11g形式のSSOトークン、accessClientPasswd、および簡易または証明書トランスポート・セキュリティ・モードで使用されるグローバル・パスフレーズ(password.xmlに格納)が暗号化されます。マスター・トークンから有効範囲付きセッション・トークンを取得した場合を除き、1つのエージェントに対して発行されたSSOトークンを別のエージェントに直接使用できません。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

トランスポート・セキュリティ・モードが簡易または証明書の場合、次のものが必要です。

- oamclient-truststore.jks

- oamclient-keystore.jks

- password.xml

詳細は、第2.1.3.2項「アクセス・クライアントのアーキテクチャ」および第2.5.3項「必要な構成ファイルの生成」を参照してください。

- password.xml
このファイルは、トランスポート・セキュリティ・モードが簡易または証明書である場合のみ必要です。このファイルには、パスワードが暗号化された形式で含まれます。このパスワードは、SSLキー・ファイルの保護に使用されます。

詳細は、第2.5.3項「必要な構成ファイルの生成」を参照してください。

- ログ構成
ログ・ファイルを生成するために必要です。詳細は、2.3.3項「ロギング」を参照してください。

2.5.3 必要な構成ファイルの生成

ObAccessClient.xml構成ファイルを取得するには、管理コンソールまたはリモート登録ツールを使用して、アクセス・クライアントを10gまたは11gエージェントとしてOAM 11gサーバーに登録します。11gエージェントの登録時には、cwallet.ssoファイルも作成されます。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

管理コンソールでは、password.xmlファイルも作成されます。

oracle.security.am.asdk APIで開発されたアクセス・クライアント・アプリケーションは、構成ファイルおよびその他の必要なファイルを取得するための場所を指定できます。このためには、Access SDKを初期化し、構成ファイルが存在するディレクトリの場所を指定します。

構成ファイルの場所をAccess SDKに指定するオプションの詳細は、Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンスを参照してください。

2.5.4 SSL証明書およびキー・ファイル

11g Access SDKでは、一般に信頼ストアまたはキー・ストアとして知られるデータベースのSSL証明書およびキー・ファイルを使用します。これらのストアはJKS (Java Key Standard)形式である必要があります。

2.5.4.1 簡易トランスポート・セキュリティ・モード

簡易トランスポート・モードでは、OAMサーバーによってJKSキーストアが自動生成されます。生成されたキーストアは、WLS_OAM_DOMAIN_HOME/output/webgate-ssl/に保存されます。

2.5.4.2 「証明書」トランスポート・セキュリティ・モード

証明書トランスポート・セキュリティ・モードでは、サーバーおよびエージェントの証明書を認証局にリクエストする必要があります。オプションにより、証明書モード証明書を発行する目的で、簡易モードの自己署名証明書を認証局として使用することもできます。

証明書モードを準備するには、次の手順を実行します。

1. アクセス・クライアントおよびOAMサーバーに対して発行された証明書とキーのペアを使用して、認証局のCA証明書をインポートします。第2.5.4.2.1項「CA証明書のインポート」の手順を実行してください。cacert.pemまたはcacert.derのかわりに、発行局のCA証明書ファイルを使用します。

2. 10g JNI ASDKがインストールされている場合、アクセス・クライアントの証明書およびキー・ファイルを生成できます。これらの証明書はPEM形式となります。
インポートされたCA証明書を使用した証明書の生成方法の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

この証明書とキーのペアをPEM形式でoamclient-keystore.jksにインポートするには、第2.5.4.2.2項「キーストアの設定」の手順を実行します。

2.5.4.2.1 CA証明書のインポート

11g Java Access SDKを使用する場合、この手順は必要ありません。

10g JNI SDKを使用する場合は、CA証明書を信頼ストアにインポートする必要があります。10g Access SDKは、簡易モードで使用できる自己署名付きCA証明書を提供し、アクセス・クライアントに証明書を発行するために使用されます。11g OAMサーバーは自己署名付きCA証明書を提供します。

- 10g Access SDK: CA証明書(cacert.pem)は、ASDK_INSTALL_DIR/oblix/tools/openssl/simpleCAに配置されます。

- OAM 11gサーバー: CA証明書(cacert.der)は、$MIDDLEWARE_HOME/user_projects/domains/base_domain/config/fmwconfigに配置されます。

次のコマンドを実行して、PEMまたはDER形式のCA証明書を信頼ストアにインポートします。

1. テキスト・エディタを使用してcacert.pemまたはcacert.derを編集し、CERTIFICATEブロック内に含まれるデータを除くすべてのデータを削除し、ファイルを保存します。次に例を示します。

-----BEGIN CERTIFICATE-----
Content to retain
-----END CERTIFICATE-----

2. 次のコマンドを実行し、必要に応じて環境にあわせて変更します。
keytool -importcert -file <ca cert file cacert.pem or cacert.der> -trustcacerts -keystore oamclient-truststore.jks -storetype JKS

3. プロンプトが表示されたら、キーストアのパスワードを入力します。これは、OAMサーバーで使用されるグローバル・パス・フレーズと同じである必要があります。

2.5.4.2.2 キーストアの設定

アクセス・クライアントのSSL証明書および秘密鍵ファイルをキーストアに追加する必要があります。アクセス・クライアントがOAMサーバーと通信できるように、SSL証明書および秘密鍵ファイルは簡易モードで生成する必要があります。

- 10g Access SDK: アクセス・クライアントの証明書およびキー・ファイルの生成を提供します。これらの証明書はPEM形式です。

- 11g OAMサーバー: リモート登録ツールおよび管理コンソールを使用して、アクセス・クライアントの証明書(aaa_cert.pem)およびキー・ファイル(aaa_key.pem)をPEM形式で生成します。

キーストアoamclient-keystore.jksに証明書およびキー・ファイルをインポートするには、次のコマンドを実行します。

1. テキスト・エディタを使用してaaa_cert.pemを編集し、CERTIFICATEブロック内に含まれるデータを除くすべてのデータを削除し、ファイルを保存します。次に例を示します。

-----BEGIN CERTIFICATE-----
Content to retain
-----END CERTIFICATE-----

2. 次のコマンドを実行し、必要に応じて環境にあわせて変更します。
openssl pkcs8 -topk8 -nocrypt -in aaa_key.pem -inform PEM -out aaa_key.der -outform DER

このコマンドにより、パスワードの入力が要求されます。パスワードはグローバル・パス・フレーズである必要があります。

3. 次のコマンドを実行し、必要に応じて環境にあわせて変更します。
openssl x509 -in aaa_cert.pem -inform PEM -out aaa_cert.der -outform DER

4. 次のコマンドを実行し、必要に応じて環境にあわせて変更します。
java -cp importcert.jar oracle.security.am.common.tools.importcerts.CertificateImport -keystore oamclient-keystore.jks -privatekeyfile aaa_key.der -signedcertfile aaa_cert.der -storetype jks -genkeystore yes

このコマンドでは、aaa_key.derおよびaaa_cert.derはDER形式の秘密鍵と証明書のペアです。

5. プロンプトが表示されたら、キーストアのパスワードを入力します。これはグローバル・パス・フレーズと同じである必要があります。

2.6 互換性: 11gと10gのAccess SDKおよびAPI

この項で説明する項目は、次のとおりです。

- 11g Access SDKの互換性

- 10g JNI ASDKと11g Access SDKの互換性

- 非推奨: 10g JNI ASDK

11g Access Manager APIにより、開発者はカスタム・アクセス・クライアント・コードをJavaで記述できますが、これは10g (10.1.4.3) Javaアクセス・クライアントと機能的に同等です。Access Manager 11gにより、JavaコードはAPI内の基礎となるJavaバイナリと通信します。

組込みの自動Javaガベージ・コレクタにより、未使用のオブジェクトのメモリーはガベージ・コレクタが適切と見なした場合に割当て解除されます。ガベージ・コレクタでは、オブジェクトがいつクリーン・アップされるかは保証されませんが、オブジェクトが参照されなくなった場合にすべて破棄され、メモリー・リークが発生しないことが保証されます。

10gおよび11g Access Manager APIの機能は、7つの基本クラスで編成されています。表2-3に、Java言語プラットフォームの対応するクラス名をリストします。

表2-3 比較: 11gおよび10g Access APIクラス

クラスの用途

11g Javaクラス

10g Javaクラス

ユーザー認証を処理するための構造体を作成および操作する

oracle.security.am.asdkのAuthenticationSchemeクラス

ObAuthenticationSchemeはObAuthenticationSchemeInterfaceを実装する

リソースに対するユーザー・リクエストを処理するための構造体を作成および操作する

oracle.security.am.asdkのResourceRequestクラス

ObResourceRequestはObResourceRequestInterfaceを実装する

ユーザー・セッションを処理するための構造体を作成および操作する。ユーザー・セッションは、ユーザー認証とともに開始され、ユーザーがログオフするかタイムアウトになると終了する。

ユーザーの統合セッションを処理するための構造体を作成および操作する。セッションは、ユーザーの初回認証時に開始され、ユーザーがログオフするかセッション・タイムアウトになると終了する。

oracle.security.am.asdkのUserSessionクラス

oracle.security.am.asdkのPseudoUserSessionクラス

ObUserSessionはObUserSessionInterfaceを実装する

ObPseudoUserSession

アクセス・クライアント構成情報を取得および変更する

oracle.security.am.asdkのAccessClientクラス

ObConfig

Access Manager APIによってスローされるエラーを処理する

oracle.security.am.asdkのAccessException、OperationNotPermittedException

ObAccessException

構成の変更をコール元アプリケーションに通知する。

oracle.security.am.asdkのConfigUpdateCallbackクラス

2.6.1 11g Access SDKの互換性

11g Access SDKは、10g JNI ASDKでサポートされている機能を実装しています。この機能は、これを使用して10gと11g両方のOAMサーバーとシームレスに連携するカスタム・アクセス・クライアントを開発できるように実装されています。

また、Access SDKには、11g OAMサーバーでのみ使用できる新機能および変更された機能が実装されています。したがって、Access SDKではアプリケーションが10g OAMサーバーでこの機能の使用を試みるかどうかを正常に検出できます。

11g Access SDK (oracle.security.am.asdk)の新機能は次のとおりです。

- 指定されたユーザーのセッションの列挙

- 指定されたセッションの終了

- 指定されたユーザー・セッションでの属性の設定

- 指定されたセッションで設定された属性の取得

- セッションを確立せずにユーザー資格証明を検証

- セッションを確立せずにユーザー資格証明を検証し、同じリクエストで認可を実行

注意:

最後の2つの機能は、Access Manager 11g Access SDKのcom.oblix.accessパッケージでも提供されています。

さらに、Access SDKはサーバー側のセッションを削除するユーザー・ログアウト機能の変更済実装を提供します。この機能は、10g OAMサーバーではサポートされていません。

2.6.2 10g JNI ASDKと11g Access SDKの互換性

10g JNI ASDKと11g Access SDKバージョンのcom.oblix.accessパッケージの間には1対1の対応関係があります。

10g JNI ASDKを使用して開発されたカスタム・アクセス・クライアントは、コードの変更なしで引き続き11g Access SDKで動作できます。

11g Access SDK com.oblix.accessパッケージには、次のクラスが追加されています。

- ObPseudoUserSession: このクラスは、11g OAMサーバーのみで使用できる次の機能を提供します。

- セッションを確立せずにユーザー資格証明を検証します。

- セッションを確立せずにユーザー資格証明を検証し、同じリクエストで認可を実行します。

- ObAccessRuntimeException: このクラスは、ObAuthenticationSchemeクラスおよびObResourceRequestクラスを使用する操作の実行中にランタイム・エラーを示します。

2.6.3 非推奨: 10g JNI ASDK

11g Access SDKは、10g JNI ASDK com.oblix.accessパッケージのインタフェースをサポートします。ただし、com.oblix.accessのすべてのAPIが非推奨としてマークされています。これらのAPIは、将来のAccess Manager 11g Access SDKリリースにおいて拡張もサポートもされません。

開発者はあらゆる新規開発において11g Access SDKを使用することを強くお薦めします。

2.7 旧アプリケーションの移行またはコードの変換

この項では、11g Access SDKを使用する場合に実行する移行プロセスを説明します。次の理由から、Access SDKへの移行が必要となる場合があります。

- アプリケーションを移行することで、これらのアプリケーションにおけるAccess SDKの使用方法を変更せずに、10g JNI ASDKのcom.oblix.access APIを、11g Access SDKの対応するAPIと置き換えます。

- アプリケーション・コードを移行することで、com.oblix.access (これは下位互換性のために11g Access SDKでサポートされます)のかわりにoracle.security.am.asdk APIを使用するようにします。

この項には次のトピックが含まれます。

- 開発およびランタイム環境の変更

- アプリケーションの移行

- コードの変換

2.7.1 開発およびランタイム環境の変更

アプリケーションを移行する前に、開発環境が構成されていることを確認します。また、11g Access SDKが正しく構成されていることを確認します。詳細は、第2.5項「アクセス・クライアントの構成およびデプロイ」を参照してください。

2.7.2 アプリケーションの移行

10g com.oblix.accessパッケージで開発されたアクセス・クライアントおよびプラグインを、11g OAMサーバーで動作するよう移行できます。この項では、10g JNI ASDKで記述されたプログラムを11g OAMサーバーで使用する方法を説明します。

注意:

10g JNI ASDKと11g Access SDKのcom.oblix.access APIにおける類似点と相違点の詳細は、第2.6.2項「10g JNI ASDKと11g Access SDKの互換性」を参照してください。

10g JNI ASDKおよび11g Access SDKで提供されているクラスおよびインタフェースのサポートは同じです。

通常、11g Access SDKのcom.oblix.accessクラスを使用するためにアプリケーションを移行する場合、アプリケーション・コードを変更または再コンパイルする必要はありません。

新しいランタイム例外のObAccessRuntimeExceptionはcom.oblix.accessパッケージに導入されています。この例外は、AuthenticationSchemeクラスおよびResourceRequestクラスの操作時にスローされます。

アプリケーション・コードで正しい例外処理を実行することをお薦めします。これを実行した場合、アプリケーションを11g Access SDK jarファイルで再コンパイルする必要があります。

2.7.2.1 移行に固有の構成

この説明では、10g ASDKコンポーネントがインストールされており、OAMサーバーで構成されていることを前提としています。このシナリオでは、10g JNI ASDKを使用して開発された既存のアクセス・クライアント・アプリケーションを使用します。前提は次のとおりです。

- 第2.5.2項「構成要件」にリストした構成アイテムは、10g ASDKのインストール・ディレクトリ(ASDK_INSTALL_DIR)から参照されます。

- ASDK_INSTALL_DIR/access/oblix/libからObAccessClient.xmlが読み取られます。

- トランスポート・セキュリティ・モードが簡易または証明書である場合、ASDK_INSTALL_DIR/access/oblix/configからpassword.xmlが読み取られます。

簡易モード

10g ASDKコンポーネントを簡易モードで構成するには、10gリリースのOracle Access Manager管理ガイドを参照してください。

次のステップを実行します。

1. aaa_cert.pemおよびaaa_key.pemファイルをoamclient-keystore.jksにインポートします。
aaa_cert.pemおよびaaa_key.pemファイルは、ASDK_INSTALL_DIR/access/oblix/config/simpleに置かれています。

2. 簡易モード証明書の発行に使用される自己署名CA証明書を、ASDK_INSTALL_DIR/access/oblix/tools/openssl/simpleCAに置きます。

3. 自己署名CA証明書をoamclient-truststore.jksにインポートします。

4. 第2.5.4項「SSL証明書およびキー・ファイル」の手順を実行し、証明書およびキー・ファイルをJKSストアにインポートします。

5. JKSストアをASDK_INSTALL_DIR/access/oblix/config/simpleにコピーします。

証明書モード

10g ASDKコンポーネントを証明書モードで構成するには、10gリリースのOracle Access Manager管理ガイドを参照してください。

次のステップを実行します。

1. aaa_cert.pemおよびaaa_key.pemファイルをoamclient-keystore.jksにインポートします。aaa_chain.pemをoamclient-truststore.jksにインポートします。
aaa_cert.pem、aaa_key.pemおよびaa_chain.pemファイルは、ASDK_INSTALL_DIR/access/oblix/configに置かれています。

2. 第2.5.4項「SSL証明書およびキー・ファイル」の手順を実行し、証明書およびキー・ファイルをJKSストアにインポートします。

3. JKSストアをASDK_INSTALL_DIR/access/oblix/config/simpleにコピーします。

構成ファイルの場所

com.oblix.access APIを使用するために移行されたアクセス・クライアント・アプリケーションでは、10g JNI ASDK構成ファイルの場所を次のように指定できます。

- ASDKの初期化中に、10g ASDKがインストールされているディレクトリの場所を指定します。または、

- 10g JNI ASDKがインストールされているディレクトリの場所を指す、環境変数OBACCESS_INSTALL_DIRを設定します。

これによって、11g Access SDKは、渡された場所に基づいて必要なファイルのパスを判別します。

環境

環境を設定するには、第2.4.1項「開発環境の設定」の手順を実行します。10g JNI ASDKのファイル名はjobaccess.jarです。jobaccess.jarがCLASSPATHにある場合、削除する必要があります。

2.7.3 コードの変換

この項では、10g JNI ASDKで記述されたプログラムをAccess Manager 11gで使用する方法を説明します。

11g Java Access SDKは、com.oblix.accessパッケージの10g JNI ASDK APIの機能をサポートしています。同じ機能を11g Access SDKに実装することで、10g JNI ASDKとの下位互換性を実現しています。ただし、com.oblix.accessのAPIはすべて非推奨です。これらのAPIは、将来の11g Access SDKリリースにおいて拡張もサポートもされません。

oracle.security.am.asdkパッケージには、新規の認証および認可APIが含まれます。com.oblix.accessパッケージが提供する機能の他に、oracle.security.am.asdkパッケージには、11g OAMサーバーの機能を利用する拡張機能も含まれています。

2.7.3.1 10g JNI ASDKと11g Access SDKの相違点の理解

次の表は、10g JNI SDK com.oblix.access packageのAPIと11g Access SDK oracle.security.am.asdkパッケージのAPIを比較したものです。必要に応じて、10g JNI ASDKと11g Access SDKのクラスの対応関係も示しています。

表2-4 パッケージの相違点: com.oblix.accessとoracle.security.am.asdk

JNI ASDK com.oblix.accessパッケージ

Access SDK oracle.security.am.asdkパッケージ

インタフェースの要約:

- ObAuthenticationSchemeInterface

- ObResourceRequestInterface

- ObUserSessionInterface

インタフェースの要約:

なし

クラスの要約:

- ObAuthenticationScheme

- ObConfig

- ObDiagnostic

- ObResourceRequest

- ObUserSession

クラスの要約:

- AuthenticationScheme

- AccessClient

- Supported through AccessClient

- ResourceRequest

- UserSession

- PseudoUserSession

- BaseUserSession

例外の要約:

ObAccessException

例外の要約:

- AccessException

- OperationNotPermittedException

列挙の要約:

なし

列挙の要約:

AccessClient.CompatibilityMode.OAM_10G

AccessClient.CompatibilityMode.OAM_11G

11g Access SDKには、Oracle Access Manager 10g JNI SDKのAPIに機能的に類似した新規のAPIセットが含まれますが、インタフェースが新しくなっているので注意してください。

2.7.3.2 コードの変換

10g JNI ASDKを使用して実装されたアプリケーション・コードを移行して、11g Access SDKと同じ機能を実現できます。この項では、既存のアプリケーション・コードを変更して、11g Access SDKの新しいAPIを使用する方法を説明します。

2.7.3.2.1 Access SDKの初期化および非初期化

10g JNI SDKでは、com.oblix.access.ObConfigクラスがASDKの初期化および非初期化を実行する機能を提供します。11g Access SDKでは、oracle.security.am.asdk.AccessClientがこの機能を提供します。

10g JNI SDKと同様に、アクセス・クライアント・アプリケーション・インスタンスは指定された構成で動作できます。

要件に応じて、AccessClientクラスを次の2通りに使用できます。

- createDefaultInstance静的関数を使用して、AccessClientクラスの単一インスタンスを作成できます。このクラスのデフォルト・インスタンスは1つのみ使用できます。アクセス・クライアント・アプリケーションの単一インスタンス内でこのメソッドを複数回起動すると、例外が発生します。
createDefaultInstanceメソッドを使用する場合、AuthenticationScheme、ResourceRequestまたはUserSessionクラスのいずれかをインスタンス化する際には、このメソッドを使用して取得したAccessClientクラス・インスタンスを使用する必要があります。

これらのクラスをインスタンス化する際にAccessClientインスタンスを指定しないと、デフォルトのインスタンスが使用されます。

AccessClientオブジェクトを初期化するとき、AccessClient.CompatibilityMode.OAM_10GまたはAccessClient.CompatibilityMode.OAM_11Gを渡すことができます。指定しないと、デフォルトのOAM_11Gが使用されます。その場合、11gエージェントが登録されており、必要な11gエージェント構成ファイルが適切に設定されていることを確認してください。

- createInstance静的関数を使用して、指定の構成で初期化された新規のAccessClientクラス・インスタンスを作成できます。このクラスが必要とされるのは、このクラスがアクセス・クライアント・アプリケーションの同じ実行中インスタンス内にあり、アプリケーションが様々なAccess Managerシステムまたは構成で動作する必要がある場合です。各AccessClientクラス・インスタンスは、アクセス・クライアント・インスタンスの構成時に適切なログ出力名を渡すことで、メッセージを別のログ・ファイルに記録できます。
AccessClientオブジェクトを初期化するとき、AccessClient.CompatibilityMode.OAM_10GまたはAccessClient.CompatibilityMode.OAM_11Gを渡すことができます。指定しないと、デフォルトのOAM_11Gが使用されます。その場合、11gエージェントが登録されており、必要な11gエージェント構成ファイルが適切に設定されていることを確認してください。

createInstanceメソッドを使用する場合、AuthenticationScheme、ResourceRequestまたはUserSessionクラスをインスタンス化する際に、このメソッドを使用して取得されたAccessClientクラス・インスタンスを使用する必要があります。これらのクラスをインスタンス化する際にAccessClientインスタンスを指定しないと、デフォルトのインスタンスが使用されます。

アプリケーションの停止時に、AccessClientクラスのshutdownメソッドを起動して、次の例に示すように非初期化を実行します。

- 10g JNI ASDKの場合

Public static void main (String args[]) {
try {
ObConfig.Initialize (); // Configuration is read from the location pointed by OBACCESS_INSTALL_DIR
// environment variable

または

ObConfig.Initialize (configLocation); //Configuration is read from the location provided
………..
}catch (ObAccessException e){
}
ObConfig.shutdown();
}//main ends here

- 11g Access SDKの場合

import java.io.*;
import java.util.*;
import oracle.security.am.asdk.*; //Import classes from OAM11g Access ASDK
…………..
Public static void main (String args[]) {
try {
ac = AccessClient.createDefaultInstance (“”, AccessClient.CompatibilityMode.OAM_10G); // Refer to Oracle Fusion Middleware Access SDK Java API Reference for Oracle Access Management Access Manager

または

AccessClient.createInstance(“”,AccessClient.CompatibilityMode.OAM_10G); // Refer to Oracle Fusion Middleware Access SDK Java API Reference for Oracle Access Management Access Manager
………..
}catch (AccessException e){
}
ac.shutdown();
}//main ends here

2.7.3.2.2 アクセス操作の実行

表2-4に示すように、アクセス操作の実行に使用されるクラス間には1対1マッピングがあります。oracle.security.am.asdkのクラスは、AuthenticationScheme、ResourceRequestおよびUserSessionです。

AccessClientクラスのインスタンス化の方法に応じて、これらのクラスの対応するコンストラクタを使用します。

10g JNI ASDKと同様に、初期化時またはアクセス操作の実行中に発生したエラーは例外として報告されます。AccessExceptionは、次の例に示すように、11g Access SDKで使用される例外クラスです。

- 10g JNI ASDKの場合

Public static void main (String args[]) {
try {
ObConfig.Initialize (); // Configuration is read from the location pointed by OBACCESS_INSTALL_DIR
// environment variable
ObResourceRequest rrq = new ObResourceRequest(ms_protocol, ms_resource,ms_method);
if (rrq.isProtected()) {
System.out.println("Resource is protected.");
ObAuthenticationScheme authnScheme = new ObAuthenticationScheme(rrq);
if (authnScheme.isForm()) {
System.out.println("Form Authentication Scheme.");
Hashtable creds = new Hashtable();
creds.put("userid", ms_login);
creds.put("password", ms_passwd);
ObUserSession session = new ObUserSession(rrq, creds);
if (session.getStatus() == ObUserSession.LOGGEDIN) {
if (session.isAuthorized(rrq)) {
System.out.println("User is logged in and authorized for the
request at level " + session.getLevel());
} else {
System.out.println("User is logged in but NOT authorized");
}
} else {
System.out.println("User is NOT logged in");
}
} else {
System.out.println("non-Form Authentication Scheme.");
}
} else {
System.out.println("Resource is NOT protected.");
}
}catch (ObAccessException oe) {
System.out.println("Access Exception: " + oe.getMessage());
}
ObConfig.shutdown();
}//main ends here

- 11g Access SDKの場合

import java.io.*;
import java.util.*;
import oracle.security.am.asdk.*; //Import classes from OAM11g Access ASDK

Public static void main (String args[]) {
AccessClient ac;
try {
ac = AccessClient.createDefaultInstance(“”,
AccessClient.CompatibilityMode.OAM_10G);

ResourceRequest rrq = new ResourceRequest(ms_protocol,ms_resource, ms_method);

if (rrq.isProtected()) {
System.out.println("Resource is protected.");
AuthenticationScheme authnScheme =new AuthenticationScheme(rrq);
if (authnScheme.isForm()) {
System.out.println("Form Authentication Scheme.");
Hashtable creds = new Hashtable();
creds.put("userid", ms_login);
creds.put("password", ms_passwd);
creds.put("ip", ms_ip);
creds.put("operation", ms_method);
creds.put("resource", ms_resource);
creds.put(“targethost”, ms_targethost);

UserSession session = new UserSession(rrq, creds);
if (session.getStatus() == UserSession.LOGGEDIN) {
if (session.isAuthorized(rrq)) {
System.out.println("User is logged in " +
"and authorized for the request " +"at level " + session.getLevel());
} else {
System.out.println("User is logged in but NOT authorized");
}
} else {
System.out.println("User is NOT logged in");
}
}
}catch (AccessException oe) {
System.out.println("Access Exception: " + oe.getMessage());
}
ac.shutdown();
} //main ends here

2.8 ベスト・プラクティス

この項では、様々な問題を回避する方法や、開発中に頻繁に発生する問題を解決するための方法をいくつか説明します。この項で説明する項目は、次のとおりです。

- アクセス・クライアントでの問題の回避

- アクセス・クライアントに関する問題の特定と解決

- 環境に関する問題の解決

- 高負荷環境のためのチューニング

2.8.1 アクセス・クライアントでの問題の回避

作成したアクセス・クライアントでの問題発生を回避するための提案を次に示します。

- アクセス・クライアントが適切なOAMサーバーに接続しようとしているかを確認します。

- OAMサーバーについての構成情報とアクセス・クライアントについての構成情報が一致するようにします。管理コンソールを使用して、OAMサーバー上のアクセス・クライアントの構成情報を確認できます。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のエージェントおよびアプリケーションの登録に関する項を参照してください。

- OAMサーバーとの接続や切断をきれいに行うには、AccessClientクラスのinitializeメソッドおよびshutdownメソッドを使用します。

- 環境変数OBACCESS_INSTALL_DIRをWindowsまたはUNIXのようなホスト・コンピュータ上で設定し、アクセス・クライアントをコンパイルおよびリンクできるようにする必要があります。一般的に、この変数は、アクセス・クライアントを実行する場合にも必ず設定しておく必要があります。

- 開発中に問題を捕捉したり報告するには、カスタム・アクセス・クライアント・コードの作成に使用した言語の例外処理機能(try、throwおよびcatch)を使用します。

2.8.1.1 スレッド・セーフ・コード

アクセス・クライアントは、マルチスレッド・アプリケーション全体でただ1つのスレッドとなります。

そうした環境でも安全に操作できるよう、開発者は次のガイドラインを順守することをお薦めします。

- シングル・スレッド関数ではなく、スレッド・セーフ関数を使用します。たとえば、localtimeでなくlocaltime_rを使用します。

- マルチスレッド機能がサポートされるよう、適切なビルド環境とコンパイラ・フラグを指定します。たとえば、-D_REENTRANTを使用します。また、UNIX型プラットフォームでは-mt、Windowsプラットフォームでは/MDを使用します。

- FILEポインタなどのスレッド・セーフ方式の共有ローカル変数は注意して使用してください。

2.8.2 アクセス・クライアントに関する問題の特定と解決

アクセス・クライアントが実行に失敗したかどうかの確認点を次に示します。

- OAMサーバーが実行中であることを確認します。Windowsシステムでこれを確認するには、「コンピュータの管理」、「サービス」、「AccessServer」の順にナビゲートします。AccessServerは、アクセス・クライアントを接続するOAMサーバーの名前です。

- アクセス・クライアントがユーザー・ログアウトを実行することを確認し、OAMサーバー側のセッションが必ず削除されるようにします。ユーザー・セッションが蓄積すると、ユーザー認証に失敗する可能性があります。

- コードが想定しているドメイン・ポリシーが正しく存在し、有効化されていることを確認します。

- リリース・ノートの確認

- アクセス・システムの低位レベルのポリシーが、検査中のポリシーをオーバーライドして、アクセス・クライアントに応答しないようにします。

- 11gアクセス・テスターを使用すると、特定のリソースにどのポリシーが適用されるかを確認できます。アクセス・テスターの使用方法およびアプリケーション・ドメインによるリソースの保護の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

2.8.3 環境に関する問題の解決

この項では、11g Java Access SDKの使用時に発生する可能性のある環境の競合を解消するための情報を提供します。

2.8.3.1 Java EEコンテナ

11g Java Access SDKを使用するWebアプリケーションで、Javaクラス・バージョンの競合を解消するには、次の手順に従ってください。

Access SDKによって使用されるライブラリと異なるバージョンのライブラリが、同じJava EEコンテナにホストされている別のアプリケーションによってロードされると、競合が発生します。表示される可能性のあるエラー・メッセージのサンプルを次に示します。

oracle/security/am/common/aaaclient/ObAAAServiceClient.&lt;init&gt;(Ljava/lang
/String;[CILjava/lang/String;Ljava/lang/String;[C[CZIJJLjava/lang/Integer;Ljava/u
til/List;Ljava/util/List;)V
at oracle.security.am.asdk.AccessClient.createClient(AccessClient.java:798)
at oracle.security.am.asdk.AccessClient.initialize(AccessClient.java:610)
at oracle.security.am.asdk.AccessClient.&lt;init&gt;(AccessClient.java:527)
at
oracle.security.am.asdk.AccessClient.createDefaultInstance(AccessClient.java:234)
at com.newco.authenticateIdentity.AuthenticateIdentityAccessClient.authenticateUser(
AuthenticateIdentityAccessClient.java:52)

この問題は、Java EEコンテナへのクラスのロード方法に関係しています。詳細は、使用しているコンテナの、クラスのロードについて記載されたドキュメントを参照してください。

この問題を解消するには、特定のライブラリ・バージョンを必要とするWebアプリケーションに対してクラス・ローダー・フィルタリングを構成します。詳細と手順は、使用しているアプリケーション・サーバーのドキュメントを参照してください。

2.8.3.2 Oracle WebLogic Server

システム・クラス・ローダーを使用してロードするかわりに、WebLogic Server FilteringClassLoaderを使用すると、アプリケーションから常にロードされるパッケージを指定できます。

この問題を解決するには、次の手順を実行します。

1. weblogic-application.xmlファイルがアプリケーションのMETA-INFフォルダに存在することを確認します。存在しない場合は、このファイルを作成して次のコメントを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-application/1.0/we
blogic-application.xsd"
xmlns="http://www.bea.com/ns/weblogic/weblogic-application">

<prefer-application-packages>
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-application/1.0/we
blogic-application.xsd"
xmlns="http://www.bea.com/ns/weblogic/weblogic-application">

<prefer-application-packages>
<package-name>Package to be loaded</package-name>
<package-name>Package to be loaded</package-name>
</prefer-application-packages>
</weblogic-application>

ここで、Package to be loadedはログ・ファイルにある対応するパッケージです。たとえば、問題のあるのがObAAAServiceClientとすると、対応するパッケージ名はoracle.security.am.common.aaaclientです。この場合、次のように追加します。

<package-name>oracle.security.am.common.aaaclient.*<package-name>

バージョンが異なる同一のクラスがシステム・クラス・ローダーのCLASSPATHで指定されていても、このパッケージに関連付けられたすべてのクラスがアプリケーション・ローダーによってロードされます。

2. アプリケーションを停止します。

3. 以前デプロイしたバージョンのアプリケーションを削除します。

4. アプリケーションをインストールします。

5. リソースにアクセスします。
エラーが解消され、アプリケーションが正常に動作します。

2.8.3.3 その他のアプリケーション・サーバー

どのアプリケーション・サーバーにも構成ファイルがあり、そのファイルでクラスのロードに関連するオプションが構成されます。一般に、特定のクラス・ローダーで一連のクラスをロードできるようにするために必要な構成ファイルとタグを特定することが鍵となります。

1. アプリケーション・サーバーの構成ファイルを特定します。

2. アプリケーション・クラス・ローダーを使用して、クラスがCLASSPATHで指定されていても親クラス・ローダーによってロードされないようにします。

3. デフォルトのクラスのロード動作を変更して、現在のクラス・ローダーがクラスのロードに失敗した場合にのみ親クラス・ローダーがコールされるようにします。

4. または、WebLogic Serverのように、指定のクラス・ローダーを使用してクラスをロードできる方法が存在する場合もあります。

5. アプリケーション・サーバーによっては、アプリケーション用に親ドメインとは別のドメインを定義し、親を最後にロードするようクラスのロード動作を設定する必要がある場合もあります。

2.8.4 高負荷環境のためのチューニング

高負荷で高ストレスな環境では、11g Access SDKの環境を次のようにチューニングしてください。

- ユーザー定義パラメータとしてpoolTimeoutを構成します。poolTimeoutのクライアント数を増やしてください。

- 最大接続数を調整します。パフォーマンスを向上させるためには、プライマリ・サーバーの最大接続数をエージェント・プロファイルで設定する必要があります。

3 カスタム認証プラグインの開発

OAMサーバーでは、保護対象とするリソースへのアクセスを制限するために、認証と認可の両方の制御が利用されます。認証は特定の認証スキームにより制御され、認証スキームは、ユーザーがリソースへのアクセス試行時に入力した資格証明をテストする、1つ以上のプラグインに依存します。プラグインは、OAMサーバーのインストールで提供される標準セット、または独自のJava開発者が作成したカスタム・プラグインから取得できます。この章の内容は次のとおりです。

- 第3.1項「認証プラグインの概要」

- 第3.2項「マルチステップ認証フレームワークの概要」

- 第3.3項「プラグイン・インタフェースの概要」

- 第3.4項「サンプル・コード: カスタム・データベース・ユーザー認証プラグイン」

- 第3.5項「認証プラグインの開発」

参照:

Oracle Access Management管理コンソールを使用した認証プラグインのデプロイおよび管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

3.1 認証プラグインの概要

11gは、初期状態ですぐに使用できる認証モジュールの他に、次のものを提供します。

- カスタマイズされた認証モジュール(プラグイン)を構築してデフォルトの機能を個々の要件に合せるための、認証プラグイン・インタフェースおよびSDKツール。新規インタフェースおよびSDKツールは次のとおりです。

- Oracle Access Manager 10gのカスタム・プラグインをサポートするための下位互換性を提供します。

- カスタム・プラグインを編成するための決定論的メソッドを認証モジュール内に含めます。

- カスタマイズされた認証プラグインを素早くデプロイできるようにするメカニズム。

- プラグインの状態ライフサイクルを完全に管理するメカニズム。

資格証明コレクション用のカスタム・プラグインの開発が、認証のためにサポートされています(編成可能な手順)。

参照:

第3.3.1項「プラグイン・インタフェースについて」

図3-1では、カスタム・プラグインのデプロイ・タスクの概要を示しています。

図3-1 カスタム・プラグインのデプロイ・ワークフロー

「図3-1 カスタム・プラグインのデプロイ・ワークフロー」の説明

次の概要では、カスタム・プラグインのデプロイ・タスクを識別しています。

タスクの概要: カスタム・プラグインのデプロイ

1. 計画: 第3.1.2項「計画、認証モデルおよびプラグインについて」で説明しているように、このプラグインのビジネス要件を識別し、ユーザーがリソースをリクエストした場合の認証フローを検討します。
セキュリティ・アーキテクトは、Access Manager 11gの使用方法および顧客のユーザー・ベースを把握しています。システム・アーキテクトは、顧客の実装における改善点を識別できます。

2. 開発:
開発者は、セキュリティ・アーキテクトが共通ライブラリを使用して実際のプラグインに設計した内容を翻訳し、カスタム認証モジュールをインタフェースします。

1. プラグインを記述します。

2. カスタム・モジュールのメタデータXMLを記述します。

3. マニフェスト・ファイルを作成します。

4. felix.jar、identitystore.jar、oam-plugin.jar、utilities.jarのjarファイルをCLASSPATHに追加します。

3. デプロイ:
Oracle Access Management管理者は、複数のプラグインが認証モジュールで連携するようにデプロイおよび編成し、プラグインをテストおよびモニターします。一般的なデプロイ・タスクは次のとおりです。

1. カスタム・プラグインの追加。これには、プラグイン・データ・ソースまたはドメインの構成、プラグインの配布およびアクティブ化が含まれます。

2. カスタム・プラグインに対応したカスタム認証モジュールの作成。これには、手順および結果(OnSuccess、OnFailureおよびOnError)の追加および編成が含まれます。

3. カスタム認証モジュールを含む認証スキームの作成。

4. カスタム・プラグインのロギングの構成。

5. アクセス・テスターによるプラグインのテスト。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

6. 必要に応じてビジネス要件およびアーキテクチャを修正できるように、プラグインをモニターし、セキュリティ・アーキテクトまたはシステム・アーキテクトにフィードバックを提供。

Oracle Access Management管理コンソールを使用した認証プラグインのデプロイの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

3.1.1 カスタム・プラグインのライフ・サイクルについて

プラグインのライフ・サイクルは、OAMサーバーへのプラグインの追加およびプラグインを使用した機能の追加作成の機能を中心としています。これによりユーザーは、サーバーの拡張機能の役割を果たす標準(すぐに使用できる)プラグインおよびユーザーが追加したプラグインに基づいて、機能およびワークフローを作成できます。

一般的なプラグインのライフ・サイクルは次のとおりです。

- 計画

- プラグイン開発時間、プラグイン・メタデータ・アーティファクトの生成が含まれます

- プラグインのロードおよびライフサイクル

- インポート: プラグインをAccess Managerにアップロードし、サーバーを再起動せずにこれを使用

- 配布: サーバーの停止時間なしで、プラグインjarファイルを1つのローカルOAMサーバー・ファイルシステムからクラスタ内のすべての管理サーバーに伝播

- アクティブ化: プラグインが認証モジュール・フローで使用される際に、このプラグイン実装を実行時にロード

- プラグインのスタートアップ・パラメータまたは構成を使用

- プラグイン構成データをoam-config.xmlにプッシュおよびプル

- OAMサーバーの状態ライフサイクル全体を管理

- デプロイされたプラグインの状態

- プラグインのモニターおよび監査

- プラグイン実行の所要時間およびプラグインの実行回数に関するマトリクス・データを収集

- プラグイン入出力のマトリクス・データを収集

- プラグイン実行開始時間および終了時間のマトリクス・データを収集

- プラグインのライフサイクル・メソッド・コードの監査

新規のプラグインJARファイルがある場合、開発者はこのファイルを管理コンソールのインポート・アクションからWeblogic ServerのDOMAIN_HOME/oam/pluginsにインポートできます。

表3-1では、Oracle Access Management管理者が制御するプラグイン・ライフサイクルの状態を示しています。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

表3-1 プラグイン・ライフサイクルの状態

状態

説明

インポート

プラグインJARファイルをWeblogic ServerのDOMAIN_HOME/oam/pluginsに追加し、プラグインの検証を開始します。

配布

登録済のすべてのOAMサーバーにプラグインを伝播します。

アクティブ化

プラグインは、正常に配布された後、登録済のすべてのOAMサーバーでアクティブ化できます。

非アクティブ化

非アクティブ化では、oam-config.xmlのプラグイン・エントリ・フラグがチェックされます。

非アクティブ化プロセスでOAMサーバーに障害が発生した場合、非アクティブ化に失敗しましたというメッセージが伝播されます。

削除

Weblogic ServerのDOMAIN_HOME/config/fmwconfig/oam/pluginsディレクトリから指定されたプラグイン(JAR)を削除し、Weblogic ServerがすべてのOAMサーバーに通知します。

3.1.2 計画、認証モデルおよびプラグインについて

OAMサーバーのプラグインは、カスタム認証スキームの一部です。各種プラグインを次の目的に使用できます。

- ユーザー・アイデンティティ・マッピング
プラグインにより、ログイン・ユーザー名の形式ではなくユーザー入力の形式に対応するための機能を追加できます。フィンガープリント、一連のセキュリティ質問およびその他の方法を使用できます。プラグインによりこれらの入力が翻訳され、データベースと照らしあわせてチェックされます。

- ユーザー認証
ユーザーの認証時には、レスポンス(すぐに使用できる提供なし)が必要となる場合があります。カスタム・プラグインによりこのニーズに応えることができます。

- カスタム・レスポンス
レスポンスおよびこれらのレスポンスが残りのシステムと対話する方法について、カスタム・プラグインを使用できます。

- その他のタイプのプラグインもサポート

図3-2は、ユーザーが保護されたリソースをリクエストした場合の認証フローを示しています。認証はプロセスであり、プロトコルではありません。緑色の点線矢印は、OAMサーバーにデプロイされたプラグインによって生成されたカスタム・レスポンスです。

図3-2 認証モデルおよびプラグイン

「図3-2 認証モデルおよびプラグイン」の説明

カスタム認証プラグインを設計および開発する前に、開発者はAccess Manager認証決定プロセスを綿密に分析し、ユーザーをどのように認証する必要があるかを確認することをお薦めします。

あるリクエストを受け取った場合、これを処理するには2通りの方法が考えられます。1つは、リクエストの属性に応じて特定のスキームを実行する方法であり、デシジョン・エンジンを使用して1つ以上のスキームを実行し、ユーザーを正しく認証します。これは、各スキーム内のコードが少なくて済み、モジュール性が高くなります。もう1つのオプションは、特定の目的でリクエストの様々な属性を処理するためにすべてのスキームをハードコードする方法であり、デシジョン・エンジンを使用せずに、どのスキームを実行する必要があるかを全体から把握します(1つのスキームのみ実行されます)。

例: デシジョン・エンジン対ハードコード認証

ユーザーが夜中に自宅のコンピュータを使用して、オンラインバンクの口座にログインすると仮定します。次の概要では、デシジョン・エンジンおよびハードコードのそれぞれの方法における処理の相違点を説明しています。開発者は、どの方法が要件に最も合うかを判断する必要があります。

2つの方法の相違点は単純ですが、重要です。

プロセスの概要: デシジョン・エンジンを使用する方法

1. 夜中に、あるIPアドレスを持つユーザーからリクエストを受け取ります。

2. デシジョン・エンジンにより、このIPアドレスが以前処理されたことが確認されます。また、夜中に認証を試みるユーザーは疑わしいと判断され、ユーザーはユーザー名およびパスワードだけでなく、セキュリティ質問に回答することが要求されます。

3. 指定されたユーザーに対してセキュリティ質問スキームが実行され、成功します。これは、デシジョン・エンジンによって選択された2つの認証スキームのうちの1つ目です。

4. ユーザーパスワード・スキームが実行され、ユーザーは正常に認証されます。これは、デシジョン・エンジンによって選択された2つ目の認証スキームです。

プロセスの概要: ハードコードを使用する方法

1. 夜中に、あるIPアドレスを持つユーザーからリクエストを受け取ります。

2. オンラインバンク口座のアクセス・スキームが他の認証スキーム(クレジット・カード・アクセス・スキーム、新規口座作成および検証など)の中から選択されます。

3. このスキームでは最初にIPアドレスがチェックされ、ユーザーが以前このコンピュータから接続を試みたことがあるかどうかが確認されます。ユーザーが以前そうしたと確認されます。

4. スキームにより時間がチェックされます。セキュリティ質問の回答が要求され、正しく回答されます。

5. スキームによりユーザーはログイン資格証明の入力が要求され、正常に認証されます。

どちらのリクエスト方法にも、それぞれメリットとデメリットがあります。デシジョンエンジン・モデルの場合、コードの再利用が主なメリットですが、ハードコードを使用した方法はセキュリティが向上する場合があります。開発者は、どの方法を採用するかを決定する必要があります。

表3-2 リクエスト方法の比較

方法

説明

デシジョン・エンジン

認証スキームをより小さい連続モジュールに分割し、必要に応じて連携するよう編成できます。

メリット:

- コードの再利用が主なメリットです。

- Oracle Adaptive Access Managerを使用した方法のミラー化が2つ目のメリットです。

ハードコード

決定事項はありません。ユーザーが認証のために渡す必要があるIf-Else文一式に類似します。

メリット: セキュリティが向上する可能性があります。

3.2 マルチステップ認証フレームワークの概要

ここでは、次の内容について説明します。

- マルチステップ・フレームワークについて

- プロセスの概要: マルチステップ認証

- PAUSE状態について

- 収集される情報について

3.2.1 マルチステップ・フレームワークについて

マルチステップ認証フレームワークでは、ログイン・プロセス中に数回にわたって情報をバックエンド認証スキームに送信するためのカスタム認証プラグインが必要になります。このプラグインによって収集され、コンテキストに保存された情報はすべて、認証プロセスを通じてプラグインから利用できます。コンテキスト・データは、Cookieまたはログイン・ページのヘッダーの設定にも使用できます。

認証フローのビルディング・ブロックはイベントです。イベントは、認証モジュール・プラグイン実装の公開メソッドを使用して作成されます。これらのイベントをルールと組み合せることで、認証の決定論的ワークフローを構築できます。ワークフロー・コントローラは、認証ワークフローの編成を担当するモジュールです。ワークフロー構成はワークフロー定義言語で定義されます。

多要素認証とは、ユーザーの認証に必要な複数の資格証明のコレクションを意味するビジネス用語です。マルチステップ認証フレームワークでは、多要素認証の要件を実装できます。また、必要に応じて、複数の手順を使用する単一要素認証も実装できます。たとえば、ユーザー名とパスワードを別々のページで収集できます。

マルチステップ認証は、次のものに依存しています。

- 資格証明コレクタ(DCCまたはECC)を使用してマルチステップ認証フローによる動的資格証明収集を実現するWebgate。これにより、複数のユーザー識別方式を含む認証関連情報の収集時に、ユーザーまたはプログラム的なエンティティとの対話の柔軟性が向上します。

- 認証モジュール連鎖。類似したチャレンジ・メカニズムのモジュールをグループ化し、資格証明を1つのパスに収集して各モジュールに対して検証します。複数の認証モジュールを1個の新しい認証スキームで連鎖させ、フローを含む新規のスキーム・プラグインを定義できます。
チャレンジ・メカニズムは、資格証明の収集方法を定義したものです。使用できるメカニズムは、FORM、BASIC、X509、WNA、OAM10G、TAPおよびNONEです。チャレンジ・メカニズムは、必要な資格証明の収集方法を制御します。現在、このメカニズムは認証スキームにリンクされています。

参照:

『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の11g Webgateの外部資格証明収集のための構成に関する項

3.2.2 プロセスの概要: マルチステップ認証

1. プロセス・リクエスト: マスター・コントローラが認証リクエストを処理してプラグインに渡します。

2. プロセス・イベント: 認証スキームが実行され、認証を続行するために入力が必要かどうかをプラグインが判断します。入力が必要な場合、プラグインはPAUSEという実行ステータスを返します。これによりイベント・フローが一時停止します。
PAUSEは、ユーザーから追加情報を取得するまで、認証プロセスを続行できないことを示します。したがって、リダイレクションが許可されます。リクエストした情報が供給されると、一時停止したポイントから処理が継続されます。実行する必要がある、関連付けられたACTIONの詳細によってリクエストが更新されます。ActionContextは、ACTIONを実行するためのすべての情報を持っています。

たとえば、PAUSEがCREDCOLLECT_ACTIONに関連付けられている場合、マスター・コントローラはプラグインの実行状態を保存してから、このCREDCOLLECT_ACTIONをCRED_COLLECTイベントにマップし、プラグインのCredentialParameterオブジェクトの指定どおりにコレクションを処理して、ACTIONに対応するイベントの実行を開始します。

3. 保存されたプラグインの状態が再活性化され、SUCESSまたはFAILUREの状態に達するまでプラグインの実行が再開されます。FAILUREは、認証の試行に失敗したことを示します。その場合、OAMサーバーはユーザーの再認証を試みます。たとえば、ユーザーにログイン・フォームが表示されます。

- 有効なサブジェクトが存在する場合、ユーザー・セッションが作成され、実行状態の保存に使用されます。それ以外の場合は、実行状態がリクエスト・オブジェクトに保存されます。このセッションには、グローバル(共通)システム構成によって構成された最低の認証レベルが割り当てられています。

- ユーザー認証が終了すると、このセッションは完全に有効なセッションに更新され、認証スキームで定義された認証レベルとOAMサーバーに対して構成されたセッション・タイムアウトが割り当てられます。

4. 動的フロー・コントローラ内のイベントの実行が終了すると、制御が親コントローラに戻り、実行状態が更新されます。

5. 認証が完了すると、リクエストしたリソースへのアクセスが許可されます。

3.2.3 PAUSE状態について

マルチステップ認証モードでは、プラグインが資格証明を最初から収集することも、デフォルトのログイン・ページから取得した資格証明を使用したうえで必要に応じてさらに資格証明を収集することも可能です。チャレンジ・パラメータinitial_command=NONEが認証スキームに設定されている場合、プラグインが直接制御することとなり、プラグインによって資格証明の収集が制御されます。

プラグインでは、PAUSEステータスを使用して、資格証明の収集の際にユーザーとやりとりできるようUserActionパラメータを渡すことができます。1回以上クライアントに渡すことで、モジュールで必要なすべての資格証明を収集できます。PAUSE実行の間、プラグインの実行状態およびコンテキスト・データは保存されます。制御がプラグインに戻ると、停止していた実行が再開され、収集されたすべてのデータがプラグインで使用できるようになります。

プラグインがPAUSE状態に設定されている場合、プラグインでは次のことが可能です。

- 収集するデータの指定

- リダイレクトまたは転送先のURLの指定

- 問合せ文字列の指定(存在する場合)

3.2.4 収集される情報について

次のタイプの情報を資格証明コレクタ・ページに送ることができます。

- UserContextData

- UserActionContext

- UserAction

- UserActionMetaData

3.2.4.1 UserContextData

- UserContextDataでは、メタデータ(ログイン・ページで収集されるパラメータの名前、表示名およびタイプ)を指定します。たとえば、ログイン・アプリケーションからユーザー名を収集する場合、次のようになります。

final UserContextData userNameContext = new UserContextData(form_username,
form_username, new CredentialMetaData(PluginConstants.TEXT));

ここで属性の名前はform_usernameです。

- UserContextDataでは、資格証明の収集のため、ユーザーに表示するログイン・ページのURLを指定します。URLタイプを指定したCredentialMetaDataにより、ログイン・ページのURLが指定されます。次に例を示します。

final UserContextData urlContext = new UserContextData (loginPageURL, new CredentialMetaData("URL"))

ここでloginPageURLは、表示されるページのURLを指定します。

- UserContextDataは、問合せパラメータをログイン・ページURLに渡す際に使用されます。QUERY_STRINGタイプを指定したCredentialMetaDataにより、loginPageURLとともに送信される問合せパラメータが指定されます。これはログイン・ページで処理できます。次に例を示します。

String queryString = "queryParam1=testParameter";
final UserContextData queryStringContext =new UserContextData
(queryString, new CredentialMetaData("QUERY_STRING"));

3.2.4.2 UserActionContext

UserActionContextでは、ログイン・ページから収集されたUserContextDataメタデータを保持します。

3.2.4.3 UserAction

UserActionクラスは、資格証明の収集に使用されます。さらに資格証明を収集するため、アクションはログイン・ページに転送またはリダイレクト(UserActionMetaDataパラメータによる)されます。

次の例で、これらのクラスを使用して、ログイン・ページに情報を指定する方法を示します。

//create a user name context data.
UserContextData userNameContext =
new UserContextData("form_username", "form_username",
new CredentialMetaData(PluginConstants.TEXT));
//create a password context data
// Any form parameter containing the words  "password", "passcode" and "_pin"  will be treated as sensitive values for debug logging

UserContextData passwordContext =
new UserContextData("form_password", "form_password",
new CredentialMetaData(PluginConstants.PASSWORD));

// create URl context data for login page
UserContextData urlContext = new UserContextData (loginPageURL,
new CredentialMetaData ("URL"));

UserActionContext actionContext = new UserActionContext ();

//add the UserContextData to the CredentialActionContext
actionContext.getContextData().add(userNameContext);
actionContext.getContextData().add(passwordContext);
actionContext.getContextData().add(urlContext);

//specify if we FORWARD or REDIRECT with a GET/POST to the login page
UserActionMetaData userAction = UserActionMetaData. FORWARD;

// create a UserAction object and set it to the authentication context.
UserAction action = new UserAction (actionContext, userAction);
authContext.setAction(action);

3.2.4.4 UserActionMetaData

UserActionMetaDataでは、UserActionで使用されるアクション・タイプを指定します。UserActionは、UserActionMetaData値に基づいてログイン・ページへの転送またはリダイレクト(GETまたはPOSTを使用)を実行します。UserActionMetaDataに使用できる値は、FORWARD、REDIRECT_GETおよびREDIRECT_POSTです。

3.3 プラグイン・インタフェースの概要

ここでは、次の内容について説明します。

- プラグイン・インタフェースについて

- プラグイン階層について

3.3.1 プラグイン・インタフェースについて

このトピックでは、パッケージ、クラス、インタフェースおよび注釈の階層について概要を説明します。

カスタム・プラグイン実装には、プラグイン実装クラス・アーティファクトの記述が含まれます。プラグイン実装クラスは、AbstractAuthenticationPlugInクラスを拡張し、initializeおよびprocessメソッドを実装する必要があります。カスタム・プラグイン実装者は、実際のカスタム認証処理ロジックをこのメソッドに実装し、最終的な認証実行ステータスを戻す必要があります。

プラグインの構成要件はXML形式で指定する必要があります。この構成データ(メタデータ)には、プラグイン名、作成者、作成日、バージョン、インタフェース・クラス、実装クラスおよび構成データが、属性/値ペアの形式で含まれます。新規のプラグイン名をマニフェスト・ファイルに追加する必要があります。ピリオド( . )は、プラグイン名として有効な文字ではありません。

11gは、次に説明する汎用プラグイン・インタフェースおよびより詳細な認証インタフェースを提供します。

- GenericPluginService

- AuthnPluginService

3.3.1.1 GenericPluginService

oracle.security.am.plugin

パブリック・インタフェースoracle.security.am.pluginは、プラグイン名、プラグイン実装クラス名、プラグイン・バージョン、プラグイン実行ステータス、プラグイン・モニター・データ、プラグイン構成データを取得するメソッドや、プラグインを起動および停止するメソッドを提供する汎用プラグイン・インタフェースです。

AbstractAMPlugin

パブリック抽象クラスoracle.security.am.plugin.AbstractAMPluginは、java.lang.Object implements GenericPluginServiceおよびorg.osgi.framework.BundleActivatorを拡張します。

oracle.security.am.plugin.AbstractAMPlugin

これは、すべてのAccess Managerプラグインによって拡張される必要がある抽象プラグイン・クラスです。これは、プラグインの起動および停止メソッドのための基本実装を提供します。

参照:

Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンス

3.3.1.2 AuthnPluginService

oracle.security.am.plugin.authn.AuthnPluginService

パブリック・インタフェースoracle.security.am.plugin.authn.AuthnPluginServiceは、GenericPluginServiceを拡張します。

これは認証プラグイン・インタフェースであり、AuthenticationContextオブジェクトで使用可能なすべてのデータにアクセスおよび処理し、プロセス実行ステータスを戻すための追加認証固有メソッドを提供します。プラグインはSESSIONに追加されるレスポンスを設定し、コンテキストをリクエストおよびリダイレクトできます。

AbstractAuthenticationPlugIn

パブリック抽象クラスoracle.security.am.plugin.authn.AbstractAuthenticationPlugInは、AbstractAMPluginを拡張し、AuthnPluginServiceを実装します。

oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn

これはプラグイン開発者に公開される認証抽象プラグイン・クラスです。カスタム・プラグイン実装はすべて、このAbstractPlugInServiceクラスを拡張する必要があります。リソース・クリーン・アップを処理する必要があるプラグインは、shutdown(Map < String, Object > OAMEnvironmentContext)メソッドをオーバーライドします。また、これはjava.util.Loggerのインスタンスをプラグインに提供します。

3.3.2 プラグイン階層について

このトピックでは、階層の一覧を提供します。

- 図3-3「プラグイン・パッケージ階層」

- 図3-4「プラグイン・クラス階層」

- 図3-5「プラグイン・インタフェース階層」

- 図3-6「プラグイン注釈タイプ階層」

- 図3-7「プラグイン列挙階層」

参照:

Oracle Fusion Middleware Oracle Access Management Access Manager Access SDK Java APIリファレンス

図3-3 プラグイン・パッケージ階層

図3-4 プラグイン・クラス階層

図3-5 プラグイン・インタフェース階層

図3-6 プラグイン注釈タイプ階層

図3-7 プラグイン列挙階層

3.4 サンプル・コード: カスタム・データベース・ユーザー認証プラグイン

この項では、データベース・ユーザー認証プラグインのサンプル実装のスナップショットを提供し、開発者タスクを示しています。この項の内容は次のとおりです。

- サンプル・コード: データベース・ユーザー認証プラグイン

- プラグイン構成メタデータ要件のサンプル

- プラグインのサンプル・マニフェスト・ファイル

- プラグインJARファイル構造

3.4.1 サンプル・コード: データベース・ユーザー認証プラグイン

次の各図では、データベース・ユーザー認証プラグインのサンプル実装を3つの部分に分けて示しています。

- 図3-8「データベース・ユーザー認証プラグイン・パート1」

- 図3-9「データベース・ユーザー認証プラグイン・パート2」

- 図3-10「データベース・ユーザー認証プラグイン・パート3」

参照:

Oracle Fusion Middleware Oracle Access Manager Java APIリファレンス

図3-8 データベース・ユーザー認証プラグイン・パート1

続く..

図3-9 データベース・ユーザー認証プラグイン・パート2

続く...

図3-10 データベース・ユーザー認証プラグイン・パート3

3.4.2 プラグイン構成メタデータ要件のサンプル

プラグインの構成要件はXML形式で指定する必要があります。

この構成データ(メタデータ)には、プラグイン名、プラグイン作成者、作成日、プラグイン・バージョン、プラグイン・インタフェース・クラス、プラグイン実装クラスおよびプラグイン構成データが、属性/値ペアの形式で含まれます。

図3-11では、サンプル: データベース・ユーザー認証プラグイン実装のメタデータが含まれるXMLスキーマ定義(XSD)ファイルを示しています。

図3-11 XSD構成データ: データベース・ユーザー認証プラグイン

例3-1は、サンプル: データベース・ユーザー認証プラグインのXMLメタデータです。

例3-1 XMLメタデータ: データベース・ユーザー認証プラグイン

<Plugin type="Authentication">
<author>uid=User1</author>
<email>User1@mycompany.com</email>
<creationDate>09:32:20, 2010-12-02</creationDate>
<description>Custom User Authentication Plugin Validation Against Domain Name</description>
<configuration>
<AttributeValuePair>
<Attribute type="string" length="20">DataSource</Attribute>
<mandatory>true</mandatory>
<instanceOverride>false</instanceOverride>
<globalUIOverride>true</globalUIOverride>
<value>jdbc/CISCO</value>
</AttributeValuePair>
</configuration>
</Plugin>

3.4.3 プラグインのサンプル・マニフェスト・ファイル

11.1.2リリースより、プラグイン・マニフェスト・ファイルに次の情報が追加されています。

- Bundle-Versionフィールドから取得したプラグイン・バージョン。このフィールドは整数にする必要があります。

- 以前のリリースではXMLファイルから読み込むために使用されていたname=attributeパラメータが、Bundle-SymbolicNameまたはBundle-Nameフィールドから読み込まれるようになりました。このパラメータはXMLファイル内には必要ありません。

- 以前のリリースではXMLファイルから読み込むために使用されていたimplementationパラメータが、Bundle-Activatorフィールドから読み込まれるようになりました。このパラメータはXMLファイル内には必要ありません。

- XMLファイルから<interface>oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn</interface>を削除してかまいません。

例3-2 サンプル・マニフェスト・ファイル

Manifest-Version: 1.0
Bundle-Version: 10-->Note this to be an integer.
Bundle-Name: MFASamplePlugin
Bundle-Activator: mfasampleplugin.MFASamplePlugin
Bundle-ManifestVersion: 2
Import-Package:
org.osgi.framework;version="1.3.0",oracle.security.am.plugin,oracle.security.a
m.plugin.authn,oracle.security.am.plugin.impl,oracle.security.am.plugin.api,or
acle.security.am.common.utilities.principal,oracle.security.idm,javax.security
.auth
Bundle-SymbolicName: MFASamplePlugin
.
A corresponding sample modified XML file is :
<Plugin type="Authentication">
<author>uid=User2</author>
<email>User2@mycompany.com</email>
<creationDate>09:32:20 2010-12-02</creationDate>
<description>Custom MFA Sample Auth Plugin</description>
<configuration>
<!-- Attribute "actiontype" indicates if the plugin wants to REDIRECT or
FORWARD to the login page to collect credentials-->
<AttributeValuePair>
<Attribute type="string" length="20">actiontype</Attribute>
<mandatory>false</mandatory>
<instanceOverride>false</instanceOverride>
<globalUIOverride>true</globalUIOverride>
<value>FORWARD</value>
</AttributeValuePair>
.
</configuration>
.
</Plugin>

3.4.4 プラグインJARファイル構造

サンプル(データベース・ユーザー認証プラグイン)のJARファイル構造を次に示します。

- <plugin>.xml

- <plugin>.class (パッケージ構造、第3.3項「プラグイン・インタフェースの概要」を参照)

- META-INF (MANIFEST.MF)

3.5 認証プラグインの開発

開発者は、セキュリティ・アーキテクトが共通ライブラリを使用して実際のプラグインに設計した内容を翻訳し、カスタム認証モジュールをインタフェースします。

この項では、Access Manager 11g認証スキームで使用する認証プラグインの開発について説明します。内容は次のとおりです。

- カスタム認証プラグインの記述について

- カスタム認証プラグインの記述

- 認証プラグインのエラー・コード

- カスタム認証プラグインのコンパイルに必要なJARファイル

3.5.1 カスタム認証プラグインの記述について

カスタム・プラグイン実装の記述には、次を行うためのプラグイン実装クラスの記述が含まれます。

- AbstractAuthenticationPlugInクラスの拡張(第3.3.1項「プラグイン・インタフェースについて」を参照)

- initializeメソッドの実装

- processメソッドの実装

表3-3では、プラグインの機能に必要なメソッドについて説明します。

表3-3 必要なプラグイン・メソッド

必要なメソッド

説明

initialize

PluginConfigオブジェクトにハンドルを提供します。

PluginConfigオブジェクトは、プラグインのアップロード時に入力されたプラグイン固有システム構成データを取得する際に実行できます。このデータはプラグイン独自の機能に必要です。

process

AuthenticationContextオブジェクトにハンドルを提供するもので、次のプラグイン固有ランタイム構成データを取得する際に実行できます。

- プラグイン・インスタンス・レベルで更新済

- またはプラグイン編成ステップで更新済

AuthenticationContextオブジェクトは、次を取得する各種メソッドを提供するPluginContextオブジェクトを拡張します。

- プラグイン構成データ

- 例外データ

- プラグイン環境データ

さらに、AuthenticationContextオブジェクトは次を取得するメソッドを提供します。

- 認証スキーム

- 認証サブジェクト

- 資格証明オブジェクト

- ランタイム・ポリシー・リソース

注意:

カスタム・プラグイン開発者は、実際のカスタム認証処理ロジックをこのメソッドに実装し、最終的な認証実行ステータスを戻す必要があります。

3.5.2 カスタム認証プラグインの記述

この項では、カスタム認証プラグインの記述ステップを示します。

次の概要では、システム・アーキテクトがこのプラグインのビジネス要件を識別し、ユーザーがリソースをリクエストした場合の認証フローを検討した後に開発者が実行する必要があるアクションについて説明します。詳細は、第3.1.2項「計画、認証モデルおよびプラグインについて」を参照してください。

前提条件

認証プラグインの概要

サンプル・コード: カスタム・データベース・ユーザー認証プラグイン

タスクの概要: 開発者によるカスタム認証プラグインの記述

1. AbstractAuthenticationPlugInクラスを拡張し、次のメソッドを実装します(第3.5.1項「カスタム認証プラグインの記述について」も参照)。

- initializeメソッドの実装

- processメソッドの実装

2. 適切なAccess Manager 11gインタフェースおよびパッケージを使用して、プラグイン・コードを開発します。参照:

- 第3.1項「認証プラグインの概要」

- 第3.4項「サンプル・コード: カスタム・データベース・ユーザー認証プラグイン」

3. カスタム・プラグインのメタデータを作成します。参照:

- 第3.4.2項「プラグイン構成メタデータ要件のサンプル」

4. プラグインJarファイルおよびマニフェストを作成し、これらをデプロイ・チームに引き継ぎます。参照:

- 第3.4.3項「プラグインのサンプル・マニフェスト・ファイル」

- 第3.4.4項「プラグインJARファイル構造」

5. 次に進みます。

- 第3.5.4項「カスタム認証プラグインのコンパイルに必要なJARファイル」

- カスタム認証プラグインのデプロイと管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

3.5.3 認証プラグインのエラー・コード

プラグインでログイン・ページ、エラー・ページまたはクライアント・アプリケーション・ページとデータをやり取りする必要がある場合は、このデータをPluginResponsesとして送信できます。レスポンスはName=Valueのペアという形式で、データに関する詳細を提供します。OAMサーバーは、これらのレスポンスをHTTPレスポンス・パラメータとしてカスタム・ページに送信します。次のレスポンス・タイプによって、やり取りが容易になります。

- CLIENT: 認証プロセスまたはユーザーに関するデータをプラグインがクライアント・アプリケーションに伝達できるようにします。リクエスト・パラメータはPLUGIN_CLIENT_RESPONSEです。

- ERROR: 認証プロセスに関するエラーをプラグインが伝達できるようにします。リクエスト・パラメータはPLUGIN_ERROR_RESPONSEです。

例3-3 カスタム認証プラグインのエラー・コード

//Setting responses
PluginResponse rsp = new PluginResponse();
rsp = new PluginResponse();
rsp.setName("PluginClientCode");
rsp.setType(PluginAttributeContextType.CLIENT);
rsp.setValue("Err-100");
context.addResponse(rsp);
rsp = new PluginResponse();
rsp.setName("PluginErrorCode");
rsp.setType(PluginAttributeContextType.ERROR);
rsp.setValue("Card Expired");
context.addResponse(rsp);

String errorResponse = request.getParameter(GenericConstants.PLUGIN_ERROR_RESPONSE);
String clientResponse = request.getParameter(GenericConstants.PLUGIN_CLIENT_RESPONSE);

3.5.4 カスタム認証プラグインのコンパイルに必要なJARファイル

カスタム認証プラグインのコンパイルには、複数のJARファイルが必要です。

- felix.jar

- oam-plugin.jar

- utilities.jar

- identity-provider.jar

これらのJARファイルは、次のパスに置かれています。

DOMAIN_HOME/servers/MANAGED_INSTANCE_NAME/tmp/_WL_user/oam_server/RANDOM_STRING
/APP-INF/lib

4 カスタム・ページの開発

OAMサーバーでは、デフォルトのログイン・ページ、ログアウト・ページおよびエラー・ページが用意されています。会社のルック・アンド・フィールに合せてカスタム・ログイン・ページおよびカスタム・エラー・ページを作成し、Access Managerで使用できます。この章では、カスタム・ページの開発方法および使用している環境へのデプロイ方法について説明します。この章の内容は次のとおりです。

- 第4.1項「カスタム・ページの概要」

- 第4.2項「カスタム・ログイン・ページの開発」

- 第4.3項「カスタム・エラー・ページの開発」

- 第4.4項「外部資格証明コレクタを使用した開発」

- 第4.5項「カスタム・ログイン・ページのデプロイ」

- 第4.6項「プログラムによる認証」

- 第4.7項「認証後のカスタムOSSO Cookieの設定」

4.1 カスタム・ページの概要

この項には次のトピックが含まれます。

- カスタム・ページの開発について

- 認証とカスタム・ページについて

4.1.1 カスタム・ページの開発について

Access Managerでは、カスタマイズされたユーザー・ログイン・ページを作成するための拡張可能なフレームワークを提供しています。ログイン、ログアウトおよびエラー条件処理時の認証で使用する対話型のカスタム・ページを作成できます。最も簡単な形態として、Access Managerには、そのままユーザーに表示される静的HTMLページのセットが用意されています。しかし通常、ユーザー・インタフェースは動的であり、必要なロジックを実行できるスクリプトまたはアプリケーションとして実装する必要があります。

Access Managerでは、ユーザーと対話可能なデフォルトの動的ページのセットを提供しています。これらのデフォルト・ページを自社のルック・アンド・フィールに合せてカスタマイズしたり、すべてカスタム・ページに置き換えたりできます。たとえば、ユーザーがモバイル・ブラウザかデスクトップ・ブラウザのどちらからアクセスしているかに応じて異なるバージョンのログイン・フォームを表示するカスタム動的ページを設計、実装およびデプロイできます。

開発するカスタム・ページは、既存のAccess Manager認証モジュールまたはカスタム認証プラグインと組み合せて使用できます。この章では、ログイン、ログアウトおよびエラー用のカスタム・ページの開発について説明しています。カスタム認証プラグインの開発の詳細は、第3章「カスタム認証プラグインの開発」を参照してください。

OAMサーバーの次の2つの資格証明収集コンポーネントのどちらか一方を有効化できます。これらのコンポーネントは、通信エンドポイントの役割を果たし、カスタマイズされたユーザー・インタフェースとの相互作用を容易にします。

- 組込み資格証明コレクタ(ECC): 追加のインストールや設定手順なしで使用できます。

- 外部資格証明コレクタ(DCC): 本番デプロイにおけるスケーラビリティおよびセキュリティ分離を向上させる場合には、これをお薦めします。

OAMサーバーの資格証明コレクタの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の11g Webgateの動的資格証明収集のための構成に関する項を参照してください。

ユーザーとの対話用にどちらの資格証明収集コンポーネントを有効化した場合も、使用している環境におけるカスタム・ページの設計や実装はほとんど同じです。この2つの資格証明収集方法による開発の違いの詳細は、第4.4項「外部資格証明コレクタを使用した開発」を参照してください。

4.1.2 認証とカスタム・ページについて

認証プロセスでは、リソースへのアクセスをリクエストしているユーザーに必要な資格証明を確認し、HTTPを介して資格証明を収集し、資格証明の検証結果に基づいてHTTPレスポンスを返します。

図4-1は、OAMで保護されたリソースにアクセスするユーザーを認証するエンドツーエンドのリクエスト・フローで、最終的にエラー・ページが表示されます。

図4-1 認証リクエスト・フロー

「図4-1 認証リクエスト・フロー」の説明

プロセスの概要: 認証リクエスト・フロー

1. ユーザーが保護されたリソースをリクエストします。認証フローがトリガーされ、ログイン・ページが表示されます。必要な資格証明が認証エンジンに送信されます。

2. このリソースは、認証(AuthN)プラグインを使用する特定の認証スキームによって保護されています。AuthNプラグインがアイデンティティ・ストアAPIを使用して資格証明を認証します。AuthNプラグインは、サード・パーティAPIもコールできます(図には非表示)。

3. 認証を行うために、アイデンティティ・ストアAPIがバックエンド・ストアとの接続を確立します。アイデンティティ・ストアの例としてADとOVDが記載されています。

4. 認証エラー・コードを含む結果がアイデンティティ・ストア・レイヤーから返され、プラグインおよび認証エンジン・レイヤーに送信されます。認証レイヤーで、バックエンドからのエラー・コードが対応するOAMサーバー・エラー・コードにマップされます。標準エラー・コードの詳細は、表4-2を参照してください。
結果にはアイデンティティ・ストアから取得したネイティブ・エラー・コードが含まれており、それらのエラー・コードはアンマップ・セカンダリ・エラー・コード(p_sec_error_msg)としてログイン・ページに返されます。セカンダリ・エラー・コードの詳細は、第4.3.6項「セカンダリ・エラー・メッセージの伝播」を参照してください。

5. エラー・コードが問合せパラメータとしてエラー・ページとログイン・ページに返されます。エラー・コードはHTTPリクエスト・パラメータとしてエラー・ページに送信されます。問合せパラメータはp_error_codeという名前です。

6. プライマリ・エラー・コード・メッセージとは、エラー・コードの詳細テキストを含むローカライズされた文字列です。これは、該当するリソース・バンドル・ファイルからエラー・コードを使用して取得できます。

4.2 カスタム・ログイン・ページの開発

この項には次のトピックが含まれます。

- フォームベース・ログイン・ページの作成

- ページ・リダイレクション・プロセス

4.2.1 フォームベース・ログイン・ページの作成

フォームベース認証では、Access Managerの認証メカニズムを使用してログイン資格証明を処理するカスタムWebフォームを開発できます。これらのフォームはHTMLページであり、ログイン情報を複数言語で表示したり、会社のプレゼンテーション標準に準拠したユーザー・インタフェース・エレメントを表示したり、パスワード管理に必要な機能を追加することができます。

フォームまたはログイン・アプリケーションは、ユーザーからのリダイレクトを処理してHTMLをレンダリングする任意のテクノロジを使用して記述できます。カスタム・ログイン・ページの記述には、JSPページ、ASP.net、Perl、PHPなどが使用できます。メリットの1つは、ページのルック・アンド・フィールを会社の基準に合うようにカスタマイズできることです。また、別のメリットとして、ユーザーの資格証明をOAMサーバーに送信する前に、必要に応じてユーザーの送信(POST)を前処理できます。

Access Managerによる認証に対応したカスタム・ログイン・ページを記述する場合、OAMサーバーの外部でホストされたログイン・ページへユーザーをリダイレクトするのが一般的な方法です。ユーザーは、記述したカスタム・ログイン・ページまたはアプリケーションにリダイレクトされます。詳細は、第4.2.2項「ページ・リダイレクション・プロセス」を参照してください。

リクエスト・キャッシュのモードとして、basic、cookie、formの3つがサポートされています。basicモードで動作する場合、request_idが必須パラメータであり、返送する必要があります。formモードでは、OAM_REQトークンが必須であり、存在する場合は返送する必要があります。cookieモードでは、OAM_REQがCookieとして設定されます。

カスタム・ログイン・フォーム・ページには次のような要件があります。

- 目的の認証モジュールをサポートするようにページを構築する必要があります。

- ページでOAM_REQトークンの取得をサポートする必要があります。第4.2.1.1項「OAM_REQトークンを返す」を参照してください。

- ページでエンド・ポイントを取得する必要があります。第4.2.1.2項「エンド・ポイントを返す」を参照してください。

4.2.1.1 OAM_REQトークンを返す

OAM_REQは、認証リクエスト・コンテキストCookieが有効な場合にOAMサーバーによって設定または消去される一時的なCookieです。このCookieは、OAMサーバーでのみ認識されるキーで保護されます。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のSSO Cookieの概要に関する項を参照してください。

OAM_REQは、問合せ文字列から取得して非表示のフォーム変数として返送する必要があります。

リソースがリクエストされると、OAMサーバーは資格証明コレクタ・ページにリダイレクトまたはフォワードして資格証明を収集します。また、OAM_REQトークンをログイン・ページに送信します。カスタマイズされたログイン・アプリケーションの場合、そのログイン・アプリケーションでリクエストからOAM_REQトークンを取得して、資格証明とともにOAMサーバーに送り返すようにする必要があります。OAM_REQは、問合せ文字列から取得して非表示のフォーム変数として返送する必要があります。次に例を示します。

String reqToken = request.getParameter(GenericConstants.AM_REQUEST_TOKEN_IDENTIFIER);

<%
if(reqToken != null && reqToken.length() > 0) { %>
<input type="hidden" name="<%=GenericConstants.AM_REQUEST_TOKEN_IDENTIFIER%>" value="<%=reqToken%>">
<%
}
%>

4.2.1.2 エンド・ポイントを返す

エンド・ポイント/oam/server/auth_cred_submitをOAMサーバーに返す必要があります。次に例を示します。

<form action="/oam/server/auth_cred
_submit"> or "http://oamserverhost:port/oam/server/auth
_cred_submit".

4.2.2 ページ・リダイレクション・プロセス

フォームベース認証スキームが外部チャレンジ・タイプで作成されている場合、OAMエージェントはユーザーをまずobrareq.cgi URLへリダイレクトし、このURLはこのユーザーを、認証スキームのチャレンジURLとして指定されたログイン・ページへリダイレクトします。チャレンジ・リダイレクトURLは、DCCまたはECCエンドポイントを宣言します。チャレンジURLは、FORMなどのチャレンジ・メソッドに関連付けられたURLです。

リダイレクト・ページで、request_idとredirect_urlが問合せ文字列に追加されます。次に例を示します。

?request_id=5092769420627701289&redirect_url=http%3A%2F%2Fmycompany.com%3A7777%2Fscripta%2Fprintenv

x509認証スキームを使用する場合は、透過的に認証が実行されるため、ログイン資格証明専用のページはありません。ただし、ページ・リダイレクションは非フォームベースの認証方式にも適用されます。たとえば、x509認証スキームを使用する場合、保護されているリソースを表示する前に、機密保護に関する免責条項などへユーザーをリダイレクトできます。この場合、免責条項ページへのパスを入力し、そのページを/oam/CredCollectServlet/X509ページにリダイレクトさせます。オリジナルの問合せスキームを必ず提示してください。

4.3 カスタム・エラー・ページの開発

このセクションのトピックは次のとおりです:

- プロセスの概要: カスタム・エラー・ページの作成

- 標準エラー・コード

- デフォルト・ページの位置

- セキュリティ・レベルの構成

- パスワード・ポリシー検証エラー・コード

- セカンダリ・エラー・メッセージの伝播

- エラー・コードの取得

- エラー・データ・ソースの一覧

参照:

第3.5.3項「認証プラグインのエラー・コード」

4.3.1 プロセスの概要: カスタム・エラー・ページの作成

カスタム・エラー・ページは、カスタム・ログイン・アプリケーションの一部としてパッケージ化されます。認証ポリシーに基づいて、失敗リダイレクトURLをカスタム・エラー・ページの絶対URLに設定します。

すぐに使用できるカスタムUI Webアプリケーション・アーカイブ(WAR)ファイルが用意されており、これを開始ポイントしてカスタム・ログインおよびパスワード・ページを開発できます。このWARファイルは、MW_HOME/OAM1/oam/server/tools/custompages/oamcustompages.warにあります。

カスタム・エラー・ページを作成するには、次の手順を実行します。

1. エラー・メッセージの表示に必要なHTMLページを作成します。詳細は、第4.2項「カスタム・ログイン・ページの開発」を参照してください。

2. エラー・コード問合せパラメータp_error_codeとp_sec_error_msgを、使用している環境のカスタム・エラー・コードにどのようにマップするかを検討します。詳細は、第4.3.7項「エラー・コードの取得」を参照してください。

4.3.2 標準エラー・コード

Access Managerでは、失敗の理由を示す標準エラー・コードを提供しています。一般的な失敗の理由として、ユーザー名とパスワードの無効な組合せが提供された、ユーザー・アカウントがロック中か無効になっている、内部処理エラーが発生したなどがあります。認証エラーの理由はバックエンド・アイデンティティ・ストアから取得され、OAMサーバーで管理されている特定のエラー・コードにマップされます。そして、このエラー・コードがログインまたはエラー・ページに伝播されます。認可リクエスト・フローの詳細は、第4.1項「カスタム・ページの概要」を参照してください。

表4-1は、ログイン・ページおよびエラー・ページで使用できる標準エラー情報をまとめたものです。

表4-1 エラー情報の種類

メッセージ・タイプ

説明

エラー・コード

特定の数値を含む文字列。エラー・コードはAccess Managerのみによって管理されます。問合せ文字列パラメータはp_error_codeという名前です。

プライマリ・エラー・メッセージ

エラー・コードの詳細テキストを含むローカライズされた文字列。クライアントのロケール、つまりユーザーのブラウザの言語設定に依存します。

セカンダリ・エラー・メッセージ

失敗の実際の原因を含むローカライズされていない文字列。セカンダリ・エラー・メッセージは、カスタム認証プラグインから提供される場合と、アイデンティティ・ストアから返される場合があります。問合せ文字列パラメータはp_sec_error_msgという名前です。

表4-2は、OAMサーバーによって送信されるエラー・メッセージ・コードおよび対応するプライマリ・エラー・メッセージを網羅したリストです。プライマリ・エラー・メッセージがアプリケーション用にカスタマイズされている場合、アプリケーションでこのカスタム・メッセージを、OAMサーバーによって管理されている対応する標準エラー・コードにマップする必要があります。エラー・コードOAM-1とOAM-2に違いはありません。

表4-2 標準エラー・コードおよびメッセージ

エラー・コード

プライマリ・エラー・メッセージ

OAM-1

指定したユーザー名またはパスワードが正しくありません。

OAM-2

指定したユーザー名またはパスワードが正しくありません。

OAM-3

資格証明の処理中に予期しないエラーが発生しました。アクションを再試行してください。

OAM-4

システム・エラーです。システム管理者に連絡してください。

OAM-5

ユーザー・アカウントがロックされているか、無効です。システム管理者に連絡してください。

OAM-6

ユーザーはすでにセッションの最大許容数に達しました。ログインを再試行する前に、既存のセッションの1つをクローズしてください。

OAM-7

システム・エラーです。アクションを再試行してください。このエラーが続く場合は、管理者に連絡してください。

OAM-8

認証に失敗しました。

OAM-9

システム・エラーです。アクションを再試行してください。このエラーが続く場合は、管理者に連絡してください。

OAM-10

パスワードの有効期限が切れました。システム管理者に連絡してください。

4.3.3 デフォルト・ページの位置

組込み資格証明コレクタ(ECC)を使用している場合、次のデフォルト・ページにアクセスします。

- ログイン・ページ: http(s)://host:port/oam/pages/login.jsp

- エラー・ページ: http(s)://host:port/oam/pages/servererror.jsp

外部資格証明コレクタ(DCC)を使用している場合、次のデフォルト・ページにアクセスします。

- ログイン・ページ: /oamsso-bin/login.pl

- ログイン・アクションURL: /oam/server/auth_cred_submit。これは、認証スキーム・パラメータでactionが構成されていない場合のデフォルトのアクションURLです。デフォルトのURLに対応する物理ページはありません。URLの場所に物理ページが必要になるのは、認証スキーマでactionが構成されており、アクションURLでランタイムaction typeの結果がパス・スルーの場合のみです。

- エラー・ページ: /oberr.cgi。これは、DCCによって認識されるURLパターンであり、物理的な場所ではありません。

4.3.4 セキュリティ・レベルの構成

エラー・コードのセキュリティ・レベルによってOAMサーバーが返すエラー・コードが決まります。セキュリティ・レベルは、管理者がAccess Manager管理コンソールの構成パネルを使用して構成します。カスタム・ログイン・ページのエラー・コードを構成するとき、次のセキュリティ・レベル設定が使用できます。

- セキュア: セキュリティ・レベルが最も高い設定。汎用的なエラー・メッセージを表示し、エラーの内部的な理由についての情報はほとんど提供しません。

- 外部: 推奨するデフォルトのレベル。

- 内部: セキュリティ・レベルが最も低い設定。エラー・コードをログイン・ページまたはエラー・ページに伝播できます。

表4-3は、セキュリティ・レベルに応じてログインまたはエラー・ページに伝播される標準エラー・コード(表4-2を参照)のリストです。

表4-3 セキュリティ・レベル別のエラー状態マッピング

エラー状態

内部モード

外部モード

セキュア・モード

無効なログインを試行しました。

OAM-1

OAM-2

OAM-8

送信された資格証明の処理がなんらかの理由で失敗しました。たとえば、WNAモードでspnegoトークンが受信されない場合などです。

OAM-3

OAM-3

OAM-8

なんらかの理由で認証例外が発生しました。

OAM-4

OAM-4

OAM-9

ユーザー・アカウントがなんらかの状況によりロックされています。たとえば、無効な試行の回数が上限を超えた場合などです。

OAM-5

OAM-5

OIMが統合されている場合はOAM-8またはOAM-9

ユーザー・アカウントが無効です。

OAM-5

OAM-5

OAM-9

ユーザーが最大許容セッション数を超えました。

これは構成可能な属性です。

OAM-6

OAM-6

OAM-9

複数の理由が考えられます。セキュリティ上の理由から、正確な理由はユーザー・レベルには伝播されません。

特定のメッセージが伝播されない場合は、デフォルトのエラー・メッセージが表示されます。

OAM-7

OAM-7

OAM-9

エラー状態が発生すると、デフォルト・ページが認証ポリシーのfailure-redirect-urlでオーバーライドされていないかぎり、OAMサーバーはデフォルト・エラー・ページをフォワードします。カスタム・エラー・ページを使用する場合は、サーバーがカスタム・ページへリダイレクトするように、そのエラー・ページの絶対URLを認証ポリシーのfailure_redirect_urlで設定する必要があります。カスタム・ログイン・ページは通常、エラー・ページとして機能するロジックを持っています。

エラー状態OAM-1およびOAM-8の場合、資格証明を再度収集できるので、ユーザーはログイン・ページに戻されます。

4.3.5 パスワード・ポリシー検証エラー・コード

パスワード・プラグインがパスワード・ページにリダイレクトし、対応するメッセージがパスワード・ポリシーから取得されます。これらのエラー・コードは、HTTPリクエスト・パラメータruleDesとしてパスワード・ポリシー・ページに送信されます。

表4-4は、パスワードの検証時に返される可能性のあるエラー・コード、メッセージ・キーおよび対応するメッセージのリストです。

表4-4 パスワード検証エラー・コード

URL内のメッセージ・キー

リソース・バンドルのメッセージ・キー

メッセージ・テキスト

PSWD-1

passwordPolicy.message.minLength

パスワードは{0}文字以上である必要があります。

PSWD-2

passwordPolicy.message.maxLength

パスワードは{0}文字以下である必要があります。

PSWD-3

passwordPolicy.message.minAlpha

パスワードには英文字を{0}文字以上含める必要があります。

PSWD-4

passwordPolicy.message.minNumber

パスワードには数字を{0}文字以上含める必要があります。

PSWD-5

passwordPolicy.message.minAlphaNumeric

パスワードには英数字を{0}文字以上含める必要があります。

PSWD-6

passwordPolicy.message.minSpecialChars

パスワードには特殊文字を{0}文字以上含める必要があります。

PSWD-7

passwordPolicy.message.maxSpecialChars

パスワードには特殊文字を最大{0}文字しか使用できません。

PSWD-8

passwordPolicy.message.maxRepeated

パスワードでの特定の文字の繰返しは{0}回までです。

PSWD-9

passwordPolicy.message.minUnique

パスワードには一意の文字を{0}文字以上含める必要があります。

PSWD-10

passwordPolicy.message.minUpperCase

パスワードには大文字を{0}文字以上含める必要があります。

PSWD-11

passwordPolicy.message.minLowerCase

パスワードには小文字を{0}文字以上含める必要があります。

PSWD-12

passwordPolicy.message.maxAge

パスワードは最終パスワード変更の{0}日後に期限切れになります。

PSWD-13

passwordPolicy.message.warnAfter

パスワード変更リマインダは最終パスワード変更の{0}日後に送信されます。

PSWD-14

passwordPolicy.message.reqdChars

パスワードには次の文字を含める必要があります: {0}

PSWD-15

passwordPolicy.message.invalidChars

パスワードに次の文字を含めることはできません: {0}

PSWD-16

passwordPolicy.message.validChars

パスワードには次の文字を含めることができます: {0}

PSWD-17

passwordPolicy.message.invalidStrings

パスワードに次の文字列を含めることはできません: {0}

PSWD-18

passwordPolicy.message.startsWithChar

パスワードはアルファベットで開始する必要があります。

PSWD-19

passwordPolicy.message.disAllowUserId

パスワードは、ユーザーIDと同じにすることも、ユーザーIDを含めることもできません。

PSWD-20

passwordPolicy.message.disAllowFirstName

パスワードは、名と同じにすることも、名を含めることもできません。

PSWD-21

passwordPolicy.message.disAllowLastName

パスワードは、姓と同じにすることも、姓を含めることもできません。

PSWD-22

passwordPolicy.message.dictMessage

辞書にあるような言葉はパスワードにできません。

PSWD-23

passwordPolicy.message.enforceHistory

{0}つ前までのパスワードはいずれもパスワードにできません。

PSWD-24

passwordPolicy.message.minAge

最終パスワード変更後{0}日間はパスワードを変更できません。

PSWD-25

passwordPolicy.message.minUnicode

パスワードにはUnicode文字を{0}文字以上含める必要があります。

PSWD-26

passwordPolicy.message.maxUnicode

パスワードには{0}文字を超えるUnicode文字は使用できません。

4.3.6 セカンダリ・エラー・メッセージの伝播

認証エンジン・レイヤーで、バックエンド・アイデンティティ・ストアからの例外がOAMサーバー固有のエラー・コードにマップされます。その後、これらのコードが伝播されます。プラグインは、セカンダリ・エラー・コードを取得して伝播することにより、適切なアクションを実行させることができます。

注意:

プライマリ・エラー・コードは、どのモードでもエラーまたはログイン・ページに伝播されます。セカンダリ・エラー・メッセージは、セキュリティ・レベルが内部に設定されている場合のみ伝播されます。詳細は、第4.3.4項「セキュリティ・レベルの構成」を参照してください。

セカンダリ・エラー・メッセージは、HTTPリクエスト・パラメータとしてエラー・ページに送信されます。問合せパラメータはp_sec_error_msgという名前です。このメッセージはバックエンドからのコードとメッセージ・テキストを連結した文字列で、翻訳はされていません。

たとえば、OVDがバックエンドであり、無効な資格証明が入力されると、認証が失敗し、その理由としてバックエンドからLDAP:error code 49-Invalid Credentialsが返され、OAMサーバー・エラー・コードOAM-1が返されます。この場合、次のデータがログイン・ページに表示されます。

エンティティ

説明

エラー・コード

OAM-1

プライマリ・メッセージ(コードから取得)

指定したユーザー名またはパスワードが正しくありません

セカンダリ・エラー・コード

LDAP:error code 49- Invalid Credentials

4.3.7 エラー・コードの取得

エラー・コードは、HTTPリクエスト・パラメータとしてエラー・ページに送信されます。問合せパラメータはp_error_codeという名前です。このパラメータ値には、OAMサーバーが返したOAM-1などのエラー・コード値が含まれています。Access Managerの標準エラー・コードおよび対応するメッセージは、表4-2を参照してください。これらのエラー・コードに追加情報はありません。

カスタム・ログイン・ページをカスタム・リソース・バンドルに関連付けることにより、エラー・コードを意味のあるメッセージに変換してエンド・ユーザーに表示できます。ただし、意味のあるエラー・メッセージや翻訳がカスタム・ログイン・ページで必要なければ、カスタム・リソース・バンドルは必要ありません。

4.3.7.1 コード・サンプル

ローカル・リソース・バンドル・ファイルを作成し、表4-3のように、エラー状態をAccess Managerエラー・コードにマップする必要があります。このファイルをログイン・ページまたはエラー・ページで使用できます。

例4-1にリソース・バンドル・コードの例を示します。また、例4-2にエラー・コード・ページの例を示します。

例4-1 リソース・バンドル・コード

package mytest.error;
Import java.util.ListResourceBundle;
public class ExampleErrorMsg extends ListResourceBundle {
/* (non-Javadoc)
* @see java.util.ListResourceBundle#getContents()
*/
public Object[][] getContents()
{
return m_contents;
}
/** The Constant m_contents. */
private static final Object[][] m_contents =
{
{"OAM-1", " An incorrect Username or Password was
specified "},
{"OAM-2", " An incorrect Username or Password was
specified "},
{"OAM-3", "Unexpected Error occurred while processing
credentials. Please retry your action again!"},
{"", ……};
}
}

例4-2 エラー・コード・ページ

<%@page import="mytest.error.ExampleErrorMsg"%>
//initializing the messageBundle first
String defaultResourceBundle = "mytest.error.ExampleErrorMsg";
java.util.Locale myLocale = request.getLocale();
ResourceBundle msgBundle=
ResourceBundle.getBundle(defaultResourceBundle,myLocale);
String errCode = request.getParameter("p_error_code");
String secondaryErrMessage = request.getParameter("p_sec_error_msg");
<%
if(errCode != null && errCode.length() > 0) {
try {
simpleMessage = msgBundle.getString(errCode);
} catch(Exception e) {
//get the default authn failed message
simpleMessage = msgBundle.getString("OAM-8");
}
%>
<div class="message-row">
<p class="loginFailed"> <%=simpleMessage%> </p>
</div>

4.3.7.2 パスワード・ポリシー・エラー・コードの取得

ユーザー向けのページでは、パスワード・ポリシーの結果コンテキストにアクセスでき、該当するメッセージを取得できます。各メッセージには、場合によって追加情報が含まれていることがあります。次のコードの抜粋は、ページでパスワード・ポリシーの結果コンテキストからメッセージと追加情報を取得する方法を示しています。

String simpleMessage = "";
String result = request.getParameter("rejectedRuleDesc");
if(result.indexOf('~') != -1) {
String[] results = result.split("~");
for(String eachResult : results) {
if(eachResult.indexOf(":") != -1) {
String messageKey = eachResult.substring(0, eachResult.indexOf(":"));
String resourceBundleKey = UrlSubstitutionMessages.ERRORCODEMAP.get(messageKey);
String placeHolderValue = eachResult.substring(eachResult.indexOf(":") + 1, eachResult.length());
String displayValue = Localizer.localize(resourceBundleKey, placeHolderValue, myLocale);
simpleMessage += displayValue + "<br>";
}
else {
String resourceBundleKey = UrlSubstitutionMessages.ERRORCODEMAP.get(eachResult);
String displayValue = Localizer.localize(resourceBundleKey, null, myLocale);
simpleMessage += displayValue + "<br>";

}
}
}

たとえば、パスワードの文字数が足りない場合、コンテキストの結果は次のようになります。

- PasswordRuleDescription.getResourceBundleKey()が"passwordPolicy.error.minLength"を返します。

- PasswordRuleDescription.getPlaceHolderValue()が最小文字数を返します。

- PassswordRuleDescription.eachDesc.getDisplayValue()が完全に翻訳されたメッセージを返します。

4.3.7.3 パスワード・ポリシー・ルール

ユーザー向けのページでは、ユーザーに適用されるパスワード・ポリシー・ルールにアクセスできます。各メッセージには、場合によって追加情報が含まれていることがあります。次のコードの抜粋は、ページでパスワード・ポリシーの結果コンテキストからルールと追加情報を取得する方法を示しています。

String simpleMessage = "";
String result = request.getParameter("ruleDesc");
if(result.indexOf('~') != -1) {
String[] results = result.split("~");
for(String eachResult : results) {
if(eachResult.indexOf(":") != -1) {
String messageKey = eachResult.substring(0, eachResult.indexOf(":"));
String resourceBundleKey = UrlSubstitutionMessages.ERRORCODEMAP.get(messageKey);
String placeHolderValue = eachResult.substring(eachResult.indexOf(":") + 1, eachResult.length());
String displayValue = Localizer.localize(resourceBundleKey, placeHolderValue, myLocale);
simpleMessage += displayValue + "<br>";
}
else {
String resourceBundleKey = UrlSubstitutionMessages.ERRORCODEMAP.get(eachResult);
String displayValue = Localizer.localize(resourceBundleKey, null, myLocale);
simpleMessage += displayValue + "<br>";

}
}
}

たとえば、パスワードの文字数が足りない場合、コンテキストの結果は次のようになります。

- PasswordRuleDescription.getResourceBundleKey()が"passwordPolicy.error.minLength"を返します。

- PasswordRuleDescription.getPlaceHolderValue()が最小文字数を返します。

- PassswordRuleDescription.eachDesc.getDisplayValue()が完全に翻訳されたメッセージを返します。

4.3.8 エラー・データ・ソースの一覧

表4-5は、認証プラグインで使用できるエラー・データ・ソースをまとめたものです。

表4-5 認証プラグインのエラー・データ・ソース

ソース

パラメータ

エラー・コード

HTTPリクエスト・パラメータ: p_error_code

プライマリ・エラー・メッセージ

リソース・バンドルからエラー・コードを使用して取得されます。

セカンダリ・エラー・メッセージ(内部エラー・モードの場合のみ送信)

HTTPリクエスト・パラメータ: p_sec_error_msg

サーバー・エラー・コードを連結したリスト

HTTPリクエスト・パラメータ: p_error_codes_list

パスワード・プラグインのエラー・メッセージ

HTTPリクエスト・パラメータ: ruleDesc

プラグイン・クライアント・レスポンス

HTTPリクエスト・パラメータ: PLUGIN_CLIENT_RESPONSE

プラグイン・エラー・レスポンス

HTTPリクエスト・パラメータ: PLUGIN_ERROR_RESPONSE

4.4 外部資格証明コレクタを使用した開発

この項には次のトピックが含まれます。

- 外部資格証明コレクタの考慮事項

- プロセスの概要: DCCを使用したフォームベース・ログイン・ページの作成

4.4.1 外部資格証明コレクタの考慮事項

外部資格証明コレクタ(DCC)を使用してカスタム・ページを開発する場合の主な相違点は次のとおりです。

- 次のWebgate Oracleホーム(WebgateOH)ディレクトリにあるHTMLテンプレートを使用してPerlスクリプトとして実装されたデフォルト・ページとともに、DCCがインストールされます。

- WebgateOH/webgate/ohs/oamsso

- WebgateOH/webgate/ohs/oamsso-bin

- サポートされている認証メカニズムのログイン・ページの他に、デフォルト・エラー・ページおよびデフォルト・ログアウト・ページをカスタマイズできます。
認証フローの外でエラー状態が発生したときや、認証スキームで失敗リダイレクトURLが指定されていない場合、デフォルト・エラー・ページがトリガーされます。デフォルト・エラー・ページのテンプレートおよび関連付けられたエラー・メッセージは、Webgate Oracleホーム内の言語およびロケールごとのサブディレクトリにあります。たとえば、en-usの正確な場所はWebgateOH/webgate/ohs/lang/en-us/WebGate.xmlです。

デフォルト・ログアウト・ページは、WebgateOH/webgate/ohs/oamsso-bin/logout.plにあります。

- DCC自体はカスタム・ページの開発言語を制約しません。カスタム・ページは、DCCをホストしているOracle HTTP Server上にデプロイするか、JSPまたはサーブレットの場合は、それを実行するためのWebコンテナ上にデプロイする必要があります。

- 収集されたデータをDCCにポストするときに使用するHTMLフォームでは、構成可能なURLを使用してこれをポストできます。認証スキームのactionチャレンジ・パラメータで、資格証明を収集できるURLを指定します。

- requestid問合せパラメータの処理は必要ありません。

4.4.2プロセスの概要: DCCを使用したフォームベース・ログイン・ページの作成

1. ユーザー名とパスワードなど、ユーザーの資格証明を送信できるHTMLフォームを作成します。詳細は、第4.2.1項「フォームベース・ログイン・ページの作成」を参照してください。

2. フォームを、DCCを持つWebサーバー上の、保護されていないディレクトリまたは匿名認証スキームで保護されているディレクトリに置きます。

3. フォームベース認証スキームを作成し、チャレンジURLとしてログイン・フォームへのパスを指定します。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

4. HTTP GETまたはPOSTを使用して、フォーム・アクションをコールします。

5. ログイン・フォームのアクションで、ポリシーを使用してターゲットURLを保護します。

6. チャレンジ・パラメータを認証スキームで構成します。

7. 資格証明の処理に使用する認証モジュールを指定します。

4.5 カスタム・ログイン・ページのデプロイ

カスタム・ログイン・ページをWARファイルとして作成し、必要なリソース・バンドル・ファイルと一緒にパッケージ化できます。WARファイルは、DCCの背後にあるアプリケーション上にデプロイできます。DCCが使用されていない場合は、ECCが実行されているサーバーと同じサーバー上にこのページをデプロイできます。ECCを使用している場合は、カスタムWARファイルを使用して認証スキームに次の設定を指定する必要があります。

- コンテキスト・タイプ = CustomWar

- チャレンジURL = WARファイル内のログイン・ページのURLに対する相対パス

- コンテキスト値 = カスタムWARのルート・パスカスタマイズしたエラー・ページをカスタムWARファイルに含める場合は、その絶対URLを認証ポリシーの失敗リダイレクトURIで指定する必要があります。たとえば、http://host:port/SampleLoginWar/pages/MFAError.jspです。

認証スキームとその管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の認証スキーム・ページについての項を参照してください。

4.6 プログラムによる認証

この項には次のトピックが含まれます。

- mod_ossoエージェントの使用

- 要求していないPOSTの使用

4.6.1 mod_ossoエージェントの使用

HTTPクライアントAPIを使用したプログラムによる認証は、OSSO 10gおよび11g OAMサーバーの両方でサポートされています。

4.6.1.1 OSSO 10g

通常、OSSO 10gプログラムによるクライアントは、URLリダイレクトを検索して認証フローを識別します。デフォルトの認証スキームは、埋込みログイン・ページを使用するよう構成されています。OAMサーバーは、リダイレクションを使用するかわりにログイン・ページにフォワードします。OSSO 10g形式のプログラムによるクライアントを動作させるには、資格証明コレクタを外部モードで構成する必要があります。

10gリリースからのアップグレードの場合は、新規のカスタム・ログイン・ページを使用するよう認証スキームSSOCoexistMigrateSchemeを構成します。新規に11gリリースをインストールした場合は、リソースの認証に使用するスキーム、つまりLDAPSchemeを編集します。

チャレンジURLが完全修飾カスタムURLを指すように設定します。たとえば、http://host:port/sample-web/login.jspとなります。また、コンテキスト・タイプをexternalに設定します。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の認証スキームの管理に関する項を参照してください。

4.6.1.2 11g OAMサーバー

11gリリースのOAMサーバーでは、JavaScriptを使用して資格証明入力用のログイン・フォームをクライアントに送信します。クライアントまたはデバイスがスクリプトベースのリダイレクトに対応していない場合は、クライアントが使用するユーザー・エージェントをプログラムによるクライアントとして構成する必要があります。すると、OAMサーバーは、そのクライアントをブラウザ・ベースのクライアントではなくプログラムによるクライアントとして認識します。この場合、OAMサーバーはJavaScriptベースのリダイレクトを使用します。

次に、oam-config.xmlでの構成設定の例を示します。 userAgentType設定の下には複数のエントリを追加できます。

<Setting Name="userAgentType" Type="htf:map">
<Setting Name="Mozilla/4.0 (compatible; Windows NT 5.1)
OracleEMAgentURLTiming/3.0" Type="xsd:string">PROGRAMATIC</Setting>
</Setting>

4.6.1.3 プロセスの概要: プログラムによるクライアントの開発

OSSO 10gとAccess Manager 11gの、どちらのプログラムによるクライアントを開発する場合も次のプロセスを使用します。

1. アプリケーションからクライアントAPIを使用して、保護されているリソースをHTTPチャネル経由で呼び出します。

2. アクセスされたリソースを保護するmod_ossoパートナがsite2pstoretokenを生成し、認証のためにOAMサーバーへリダイレクトします。

3. OAMサーバーが、リクエスト・パラメータsite2pstoretokenとp_submit_urlを持つログイン・ページへリダイレクトします。
p_submit_urlには、プログラムによる認証エンドポイントが格納されています。たとえば、http(s)://host:port/sso/authとなります。デフォルトのブラウザ・アクションURLはサーバー側にセッションを作成しますが、プログラムによる認証エンドポイントにはこのURLがありません。プログラムによる認証エンドポイントは、認証ごとにセッションを作成するのではなく、1ユーザーに1個のグローバル・セッションを使用します。このセッションは、特定の1ユーザーに対してプログラムによって実行されるすべての認証に共通です。

4. プログラムによるクライアントからプログラムによるエンドポイントへ資格証明が送信されます。

5. クライアントは、手順3で取得したssousername、password、s2pstoretokenの情報をp_submit_urlへ送信する必要があります。

6. OAMサーバーが資格証明を検証し、有効ならば、最初の保護されたアプリケーションへリクエストをリダイレクトします。

7. 資格証明の検証がエラーの場合は、p_error_codeが返されます。

4.6.2 要求していないPOSTの使用

11gリリースの場合、要求していないPOSTを使用したプログラムによる認証には、次のプロセスを使用してください。

1. 直接認証を有効化します。
oam-config.xmlで、DirectAuthenticationServiceDescriptorの下のServiceStatusがtrueに設定されていることを確認します。(DirectAuthenticationServiceDescriptorはOAMServicesDescriptorの下にあります)。

2. 次の情報をエンドポイントhttps://oam_host:oam_port/oam/server/authenticationに送信します。

- ユーザー名

- パスワード

- 成功URL。例: http://machinename.mycompany.com:7778/sample-web/headers.jsp

3. 資格証明が認証されると、OAMサーバーはHTTPリダイレクト(HTTPレスポンス・コード302)の一部としてOAM_ID Cookieを設定してから、成功URLにリダイレクトします。

直接認証をPOSTでのみ許可する(またはその逆の)手順は次のとおりです。

1. Oracle Access Management管理コンソールにログインし、「ポリシー構成」→「アプリケーション・ドメイン」に移動します。

2. 「IAMSuite」を選択します。「リソース」に移動し、リソース/oamDirectAuthenticationを検索して編集します。

3. 「操作」で、POSTを除く、サポートしないすべての操作の選択を解除します。たとえば、GET、DELETEなどです。

ユーザー名とパスワードの資格証明の認証方法を成功URLごとに変える手順は次のとおりです。

1. 直接認証リクエスト時にusername、passwordおよびsuccessurlとともに、パラメータtypeと認証メカニズムを指定する値を渡します。

2. 「IAMSuite」アプリケーション・ドメインに移動します。リソースURL /oamDirectAuthentication、およびtypeという名前の問合せ文字列と手順1で指定した値を使用して、新規のリソースを作成します。

3. このリソースを、選択したtypeをサポートする認証スキームに関連付けます。

4. URL /oamDirectAuthenticationと問合せ文字列typeの様々な値(例: type=FORM、type=CREDS)を使用して複数のリソースを作成し、対応する認証スキームに関連付けます。

4.7 認証後のカスタムOSSO Cookieの設定

mod_ossoエージェントについて、11gリリースではカスタムCookieの設定をサポートしています。10gおよび11g Webgateの場合、これは認証および認可レスポンス型Cookieによって実現されます。

OSSOカスタムCookieを構成する手順は次のとおりです。

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

2. OSSOエージェントのアプリケーション・ドメインに移動します。

3. 保護されているリソースの認証ポリシーを選択します。

4. 「レスポンス」タブをクリックします。

5. Cookieレスポンスを追加します。デプロイメントのCookieは、Access Manager 11g認証レスポンス・フォーマットに準拠した名前と値を使用して作成する必要があります。次に例を示します。

- 名前: ORASSO_AUTH_HINT、タイプ: Cookie、値: v1.0~${session.expiration}

- 名前: ORASSO_UCM_COOKIE1、タイプ: Cookie、値: v2.0~${user.attr.displayname}~${user.attr.given}

- 名前: ORASSO_UCM_COOKIE2、タイプ: Cookie、値: v3.0~${user.attr.uid}~${user.attr.mail}

6. 変更内容を保存します。

7. mod_ossoで保護されたアプリケーションにアクセスして、認証後にCookieが作成されていることを確認します。

OSSO Cookieは、デフォルトでは.example.comドメインで設定され、1年後に有効期限が切れるように設定されます。この設定は、次のWLSTコマンドを使用して変更できます。

- updateOSSOResponseCookieConfig

- deleteOSSOResponseCookieConfig

updateOSSOResponseCookieConfigを使用した例を次に示します。

help('updateOSSOResponseCookieConfig')

Description:

Updates OSSO Proxy response cookie settings in system configuration.
Syntax:

updateOSSOResponseCookieConfig(cookieName = "<cookieName>",cookieMaxAge = "<cookie age in minutes>", isSecureCookie = "true | false",cookieDomain="<domain of the cookie>", domainHome = "<wls_domain_home_path>")
cookieName = Name of the cookie for which settings are updated. This is optional parameter. If parameter is not specified global setting is updated.
cookieMaxAge = Max age of cookie in minutes. A negative value will set a session cookie.
isSecureCookie = Boolean flag specifies if cookie should be secure which wouldbe sent only in SSL channel.
cookieDomain = The domain of the cookie.
domainHome = location of domain home <mandatory for offline commands,not required for online>

Example:

updateOSSOResponseCookieConfig(cookieName = "ORASSO_AUTH_HINT",cookieMaxAge = "525600", isSecureCookie = "false", cookieDomain=".example.com",domainHome = "<wls_domain_home_path>")

deleteOSSOResponseCookieConfigを使用した例を次に示します。

help('deleteOSSOResponseCookieConfig')

Description:

Deletes OSSO Proxy response cookie settings in system configuration.
Syntax:

deleteOSSOResponseCookieConfig(cookieName = "<cookieName>",domainHome = "<wls_domain_home_path>")
cookieName = Name of the cookie for which settings are updated. This is mandatoryparameter. The global cookie setting cannot be deleted.
domainHome = location of domain home <mandatory for offline commands,not required for online>

Example:

deleteOSSOResponseCookieConfig(cookieName = "ORASSO_AUTH_HINT",domainHome = "<wls_domain_home_path>")

updateコマンドでCookie名を指定しないと、すべてのCookieのグローバル設定が更新されます。Cookie名を指定すると、特定のCookieのパラメータがオーバーライドされます。次に例を示します。

updateOSSOResponseCookieConfig(cookieMaxAge = "525600", isSecureCookie = "false", cookieDomain=".mycompany.com")

updateOSSOResponseCookieConfig(cookieName="ORASSO_AUTH_HINT", cookieMaxAge = "-1", isSecureCookie = "false", cookieDomain=".mycompany.com")

updateOSSOResponseCookieConfig(cookieName="ORASSO_UCM_COOKIE2", isSecureCookie = "true", cookieDomain=".us.mycompany.com")

deleteOSSOResponseCookieConfig(cookieName = "ORASSO_UCM_COOKIE2")

5 ポリシー・オブジェクトの管理

Access Managerでは、ポリシー・オブジェクトの作成、読取り、更新および削除(CRUD)の操作ができるポリシー管理APIを提供しています。この章では、このAPIについて説明するとともに、Access Managerポリシー管理のRESTful Webサービスの使用例を紹介します。この章の内容は次のとおりです。

- 第5.1項「ポリシー管理APIの概要」

- 第5.2項「互換性」

- 第5.3項「ポリシー・オブジェクトの管理」

- 第5.4項「例」

- 第5.5項「クライアント・ツール」

5.1 ポリシー管理APIの概要

Oracle Policy Administration APIは、Representational State Transfer (REST)インタフェースをサポートしており、Access Managerポリシー・オブジェクトをRESTfulリソースとして管理できます。このAPIは、Java Specification Request (JSR) 311: JAX-RS 1.1仕様: Java API for RESTful Web Services 1.1に準拠しています。詳細は、http://download.oracle.com/otndocs/jcp/jaxrs-1.1-mrel-eval-oth-JSpec/を参照してください。

この項の内容は次のとおりです。

- Access Managerポリシー・モデル

- セキュリティ・モデル

- リソースURL

- URLリソースおよびサポートされているHTTPメソッド

- エラー処理

5.1.1 Access Managerポリシー・モデル

ポリシー管理APIは、Access Managerポリシー・モデル・オブジェクト(アーティファクトともいいます)をRESTfulクライアントに公開し、これらのオブジェクトに対する操作をモデル化して特定のURLおよび操作を含むHTTPリクエストにします。操作は、ポリシー検証と整合性を強制するAccess Managerポリシー管理ルールの対象となります。

図5-1に、ポリシー・モデルおよび管理可能なポリシー・オブジェクトの関係を示します。

図5-1 ポリシー・モデル

「図5-1 ポリシー・モデル」の説明

表5-1に、RESTfulインタフェースを使用して管理できるポリシー・オブジェクトの詳細を示します。各ポリシー・オブジェクトは、HTTP Uniform Resource Locator (URL)によってアクセス可能なHTTPリソースとして表現されます。

表5-1 ポリシー・オブジェクト

オブジェクト名

説明

アプリケーション・ドメイン

11gポリシー・モデルの最上位の構造。各アプリケーション・ドメインは、リソースおよびアクセス可能なユーザーを指示する関連付けられた認証および認可ポリシーの論理コンテナを提供します。

ホスト識別子

ホストに複数の名前を指定できます。Access ManagerがリソースのURLを認識するためには、そのリソースのホスト・コンピュータを参照するために使用される様々な方法を認識している必要があります。

リソース

リソースは、サーバーに格納されて多くのユーザーがアクセスできるドキュメント、エンティティまたは内容の一部を表します。クライアントは、(HTTPメソッドを使用して)サーバーと通信し、既存のリソース・タイプで定義されているリソースをリクエストします。

リソース・タイプ

リソース・タイプは、保護されるリソースの種類を示します。

認証ポリシー

認証ポリシーは、ユーザーの認証に使用される認証方式を指定します。ポリシーは、リソース・アクセスを保護する方法を定義します。

認可ポリシー

認可ポリシーは、サブジェクトまたはアイデンティティがリソースにアクセスできる条件を指定します。

トークン発行ポリシー

トークン発行ポリシーは、クライアントがリクエスタ・パートナであるかエンド・ユーザーであるかにかかわらず、そのクライアントのアイデンティティに基づいて、リソース(リライイング・パーティ・パートナ)に対してトークンを発行する際に従うルールを定義します。

認証スキーム

ユーザーの認証に必要なチャレンジ・メカニズム、信頼レベルおよび基礎となる認証モジュールを定義する名前の付いたコンポーネント。

図5-2に、Access Managerポリシーのコンテンツを示します。

図5-2 ポリシー・コンテンツ

「図5-2 ポリシー・コンテンツ」の説明

OAMサーバーのRESTfulインタフェースには、次のようなクライアント・アプリケーションでアクセスできます。

- Webブラウザ

- cURL

- GNU Wget

5.1.2 セキュリティ・モデル

ポリシー管理REST APIは、管理ロールによって保護されます。RESTサービスは、必要なロールを強制するコンテナ・セキュリティによって保護されます。APIの強制ポリシー構成は、管理コンソールで実行するポリシー管理アクションのポリシー強制と似ています。たとえば、クライアント起動では、資格証明をHTTPリクエストの認可ヘッダーで供給することになっています。これにより、クライアント起動は、次のリクエスト例のようにステートレスのままになります。

次に示すのは、サンプルHTTPリクエストから返されたレスポンス内容の例で、これにはアプリケーション・ドメインのリストが格納されています。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ApplicationDomains>
<ApplicationDomain>
<name>Demo Application Domain</name>
<description>Policy objects enabling OAM Agent to protect deployed Demo applications</description>
</ApplicationDomain>

<ApplicationDomain>
<name>Clear Vision Domain</name>
<description>Policy objects enabling OAM Agents to protect Clear Vision applications</description>
</ApplicationDomain>
</ApplicationDomains>

ユーザー認証用の認証プロバイダは、Access Managerアプリケーション構成に基づいています。RESTサービスがWebgateで保護されている場合、WebgateはURLに関連付けられた認証スキームに基づいてアクセス・リクエストを判断します。これらのURLでは認証方式としてCookieless Basicを使用しています。Cookieless Basicスキームは変更しないで、複数のスキームで保護してください。その場合、Webgateはこれらのリソースへのアクセス・リクエストをパススルーとして扱い、リクエストの認可ヘッダーを保持します。Access Managerは、提供された認可ヘッダーに基づいてリクエストを処理します。

5.1.3 リソースURL

リソースURLは、Access Manager製品バージョン、RESTサービスで公開されるコンポーネント、および呼び出すリソースを含めて構成されます。リソースURLの基本構造は次のとおりです。

http(s)://host:port/oam/services/rest/path

説明:

host

OAMサーバーが稼働しているホスト。

port

HTTPまたはHTTPSポート

path

特定のリソースを識別する相対パス。pathの構造は/version/component/service/です。

説明:

- version: Access Managerの製品バージョン(11.1.2.0.0など)。

- component: RESTfulサービスで公開されるコンポーネント(ssa、ssoなど)。

- service: 特定のAPIのルート・リソース(ホスト識別子など)。

pathの値の例: /oam/services/rest/11.1.2.0.0/ssa/policyadmin/hostidentifier/host_identifier_name

ポリシー管理REST Web Application Description Language (WADL)ファイルには、サポートされているポリシー・リソースおよびメソッドが列挙されています。ポリシー管理REST WADLドキュメントは、http://adminserver.mycompany.com:adminport/oam/services/rest/11.1.2.0.0/ssa/policyadmin/application.wadlにあります。

リクエスト問合せパラメータを処理するには、追加パラメータが必要です。リソースURLは、いずれもOPTIONSメソッドをサポートしています。

ポリシー・オブジェクトは名前またはIDで識別できます。両方とも指定した場合は、IDが使用されます。

図5-1に示したポリシー・オブジェクトを管理可能にするために公開されるリソースURLを、表5-2にまとめます。この表は、次のように使用します。

- IDENTIFERは、リクエストが参照するオブジェクトの名前またはIDです。

- APPDOM_IDENTIFERは、既存のアプリケーション・ドメイン型オブジェクトをappidまたはappnameによって一意に識別します。

表5-2 リソースURL

ポリシー・オブジェクト

URL

アーティファクトの必須パラメータ

アプリケーション・ドメイン

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/appdomain

IDENTIFIER

ホスト識別子

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/hostidentifier

IDENTIFIER

リソース・タイプ

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/resourcetype

IDENTIFIER

リソース

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/resource

IDENTIFIER、APPDOM_IDENTIFIER

認証ポリシー

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/authnpolicy

IDENTIFIER、APPDOM_IDENTIFIER

認可ポリシー

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/authzpolicy

IDENTIFIER、APPDOM_IDENTIFIER

トークン発行ポリシー

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/tokenpolicy

IDENTIFIER、APPDOM_IDENTIFIER

5.1.4 URLリソースおよびサポートされているHTTPメソッド

Access Managerポリシー・オブジェクトは、URLリソースにマップされています。各ポリシーはグローバル識別子(URI)で参照されます。

URLリソースへのアクセスはユーザー・ロールに基づいています。RESTfulサービスでは、ユーザー資格証明がBASICモードのHTTPリクエストの認証ヘッダー内にあると想定しています。認証されたユーザーがポリシー管理ロールを持っていれば、リクエストされたポリシー管理アクションが実行されます。

5.1.5 エラー処理

サービス・リクエストの結果として、無効なサービス呼出しからサーバー側の失敗まで様々なエラー状態が発生する可能性があります。失敗およびエラー・コードの状態は、説明メッセージ付きのHTTPリターン・コードとしてクライアントに報告されます。

表5-3に、HTTPリターン・コードとメッセージの対応関係を示します。

表5-3 エラー状態とHTTPリターン・コード

エラー状態

HTTPリターン・コード

内容

入力を解析でないか、入力が必須エンティティと一致しない。

400

Bad request

サービスが見つからない。

404

Not found

リクエストされたオブジェクトが見つからない。

404

Not found <見つからないオブジェクトを示す追加情報>

ユーザーにアクティビティの実行権限がない。

401

Unauthorized

リクエストされたメソッドがサポートされていない。

405

Method not allowed

作成されたコンテンツ・タイプをクライアントが受け付けない。

406

Not acceptable

リクエスト・パラメータのセマンティックが正しくない。

422

Unprocessable entity <エラーの性質に関する追加情報>

クライアント・メディア・タイプがサポートされていない。

415

Unsupported media type.

注意: サポートされているメディア・タイプはtext/xml (またはapplication/xml)およびapplication/jsonです。

依存性のエラーが発生した。

424

Failed dependency <エラーとなった依存性に関する追加情報>

汎用的なサーバー・エラー。

500

Internal server error

5.2 互換性

リリース・バージョン番号が、OAMサーバーで公開されるRESTサービスURLの一部として埋め込まれます。上位互換性はサポートされていません。新しいバージョンのクライアントが古いバージョンのOAMサーバーにリクエストを送信することはできず、新しいバージョンのオブジェクトが送り返されます。古いクライアントに対する下位互換性はサポートされています。

5.3 ポリシー・オブジェクトの管理

この項の内容は次のとおりです。

- HTTPメソッド

- メディア・タイプ

- リソース一覧

5.3.1 HTTPメソッド

表5-4に、サポートされているHTTPメソッドを示します。HTTPメソッドは、成功すると、xmlファイルであるポリシー・オブジェクト(リソース)の表現に影響を及ぼします。JavaScript Object Notation (JSON)オブジェクトが返されます。

表5-4 ポリシー・オブジェクトを管理するためのメソッド

メソッド

操作

GET

ポリシー・オブジェクトを取得します。

POST

ポリシー・オブジェクトを作成します。

PUT

ポリシー・オブジェクトを変更します。

DELETE

ポリシー・オブジェクトを削除します。

5.3.2 メディア・タイプ

サポートされているメディア・タイプは次のとおりです。

- application/xml

- application/json

- text/xml

5.3.3 リソース一覧

表5-5に、各ポリシー・リソース、サポートされているHTTPメソッドおよび各操作の結果の詳細を示します。

表5-5 Access Managerポリシー・リソースの一覧

リソース

メソッド

説明

oam/services/rest/11.1.2.0.0/ssa/policyadmin/appdomain

GET

一致するすべてのアプリケーション・ドメイン・リソースが返されます。問合せパラメータを指定しない場合、すべてのアプリケーション・ドメイン・リソースが返されます。IDまたはNAME問合せパラメータを指定した場合、一致するすべてのアプリケーション・ドメイン・リソースが返されます。

POST

このメソッドでは、アプリケーション・ドメイン・オブジェクトが作成されます。リクエスト本文にアプリケーション・ドメインを含める必要があります。リクエストに一致するアプリケーション・ドメイン・オブジェクトが作成されます。

ポリシー子オブジェクトもすべて作成されます。

PUT

このメソッドでは、アプリケーション・ドメイン・オブジェクトが変更されます。リクエスト本文に、そのオブジェクトを表すアプリケーション・ドメイン・リソースを含める必要があります。

指定のIDまたはNAME問合せパラメータと一致するアプリケーション・ドメイン・リソースが変更されます。

問合せパラメータが一致しない場合、IDまたはNAME問合せパラメータと一致するアプリケーション・ドメイン・オブジェクトが変更されます。IDとNAMEを両方とも指定した場合は、ID値が使用されます。

DELETE

このメソッドでは、アプリケーション・ドメイン・オブジェクトが削除されます。IDまたはNAME問合せパラメータと一致するアプリケーション・ドメインが削除されます。

oam/services/rest/11.1.2.0.0/ssa/policyadmin/tokenissuancepolicy

GET

このメソッドでは、トークン発行ポリシー・オブジェクトが取得されます。トークン発行ポリシー・オブジェクトを表すリソースが返されます。この表現には、一致するトークン発行ポリシー・リソースの属性とその値が格納されています。

有効な問合せパラメータはIDまたはNAMEと、APPDOMAINIDまたはAPPDOMAINです。APPDOMAINIDまたはAPPDOMAINパラメータを指定しないと、ステータス・コード424が対応するメッセージとともに返されます。IDまたはNAME問合せパラメータを指定しないと、アプリケーション・ドメイン内のすべてのトークン発行ポリシー・リソースが返されます。

IDまたはNAMEパラメータが一致する場合は、そのアプリケーション・ドメイン内のすべてのトークン発行ポリシー・リソースが返されます。いずれの場合も、IDとNAMEを両方とも指定すると、ID値が使用されます。

POST

このメソッドでは、トークン発行ポリシー・オブジェクトが作成されます。オブジェクトの親にあたるリソースに対してリクエストが実行されます。リクエスト本文に、オブジェクトを表すトークン発行ポリシー・リソースを含める必要があります。リクエストに一致するトークン発行ポリシー・オブジェクトが、対応するアプリケーション・ドメイン内に作成されます。

PUT

このメソッドでは、トークン発行ポリシー・オブジェクトが変更されます。リクエスト本文に、そのオブジェクトを表すトークン発行ポリシー・リソースを含める必要があります。

IDまたはNAME問合せパラメータと一致するトークン発行ポリシー・リソースが変更されます。

トークン発行ポリシー・オブジェクトは、APPDOMAINIDまたはAPPDOMAIN問合せパラメータと一致するアプリケーション・ドメインに属している必要があります。

問合せパラメータを指定しないと、IDまたはNAMEパラメータと一致するトークン発行ポリシーが変更されます。

トークン発行ポリシーは、アプリケーション・ドメイン名属性で指定したアプリケーション・ドメインに属している必要があります。IDとNAMEを両方とも指定した場合は、ID値が使用されます。

DELETE

このメソッドでは、トークン発行ポリシー・オブジェクトが削除されます。APPDOMAINIDまたはAPPDOMAIN問合せパラメータで指定したアプリケーション・ドメイン内の、IDまたはNAME問合せパラメータと一致するトークン発行ポリシーが削除されます。

oam/services/rest/11.1.2.0.0/ssa/policyadmin/resource

GET

このメソッドでは、リソース・オブジェクトが取得されます。リソース・オブジェクトを表すリソースが返されます。この表現には、一致するリソース・リソースの属性とその値が格納されています。

有効な問合せパラメータはIDまたはNAMEと、APPDOMAINIDまたはAPPDOMAINです。APPDOMAINIDまたはAPPDOMAINパラメータを指定しないと、ステータス・コード424が対応するメッセージとともに返されます。

IDまたはNAME問合せパラメータを指定しない場合、そのアプリケーション・ドメイン内のすべてのリソース・リソースが返されます。IDまたはNAMEパラメータが一致する場合は、アプリケーション・ドメイン内の一致するリソース・リソースが返されます。いずれの場合も、IDとNAMEを両方とも指定すると、ID値が使用されます。

POST

このメソッドでは、リソース・オブジェクトが作成されます。オブジェクトの親にあたるリソースに対してリクエストが実行されます。リクエストに一致するリソース・オブジェクトが、対応するアプリケーション・ドメイン内に作成されます。

PUT

このメソッドでは、リソース・オブジェクトが変更されます。リクエスト本文に、そのオブジェクトを表すリソース・リソースを含める必要があります。

IDまたはNAME問合せパラメータと一致するリソースが変更されます。リソースは、APPDOMAINIDまたはAPPDOMAIN問合せパラメータと一致するアプリケーション・ドメインに属している必要があります。

問合せパラメータを指定しない場合、指定したIDまたはNAMEと一致するリソース・オブジェクトが変更されます。

リソースは、アプリケーション・ドメイン名属性で指定したアプリケーション・ドメインに属している必要があります。

IDとNAMEを両方とも指定した場合は、ID値が使用されます。

DELETE

このメソッドでは、リソース・オブジェクトが削除されます。APPDOMAINIDまたはAPPDOMAIN問合せパラメータで指定したアプリケーション・ドメイン内の、IDまたはNAME問合せパラメータと一致するリソース・オブジェクトが削除されます。

oam/services/rest/11.1.2.0.0/ssa/policyadmin/authzpolicy

GET

このメソッドでは、認可ポリシー・オブジェクトが取得されます。認可ポリシー・オブジェクトを表すリソースが返されます。この表現には、一致する認可ポリシー・リソースの属性とその値が格納されています。

有効な問合せパラメータはIDまたはNAMEと、APPDOMAINIDまたはappdomainです。appdomainidまたはAPPDOMAINパラメータを指定しないと、ステータス・コード424が対応するメッセージとともに返されます。

IDまたはNAMEパラメータを指定しない場合、そのアプリケーション・ドメイン内のすべての認可ポリシー・リソースが返されます。

IDまたはNAMEパラメータが一致する場合は、アプリケーション・ドメイン内の一致する認可ポリシー・リソースが返されます。いずれの場合も、IDとNAMEを両方とも指定すると、ID値が使用されます。

POST

このメソッドでは、認可ポリシー・オブジェクトが作成されます。オブジェクトの親にあたるリソースに対してリクエストが実行されます。リクエストに一致する認可ポリシー・オブジェクトが、対応するアプリケーション・ドメイン内に作成されます。

PUT

このメソッドでは、認可ポリシー・オブジェクトが変更されます。リクエスト本文に、オブジェクトを表す認可ポリシー・リソースを含める必要があります。

IDまたはNAME問合せパラメータと一致する認可ポリシー・リソースが変更されます。

認可ポリシーは、APPDOMAINIDまたはAPPDOMAIN問合せパラメータと一致するアプリケーション・ドメインに属している必要があります。

問合せパラメータを指定しない場合、IDまたはNAMEパラメータと一致する認可ポリシーが変更されます。認可ポリシーは、アプリケーション・ドメイン名属性で指定したアプリケーション・ドメインに属している必要があります。

IDとNAMEを両方とも指定した場合は、ID値が使用されます。

DELETE

このメソッドでは、認可ポリシー・オブジェクトが削除されます。APPDOMAINIDまたはAPPDOMAIN問合せパラメータで指定したアプリケーション・ドメイン内の、IDまたはNAME問合せパラメータと一致する認可ポリシーが削除されます。

oam/services/rest/11.1.2.0.0/ssa/policyadmin/hostidentifier

GET

このメソッドでは、ホスト識別子オブジェクトが取得されます。ホスト識別子オブジェクトを表すリソースが返されます。この表現には、一致するホスト識別子リソースの属性とその値が格納されています。

有効な問合せパラメータはIDまたはNAMEです。問合せパラメータを指定しない場合、すべてのホスト識別子リソースが返されます。IDまたはNAMEパラメータが一致する場合は、一致するホスト識別子リソースが返されます。

POST

このメソッドでは、ホスト識別子オブジェクトが作成されます。オブジェクトの親にあたるリソースに対してリクエストが実行されます。リクエストに一致するホスト識別子オブジェクトが作成されます。

PUT

このメソッドでは、ホスト識別子オブジェクトが変更されます。リクエスト本文に、そのオブジェクトを表すホスト識別子リソースを含める必要があります。

IDまたはNAME問合せパラメータと一致するホスト識別子リソースが変更されます。問合せパラメータを指定しない場合、IDまたはNAMEパラメータと一致するホスト識別子が変更されます。IDとNAMEを両方とも指定した場合は、ID値が使用されます。

DELETE

このメソッドでは、ホスト識別子オブジェクトが削除されます。IDまたはNAME問合せパラメータと一致するホスト識別子が削除されます。

oam/services/rest/11.1.2.0.0/ssa/policyadmin/resourcetype

GET

このメソッドでは、リソース・タイプ・オブジェクトが取得されます。リソース・タイプ・オブジェクトを表すリソースが返されます。この表現には、一致するリソース・タイプ・リソースの属性とその値が格納されています。

有効な問合せパラメータはIDまたはNAMEです。問合せパラメータを指定しない場合、すべてのリソース・タイプ・リソースが返されます。IDまたはNAME問合せパラメータが一致する場合は、一致するリソース・タイプが返されます。

POST

このメソッドでは、リソース・タイプ・オブジェクトが作成されます。オブジェクトの親に対してリクエスト本文が実行されます。このリクエストに一致するリソース・タイプ・オブジェクトが作成されます。

PUT

このRESTメソッドでは、リソース・タイプ・オブジェクトが変更されます。リクエスト本文に、そのオブジェクトを表すリソース・タイプ・リソースを含める必要があります。

IDまたはNAME問合せパラメータと一致するリソース・タイプ・リソースが変更されます。問合せパラメータを指定しない場合、IDまたはNAMEパラメータと一致するリソース・タイプが変更されます。IDとNAMEを両方とも指定した場合は、ID値が使用されます。

DELETE

このメソッドでは、リソース・タイプ・オブジェクトが削除されます。NAMEまたはID問合せパラメータと一致するリソース・タイプが削除されます。

oam/services/rest/11.1.2.0.0/ssa/policyadmin/authnscheme

GET

このメソッドでは、認証スキーム・オブジェクトが取得されます。認証スキーム・オブジェクトを表すリソースが返されます。この表現には、一致する認証スキーム・リソースの属性とその値が格納されています。

有効な問合せパラメータはIDまたはNAMEです。問合せパラメータを指定しない場合、すべての認証スキーム・リソースが返されます。問合せパラメータIDまたはNAMEが一致する場合は、一致する認証スキームが返されます。

POST

このメソッドでは、認証スキーム・オブジェクトが作成されます。オブジェクトの親にあたるリソースに対してリクエストが実行されます。リクエストに一致する認証スキーム・オブジェクトが作成されます。

PUT

このメソッドでは、認証スキーム・オブジェクトが変更されます。リクエスト本文に、そのオブジェクトを表す認証スキーム・リソースを含める必要があります。

IDまたはNAME問合せパラメータと一致する認証スキーム・リソースが変更されます。問合せパラメータを指定しない場合、IDまたはNAMEパラメータと一致する認証スキームが変更されます。IDとNAMEを両方とも指定した場合は、ID値が使用されます。

DELETE

このメソッドでは、認証スキーム・オブジェクトが削除されます。NAMEまたはID問合せパラメータと一致する認証スキームが削除されます。

/oam/services/rest/11.1.2.0.0/ssa/policyadmin/application.wadl

GET

Webアプリケーション定義ドキュメントが生成されます。このドキュメントは、提供されるRESTサービスを記述するものです。このドキュメントには、HTMLコンテンツをレンダリングするスタイルシート参照が格納されています。

5.4 例

ここでは、次の例を示します。

- アプリケーション・ドメインの取得

- 新しいアプリケーション・ドメインの作成

- すべての認証スキームの取得

- 新しい認証スキームの作成

- 特定の認証スキームの取得

- アプリケーション・ドメイン内のすべてのリソースの取得

- アプリケーション・ドメイン内のリソースの作成

- アプリケーション・ドメイン内のすべてのポリシーの取得

5.4.1 アプリケーション・ドメインの取得

cURLコマンド

$ curl -u USER:PASSWORD http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/appdomain

サンプル出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ApplicationDomains>
<ApplicationDomain>
<id>759463e3-2b63-4e38-893c-00d5da479719</id>
<name>IAM Suite</name>
<description>Policy objects enabling OAM Agent to protect deployed IAM Suite applications</description>
</ApplicationDomain>

<ApplicationDomain>
<id>69f6be9b-f000-48db-9b6d-df4724cc0bd9</id>
<name>Fusion Apps Integration</name>
<description>Policy objects enabling integration with Oracle Fusion Applications</description>
</ApplicationDomain>

5.4.2 新しいアプリケーション・ドメインの作成

cURLコマンド

curl -u weblogic:welcome1 -H "Content-Type: application/xml" --request POST --data "@/tmp/cr.appdomain.xml" http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/appdomain

サンプル入力ファイル

<ApplicationDomain>
<name>Appdomain1</name>
<description>test application domain</description>
</ApplicationDomain>

サンプル出力

http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/appdomain?id=fa60e312-fe65-4aa8-aace-1735a39c4058

5.4.3 すべての認証スキームの取得

cURLコマンド

curl -u USER:PASSWORD http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/authnscheme

サンプル出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AuthenticationSchemes>
<AuthenticationScheme>
<id>aa84b589-7f16-4b3a-942c-ba51b3ab6de5</id>
<name>KerberosScheme</name>
<description>Kerberos Scheme</description>
<authnModuleName>Kerberos</authnModuleName>
<authnSchemeLevel>2</authnSchemeLevel>
<challengeMechanism>WNA</challengeMechanism>
<ChallengeParameters>
<challengeParameter>
<key>spnegotoken</key>
<value>string</value>
</challengeParameter>
<challengeParameter>
<key>challenge_url</key>
<value>/oam/CredCollectServlet/WNA</value>
</challengeParameter>
</ChallengeParameters>
<challengeRedirectURL>/oam/server/</challengeRedirectURL>
</AuthenticationScheme>
</AuthenticationSchemes>

5.4.4 新しい認証スキームの作成

cURLコマンド

curl -u weblogic:welcome1 -H "Content-Type: application/xml" --request POST --data "@/tmp/cr.authnscheme.xml" http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/authnscheme

サンプル入力ファイル

<AuthenticationScheme>
<name>TestAuthnScheme</name>
<description>test authn scheme</description>
<authnModuleName>TestModule1</authnModuleName>
<authnSchemeLevel>2</authnSchemeLevel>
<challengeMechanism>WNA</challengeMechanism>
<ChallengeParameters>
<challengeParameter>
<key>spnegotoken</key>
<value>string</value>
</challengeParameter>
<challengeParameter>
<key>challenge_url</key>
<value>/oam/CredCollectServlet/WNA</value>
</challengeParameter>
</ChallengeParameters>
<challengeRedirectURL>/oam/server/</challengeRedirectURL>
</AuthenticationScheme>
~

サンプル出力

http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/authnscheme?id=acb1fa95-f780-4091-be88-2e96cf5bbd49

5.4.5 特定の認証スキームの取得

cURLコマンド

curl -u USER:PASSWORD http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/authnscheme?name=KerberosScheme

サンプル出力

<AuthenticationScheme>
<id>aa84b589-7f16-4b3a-942c-ba51b3ab6de5</id>
<name>KerberosScheme</name>
<description>Kerberos Scheme</description>
<authnModuleName>Kerberos</authnModuleName>
<authnSchemeLevel>2</authnSchemeLevel>
<challengeMechanism>WNA</challengeMechanism>
<ChallengeParameters>
<challengeParameter>
<key>spnegotoken</key>
<value>string</value>
</challengeParameter>
<challengeParameter>
<key>challenge_url</key>
<value>/oam/CredCollectServlet/WNA</value>
</challengeParameter>
</ChallengeParameters>
<challengeRedirectURL>/oam/server/</challengeRedirectURL>
</AuthenticationScheme>

5.4.6 アプリケーション・ドメイン内のすべてのリソースの取得

cURLコマンド

curl -u USER:PASSWORD http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/resource?appdomain="IAM Suite"

5.4.7 アプリケーション・ドメイン内のリソースの作成

cURLコマンド

curl -u weblogic:welcome1 -H "Content-Type: application/xml" --request POST --data "@/tmp/cr.resource.xml" http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/resource?appdomain="AppDomain1"

5.4.8 アプリケーション・ドメイン内のすべてのポリシーの取得

cURLコマンド

curl -u USER:PASSWORD http://<SERVER>:<PORT>/oam/services/rest/11.1.2.0.0/ssa/policyadmin/authnpolicy?appdomain="IAM Suite"

5.5 クライアント・ツール

RESTfulサービス・リソースを表すクライアント側POJOの生成には、次の2つのXMLスキーマを使用できます。

- ポリシー管理サービスの場合、スキーマはoam-policyadmin-11.1.2.0.0.xsdです。

- トークン・サービスの場合、スキーマはoam-token-11.1.2.0.0.xsdです。

クライアント側オブジェクトを生成するには、JAXBコマンドxjc (JDKの一部)を次のように実行します。

xjc  [-p package-name] oam-policyadmin-11.1.2.0.0.xsd

このコマンドは、クライアント側Javaコードで使用できるRESTfulリソースのJava POJOオブジェクトを生成します。JAXBを使用してこれらのオブジェクトをXMLに戻し、HTTPでRESTサーバーに送信することができます。

JAXBの詳細は、http://jaxb.java.net/を参照してください。JerseyベースRESTサーバーのクライアントの構築の詳細は、http://jersey.java.net/を参照してください。

6 偽装を管理するアプリケーションの開発

Access Manager偽装サポートにより、ユーザーは制限時間枠内において自分のかわりを務める他のユーザーを指定できます。偽装権限付与はAccess Managerでネイティブにサポートされていますが、偽装権限付与を管理するにはカスタム・ユーザー・インタフェースを開発するか、既存のインタフェースを変更する必要があります。この章では、偽装の有効化とカスタム・ユーザー・インタフェースの開発について説明します。内容は次のとおりです。

- 第6.1項「偽装について」

- 第6.2項「偽装サポートの構成」

- 第6.3項「SSOログインおよび偽装のテスト」

参照:

"『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のOracle ADFアプリケーションとOracle Access Manager 11g SSOの統合に関する項を参照してください。

6.1 偽装について

Access Managerのユーザー偽装機能を使用すると、あるユーザーが別のユーザーのかわりに操作を実行したり、リソースにアクセスしたりできます。あるユーザーが別のユーザーを偽装するには、ユーザー識別子と開始および終了時間を指定した偽装権限付与が必要です。

次の内容について説明します。

- 偽装の概念と用語

- 偽装権限付与の構文

- SSOサービスを使用した偽装トリガーの呼出し

6.1.1 偽装の概念と用語

表6-1に、Access Managerにおける偽装の一般的な概念と用語を示します。

表6-1 偽装の用語

用語

定義

インパーソネータ

別のユーザーのかわりを務めるユーザー。

被偽装者

別のユーザーによって偽装されるユーザー。

偽装権限付与

被偽装者によって作成されるセキュリティ・メタデータで、指定時間枠の間、自分のかわりを務める特定のインパーソネータを指定するためのもの。

偽装トリガー

インパーソネータが別のユーザーのかわりに偽装セッションを開始する行為。

Access Manager偽装セッション

対象アプリケーションによる通常のユーザー・セッションとは異なるタイプのAccess Managerセッション。

偽装同意

Access Manager偽装セッションが有効であることを承認するためのインパーソネータによる同意。

Access Managerユーザー偽装サポートにより、エンド・ユーザー(被偽装者)は制限時間枠の間、自分のかわりを務める他のユーザー(インパーソネータ)を1人以上指定できます。開発するカスタム・ユーザー・インタフェースを使用してこの情報が収集され、偽装権限付与のセットとしてユーザー・ディレクトリに永続化されます。

インパーソネータは、認証済セッションを保持してカスタム・ユーザー・インタフェースと対話している間に、別の名前付きユーザーのかわりに偽装セッションを開始できます。Access Managerは必要な認可チェックを行い、インパーソネータが被偽装者を偽装することを許可されているかどうかを確認します。許可されていれば、偽装セッションが作成されます。

Access Managerで保護されたアプリケーションは、偽装されたユーザーがアクセスしているかのように動作します。アプリケーションでは、ユーザーがインパーソネータか被偽装者かを識別できます。

インパーソネータがアプリケーション・ユーザー・インタフェースから偽装セッションを終了させると、偽装セッションは終了します。インパーソネータは通常のユーザー・セッションに復帰し、再び自分自身としてアプリケーションにアクセスできます。インパーソネータが偽装セッション中に偽装されたユーザーを切り替えることはできません(つまり、偽装のネストや再帰は許可されていません)。

Access Managerでは前述の偽装セマンティックを実行時に強制できますが、ユーザー・インタフェースの外観や関連メタデータ(偽装権限付与)のライフサイクルはすべてカスタム・インタフェースによって提供する必要があります。Access Managerとカスタム・ユーザー・インタフェースの統合は、次の3つのインタフェース(接触点)によって分類できます。

- 偽装権限付与の構文、永続性およびライフサイクル

- 偽装トリガーの呼出し

- Access Manager偽装セッション中のインパーソネータ・アイデンティティの伝達

6.1.2 偽装権限付与の構文

次の2つの偽装権限付与は、orclIDXPersonオブジェクト・クラスの一部です。

- orclImpersonationGrantee: ユーザーに対する権限付与がこの属性に含まれている場合、そのユーザーは現ユーザーを偽装できます。この属性は、偽装リクエスト時にOAMサーバーによってチェックされます。

- orclImpersonationGranter: ユーザーに対する権限付与がこの属性に含まれている場合、そのユーザーを現ユーザーが偽装することができます。この属性は偽装を強制するときには使用されず、アプリケーションから偽装セッションを開始するときに使用されます。

被偽装者の偽装権限付与は、LDAPディレクトリ内のユーザーのレコードに複数値属性として永続化されます。ぞれぞれの値は、指定のインパーソネータに対する特定の権限付与および指定した時間枠を表します。複数値属性の各値は複合文字列であり、それぞれのフィールドが区切り文字で仕切られています。このリリースでは、偽装機能の使用時にOracle Identity Directoryがサポートされます。

各ユーザーが自分のユーザー・プロファイル内で偽装権限付与を作成、表示、更新または削除できるカスタム・ユーザー・インタフェースを作成または変更できます。このユーザー・インタフェースは、偽装権限付与を指定のLDAPディレクトリ内のorclImpersonationGranteeという複数値属性に永続化するよう構築する必要があります。各値の書式は<Impersonator orclGUID> | <begin LDAP timestamp> | <end LDAP timestamp>です。次に例を示します。

orclImpersonationGrantee: xyz123abcd|20100604224517Z|20100604234517Z;
klmn980nopr|20100604224517Z|20100604234517Z

次の例では、次のように想定してします。

- インパーソネータ: jdoe

- 被偽装者: lsmith

jdoeがlsmithを偽装しようとしています。次のコマンドを使用してインパーソネータ(jdoe)のOrclGuidを取得できます。

ldapsearch -h <hostname> -w <password>  -p <port> -D"cn=orcladmin" -b"dc=us,dc=mycompany,dc=com"  "cn=jdoe" orclguid

たとえば、orclguidをLDAP検索するコマンドは次のとおりです。

ldapsearch -h myhost1.us.mycompany.com -w welcome1 -p 16890 -b"dc=us,dc=mycompany,dc=com" -D"cn=orcladmin"  "cn=jdoe" orclguid
version: 1

説明:

- dn: cn=jdoe,cn=Users,dc=us,dc=mycompany,dc=com

- orclguid: A14BEB42E822D605E040E50AB29327E7

たとえば、orclImpersonationGranteeをLDAP検索するコマンドは次のとおりです。

ldapsearch -h host1.us.mycompany.com -w welcome1 -p 16890 -b"dc=us,dc=mycompany,dc=com" -D"cn=orcladmin"  "cn=lsmith" orclImpersonationGrantee
version: 1

説明:

- dn: cn=lsmith,cn=Users,dc=us,dc=mycompany,dc=com

- orclImpersonationGrantee: A14BEB42E822D605E040E50AB29327E7|20100324163000Z|20120524172000Z

次のようにOIDで、この値を偽装されたユーザーのorclImpersonationGranteeエントリに追加します。

A14BEB42E822D605E040E50AB29327E7|20100324163000Z|20120524172000Z

注意:

値のリスト内で空白は使用できません。

オブジェクト・クラスおよびこの属性の属性定義がLDAPサーバーのスキーマでブートストラップされている必要があります。OID 11.1.1.3以降には、必要なオブジェクト・クラスが含まれています。

インパーソネータが偽装セッションを作成しようとすると、Access Managerは指定された被偽装者の偽装権限付与を取得します。ただし、そのインパーソネータに対する権限付与が存在しないか、現在の時刻が権限付与の時間枠内にない場合、偽装セッションの作成は失敗します。それ以外の場合、Access Managerはユーザー・プロファイル内の権限付与の読取りや変更を行いません。

その後、偽装セッションを認可した偽装権限付与を(たとえば、orclImpersonationGrantee属性の変更などによって)取り消しても、実行中の偽装セッションには影響しません。

6.1.3 SSOサービスを使用した偽装トリガーの呼出し

認証されたユーザーは別のユーザーを偽装できます。どのユーザーを偽装するかを選択するためのユーザー・インタフェースがアプリケーションから提供されます。情報の収集が完了すると、アプリケーションは偽装トリガーを呼び出します。それには、例6-1に示すようにSSOサービスのメソッドの1つを呼び出すか、ユーザーのブラウザをAccess ManagerトリガーURLにリダイレクトして直接呼び出します。

SSOサービスの詳細は、『Oracle Fusion Middlewareアプリケーション・セキュリティ・ガイド』のアイデンティティ・プロバイダ、プロパティ・セットおよびSSOの構成に関する項を参照してください。

SSOサービスを使用してトリガー・メカニズムの詳細を抽象化するために必要なメソッドを例6-1に示します(推奨)。

例6-1 SsoService APIを使用してトリガー・メカニズムを抽象化するために必要なメソッド

void beginImpersonation(HttpServletRequest request, HttpServletResponse response,
Map<String, ?> props) throws SsoServiceException
void endImpersonation(HttpServletRequest request, HttpServletResponse response,
Map<String, ?> props) throws SsoServiceException

この例では、SSOServiceのログイン/ログアウト/自動ログインAPIと同様に、propsに被偽装者のIMP_USER_ID、SUCCESS_URL、FAILURE_URLおよびTARGET_URLが格納されています。簡略化した例を例6-2に示します。

例6-2 SsoService APIトリガーの簡略例

import oracle.security.jps.JpsException;
import oracle.security.jps.service.JpsServiceLocator;
import oracle.security.jps.service.ServiceLocator;
import oracle.security.jps.service.sso.SsoService;

public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException

{

try {
ServiceLocator serviceLocator = JpsServiceLocator.getServiceLocator();
SsoService sso = (SsoService)serviceLocator.lookup(SsoService.class);

Map m = new HashMap();

m.put(SsoService.SUCCESS_URL, "https://login01.mycompany.com:7777/appl2.html");
m.put(SsoService.FAILURE_URL, "https://login01.mycompany.com:7777/fail.html");
m.put(SsoService.IMP_USER_ID, "mcooper");

sso.beginImpersonation(req, res, m);

[....]

m.put(SsoService.TARGET_URL, "https://login02.mycompany.com:8080/
normalSession.html");
sso.endImpersonation(req, res, m);

} catch(JpsException jpse) {
jpse.printStackTrace();
}
}

例6-3はjps-config.xmlの抜粋で、必要な構成の変更を示しています(imp.begin.urlおよびimp.end.urlプロパティ)。

例6-3 imp.begin.urとimp.end.urlの変更を伴うjps-config.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jpsConfig xmlns="http://xmlns.oracle.com/oracleas/schema/11/jps-config-11_1.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/oracleas/schema/11/jps-config-11_1
1.xsd">
<property value="off" name="oracle.security.jps.jaas.mode"/>
<propertySets>
<propertySet name="saml.trusted.issuers.1">
<property value="www.oracle.com" name="name"/>
</propertySet>

[...]

<propertySet name="props.auth.uri.0">
<property value="/oamsso/logout.html" name="logout.url"/>
<property value="https://login01.mycompany.com:7777/oam/server/impersonate/end
name="imp.end.url"/>
<property value="https://login01.mycompany.com:7777/oam/server/impersonate/start
name="imp.begin.url"/>
<property value="/${app.context}/adfAuthentication" name="login.url
.BASIC"/>
<property value="/${app.context}/adfAuthentication" name="login.
url.ANONYMOUS"/>
<property value="/${app.context}/adfAuthentication" name="login.
url.FORM"/>
</propertySet>
<propertySet name="props.auth.level.0">
<property value="0" name="type-level:ANONYMOUS"/>
<property value="1" name="type-level:BASIC"/>
<property value="2" name="type-level:FORM"/>
</propertySet>
</propertySets>

[...]

6.1.4 API抽象化を使用しない偽装のトリガー方法

API抽象化を使用せずにAccess Manager偽装トリガーを直接呼び出すには、Access Managerで設定されているトリガー・エンド・ポイントへのリダイレクションに、問合せパラメータuserid、success_urlおよびfailure_urlの指定を含める必要があります。useridフィールドは被偽装者のユーザーIDを保持します。success_url/failure_urlは、偽装セッションの作成が成功または失敗した後にインパーソネータのブラウザがそれぞれポイントする先です。例6-4に示すように、指定するURLには、プロトコルおよびホスト:ポートの情報を含める必要があります。

例6-4 API抽象化を使用しない偽装のトリガー方法

https://login.mycompany.com/oam/server/impersonate/start?userid=impersonatee userid&success_url=SuccessRedirect URL&failure_url=FailureRedirect URL

例6-5に示すように、偽装セッションを終了して元のインパーソネータのAccess Managerセッションに戻るには、ユーザー・インタフェースで、Access Managerで設定されているエンド・ポイントにブラウザを強制的にリダイレクトさせるとともに、インパーソネータが復帰するターゲットURLを指定する必要があります。failure_urlの使用は任意です。

例6-5 元のインパーソネータ・セッションへの復帰

https://login.mycompany.com/oam/server/impersonate/end?end_url=TargetRedirect URL&failure_url=FailureRedirect URL

6.1.5 偽装セッション中のインパーソネータ・アイデンティティの伝達

表6-2に、インパーソネータのアイデンティティを下位アプリケーションに通知するためのヘッダー名を示します。WebGateでは、リクエストに挿入された追加のHTTPヘッダー使用します。下位アプリケーションでは、インバウンド・リクエストのHTTPヘッダーを検査することで、Access Manager偽装セッションが実行中であるかどうかを検出できます。

表6-2 アイデンティティ情報のためのヘッダー

ヘッダー名

説明

OAM_IMPERSONATOR_USER

インパーソネータのユーザーIDを保持するヘッダー名。

OAM_REMOTE_USER

エンド・ユーザーIDを保持するヘッダー。標準のAccess Managerユーザー・セッションと同じものです。

6.2 偽装サポートの構成

偽装機能はデフォルトでは有効になっていません。偽装機能を有効にするには、oam-config.xmlを構成するか、idmConfigToolコマンドを使用します。

この項には次のトピックが含まれます。

- oam-config.xmlによる偽装の構成

- idmConfigToolによる偽装の構成

- 認証スキームの構成

6.2.1 oam-config.xmlによる偽装の構成

OAMサーバーの偽装機能を有効にするには、例6-6に示すようにoam-config.xmlファイルを構成します。

この例では、ファイルの該当部分と設定可能なパラメータを示します。偽装を有効化にするには、EnableImpersonationをtrueに設定する必要があります。デフォルト設定はfalseです。

例6-6 oam-config.xmlでの偽装機能の有効化

<Setting Name="ImpersonationConfig" Type="htf:map">
<Setting Name="EnableImpersonation" Type="xsd:boolean">true</Setting>
<Setting Name="UserAttributeName"
Type="xsd:string">orclImpersonationGrantee</Setting>
<Setting Name="ErrorPage" Type="xsd:string">/pages/servererror.jsp</Setting>
</Setting>

6.2.2 idmConfigToolによる偽装の構成

idmConfigToolコマンドの詳細は、Oracle Fusion Middleware Oracle Identity Management Suite統合ガイドのidmConfigToolコマンドの使用方法に関する項を参照してください。

idmConfigToolを使用して偽装機能を構成する手順は次のとおりです。

1. idmConfigToolを-prepareStoreIDコマンドとともに使用して、Access Managerで必要なユーザーをアイデンティティ・ストアにシードします。コマンドの構文は./idmConfigTool.sh -prepareIDStore mode=OAM input_file=input_parametersです。

2. idmConfigToolでconfigOAMコマンドとパラメータOAM11G_IMPERSONATION_FLAG:trueを指定して偽装機能を構成します。コマンドの構文は./idmConfigTool.sh -configOAM input_file=input_parametersです。

3. 偽装セッションの期間を示すセッション・タイムスタンプを指定して、偽装権限付与を定義します。各値の書式は<Impersonator orclGUID> | <begin LDAP timestamp> | <end LDAP timestamp>です。空白は使用できません。
たとえば、OIDで次のようなタイムスタンプ値をorclImpersonationGranteeエントリに追加します。

83295E092B2F9FD4E040E50AEBB91998|20100604224517Z|20110604224517Z;90FE8C8083CEBC1FE040E50AEBB9176A|20100704224517Z|20110604224517Z

説明:

- 最初のブロックはインパーソネータのGUIDです。ここでは、83295E092B2F9FD4E040E50AEBB91998がインパーソネータのGUIDです。

- 2番目のブロックは開始日のタイムスタンプです。

- 3番目のブロックは終了日のタイムスタンプです。

4. データをLDAPサーバーに送信します。

6.2.3 認証スキームの構成

偽装をサポートするには、保護されたアプリケーションの認証スキームをLDAPSchemeに設定する必要があります。これは偽装セッションの開始前に行う必要があります。LDAPSchemeの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の認証スキームの管理に関する項を参照してください。

認証スキームをLDAPSchemeに設定する手順は次のとおりです。

1. Oracle Access Management管理コンソールで、「ポリシー構成」タブ→アプリケーション・ドメイン→「認証ポリシー」→保護リソース・ポリシーに移動します。

2. 「認証スキーム」リストから「LDAPScheme」を選択します。

6.3 SSOログインおよび偽装のテスト

偽装の設定をテストする手順は、使用している環境およびカスタム・ユーザー・インタフェースによって異なります。手順の例として、次に一般的なアドバイスを示します。必要に応じて、使用している環境に合せて調整してください。

SSOログインおよび偽装をテストする手順は次のとおりです。

1. 自分のユーザーIDと資格証明を使用してOracle Access Managementにログインします。

2. 自分が認可されているリソースにアクセスして、Access Managerが適切に自分の資格証明で動作していることを確認します。

3. 偽装セッションを開始します。

4. 表示される偽装の確認フォームで自分(インパーソネータ)のパスワードを入力し、「送信」をクリックして偽装に同意します。

5. 同じブラウザで、偽装されたユーザーが認可されているリソースにアクセスします。

6. Access Managerの「セッション管理」ページの「偽装」列に「True」が表示されることを確認します。
詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の「セッション管理」ページについての項を参照してください。

7. ヘッダー変数を出力するスクリプトまたはPerlプログラムを使用して、偽装セッションで設定されているHTTPヘッダー変数(OAM_REMOTE_USERとOAM_IMPERSONATOR_USER)を確認します。
詳細は、第6.1.5項「偽装セッション中のインパーソネータ・アイデンティティの伝達」を参照してください。

8. 偽装セッションを終了します。

9. ヘッダー変数を出力するスクリプトまたはPerlプログラムを使用して、OAM_REMOTE_USERが偽装トリガー前のユーザーに設定されていること、OAM_IMPERSONATOR_USER HTTPヘッダー変数が空であることを確認します。

第III部

Mobile and Socialによる開発

この部では、Oracle Access Management Mobile and SocialのSDKおよびAPIを使用したアプリケーションの開発について説明します。

第III部は、次の章で構成されています。

- 第7章「Mobile and SocialクライアントSDKを使用したアプリケーションの開発」

- 第8章「JavaクライアントSDKを使用したモバイル・サービス・アプリケーションの開発」

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

- 第10章「インターネット・アイデンティティ・サービス・クライアントSDKを使用したアプリケーションの開発」

- 第11章「Mobile and Socialサーバーの機能の拡張」

- 第12章「cURLによるMobile and SocialのRESTコールの送信」

7 Mobile and SocialクライアントSDKを使用したアプリケーションの開発

この章では、Mobile and SocialクライアントSDKについて簡単に説明します。この章の内容は次のとおりです。

- 第7.1項「作業前の準備」

- 第7.2項「モバイル・サービス・アプリケーションの開発の概要」

- 第7.3項「インターネット・アイデンティティ・サービス・アプリケーションの開発の概要」

7.1 作業前の準備

Oracle Access Management Mobile and Socialサービスを使用するアプリケーションで作業を開始する前に、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の「Mobile and Socialの理解」の章を参照してください。この開発者ガイドは、Mobile and Socialの用語と概念について理解していることを前提としています。

このガイドで、Mobile and Socialのクライアント・プログラム(またはクライアント・アプリケーション)とは、リモート・サーバー上で、認証、認可およびユーザー・プロファイル・サービスを利用するためにアプリケーションに構築するコードの一部です。アプリケーションには、HTTPを使用する任意のアプリケーションを指定できます。モバイル・アプリケーションである必要はありません。

7.2 モバイル・サービス・アプリケーションの開発の概要

アプリケーションにアイデンティティ・セキュリティ機能を構築し、認証、認可およびディレクトリアクセス・サービス用の既存のアイデンティティ・インフラストラクチャを使用できるようにするために、2つのクライアントSDK (iOSおよびJava)が提供されます。アプリケーションをモバイル・サービスと連携させる最も簡単な方法は、提供されたクライアントSDKのいずれかを使用することです。

注意:

iOSまたはJava SDKを使用できないプラットフォームまたはデバイスでアプリケーションを開発する場合は、Mobile and SocialサーバーにMobile and Social RESTコールを直接送信するコードを記述できます。

Mobile and Social REST APIについて説明している第12章「cURLによるMobile and SocialのRESTコールの送信」を参照してください。

モバイル・サービスSDK使用する場合、モバイル・サービス・クライアントがMobile and Socialサーバーと通信するために使用するRESTコールの構文を知る必要はありません。

次の表は、各モバイル・サービス・クライアントSDKで使用可能な機能を示しています。

表7-1 JavaおよびiOSモバイル・サービス・クライアントSDKの特徴と機能

機能

iOS

Java

メモ

Mobile and Socialサーバーを介してクライアント登録ハンドル、ユーザーおよびアクセス・トークンを取得できるモバイル・アプリケーションの構築

✔

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

Mobile and Socialサーバーを介してクライアント、ユーザーおよびアクセス・トークンを取得できるデスクトップ・アプリケーションの構築

✔

第8章「JavaクライアントSDKを使用したモバイル・サービス・アプリケーションの開発」を参照。

ディレクトリ・サーバーとの連携およびユーザー・プロファイル・サービスの実装

✔

✔

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

第8章「JavaクライアントSDKを使用したモバイル・サービス・アプリケーションの開発」を参照。

モバイル・シングル・サインオン(SSO)アプリケーションの作成

✔

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

7.2.1 ユーザー・プロファイル・サービスを使用したアプリケーションの構築

この項では、ユーザー・プロファイル・サービスによるアプリケーションの構築に関する詳細について説明します。この情報はいずれかのSDKに固有のものではありません。

大文字と小文字の区別

一般的に、LDAP属性名には大文字と小文字の区別がありません。ただし、Oracle Identity Governance Framework (IGF) APIと通信する場合、LDAP属性名は大文字と小文字を区別します。

特殊文字

特殊文字は検索フィルタで等価な16進値に置き換える必要があります。

注意:

WebLogic Server埋込みLDAPサーバーでは、特殊文字をユーザー名に含めることはできません。ユーザー名は大文字と小文字が区別され、一意である必要があります。カンマ、タブまたは< >、#、|、&、?、( )、{ }の文字は使用しないでください。

7.3 インターネット・アイデンティティ・サービス・アプリケーションの開発の概要

Javaと互換性のあるWebアプリケーションを保守する開発者は、Mobile and Socialインターネット・アイデンティティ・サービスSDKを使用してインターネット・アイデンティティ・サービス機能をWebオファリングに追加できます。このSDKはJavaによるWebアプリケーションのみで使用可能です。

SDKを使用してインターネット・アイデンティティ・サービスをJavaによるWebアプリケーションと統合する方法の詳細は、第10章「インターネット・アイデンティティ・サービス・クライアントSDKを使用したアプリケーションの開発」を参照してください。

開発者ガイドには、Javaインタフェースを実装することによってOpenIDおよびOAuthサービス・プロバイダを追加する方法に関する情報も含まれています。詳細は、第11.2項「インターネット・アイデンティティ・サービス用の新しいアイデンティティ・サービス・プロバイダの作成」を参照してください。

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

この章では、JavaクライアントSDKを使用してデスクトップ・アプリケーションを構築する方法について説明します。JavaクライアントSDKでは、モバイル・デバイス上でのアプリケーションの構築はサポートしていません。この章の内容は次のとおりです。

- 第8.1項「概要」

- 第8.2項「JavaクライアントSDKを使用した認証サービスの起動」

- 第8.3項「JavaクライアントSDKを使用したユーザー・プロファイル・サービスの起動」

- 第8.4項「JavaクライアントSDKを使用した認可サービスの起動」

8.1 概要

モバイル・サービス用Mobile and Social JavaクライアントSDKは、Oracle Access Management配布パッケージに含まれており、Oracle Technical Network (OTN) Webサイトからダウンロードすることもできます。

この開発者ガイドの他に、Javadocツールによって生成されるAPIドキュメントが使用可能です。APIクラス、インタフェース、コンストラクタ、メソッドおよびフィールドの説明は、使用可能なAPIドキュメントを参照してください。このドキュメントは、SDKでHTMLとして提供され、Oracle Fusion Middleware Mobile and Social Java APIリファレンス.としてPDFおよびHTML形式でOracle Access Management製品ライブラリからダウンロードすることもできます。

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

この項では、クライアント・トークン、ユーザー・トークンおよびアクセス・トークンをリクエストする方法について説明するサンプル・コードを提供します。

トークンには、アイテムに関連する属性、およびトークン・ベアラの権限、有効性またはアイデンティティを確立する暗号化された情報が含まれています。クライアント・トークンには資格証明情報が含まれ、ユーザー・トークンはクライアント・トークンをカプセル化し、アクセス・トークンには保護されたリソースのアクセスに必要なセキュリティ情報が含まれています。

この項のサンプル・コードは、JWTAuthentication (JSON Web Token Authentication)サービス・タイプをサポートしています。サービス・プロバイダの構成方法の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイル・サービスの構成に関する項を参照してください。

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

- 開始

- クライアント・トークンの作成

- ユーザー・トークンの作成

- アクセス・トークンの作成

- クライアント・トークンの検証

- ユーザー・トークンの検証

- ユーザー・トークンを使用したユーザー参照の実行

- クライアント・トークンの削除

8.2.1 開始

oic_clientsdk.jarファイルからの次のJavaクライアントSDKクラスをインポートします。

import oracle.security.idaas.rest.jaxrs.client.sdk.ClientSDKConfig;
import oracle.security.idaas.rest.jaxrs.client.sdk.Headers;
import oracle.security.idaas.rest.jaxrs.client.sdk.HeadersDefaultImpl;
import oracle.security.idaas.rest.jaxrs.client.sdk.OICClientException;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.AuthenticationClient;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.AuthenticationResult;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenCreateRequest;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenCreateRequestImpl;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenDeleteRequest;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenDeleteRequestImpl;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenExchangeRequest;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenExchangeRequestImpl;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenReadRequest;
import oracle.security.idaas.rest.jaxrs.client.sdk.authentication.TokenReadRequestImpl;

ClientSDKConfigオブジェクトを初期化し、サービス・プロバイダjwtauthentication.を使用して様々なアクションのエンドポイントを定義します。次に、AuthenticationClientオブジェクトを初期化します。

AuthenticationClientSDKConfig cc = new AuthenticationClientSDKConfig();
cc.setRegisterationServiceURI("http://hostcomputer.example.com:18001/
oic_rest/rest/jwtauthentication/register");

cc.setAuthenticationServiceURI("http://hostcomputer.example.com:18001/
oic_rest/rest/jwtauthentication/authenticate");

cc.setAccessTokenServiceURI("http://hostcomputer.example.com:18001/
oic_rest/rest/jwtauthentication/access");

cc.setTokenInfoServiceURI("http://hostcomputer.example.com:18001/
oic_rest/rest/jwtauthentication/tokens/info");

AuthenticationClient tc = new AuthenticationClient(cc);

8.2.2 クライアント・トークンの作成

クライアント・トークン・リクエストの必須パラメータを定義し、トークンを作成するようリクエストします。savedClientTokenという変数にトークン・リクエストの結果を保存します。

String subjectType = "USERCREDENTIAL";
String uname = "profileid1";
String password = "secret12";
String tokenTypeToCreate = "CLIENTTOKEN";
TokenCreateRequest tcrd = new TokenCreateRequestImpl(subjectType, uname, password, tokenTypeToCreate);
Headers headers = new HeadersDefaultImpl();
AuthenticationResult savedClientToken = tc.createToken(tcrd, headers);

8.2.3 ユーザー・トークンの作成

ユーザー・トークン・リクエストの必須パラメータを定義し、トークンを作成するようリクエストします。前の手順からのクライアント・トークンをREST認可ヘッダーに追加し、savedUserTokenという変数にユーザー・トークン・リクエストの結果を保存します。

String subjectType = "USERCREDENTIAL";
String uname = "sean";
String password = "secret12";
String tokenTypeToCreate = "USERTOKEN";
TokenCreateRequest tcrd = new TokenCreateRequestImpl(subjectType, uname, password, tokenTypeToCreate);
Headers headers = new HeadersDefaultImpl();

//Value expects certain format including type...
String tokenHeaderValue = "TOKEN" + " " + savedClientToken.getValue();
headers.setIdaasRestAuthZHeader(tokenHeaderValue);
AuthenticationResult savedUserToken = tc.createToken(tcrd, headers);

8.2.4 アクセス・トークンの作成

アクセス・トークン・リクエストの必須パラメータを定義し、トークンを作成するようリクエストします。savedAccessTokenという変数にトークン・リクエストの結果を保存します。

String resource = "http:myserver.com:8080/index.html";
String context = "QaZdhh77randomstuff";
String tokenSubjectValue = savedClientToken.getValue();
String credentialSubjectType = "TOKEN";
String newTokenTypeToCreate = "ACCESSTOKEN";
TokenExchangeRequest tcberd = new TokenExchangeRequestImpl(credentialSubjectType, tokenSubjectValue, resource, context, newTokenTypeToCreate);
AuthenticationResult savedAccessToken = tc.createToken(tcberd, headers);

8.2.5 クライアント・トークンの検証

String tokenValueToVerify = savedClientToken.getValue();
String tokenSubjectTypeToVerify = "TOKEN";

headers = new HeadersDefaultImpl();
headers.setIdaasRestAuthZHeader("TOKEN " + tokenValueToVerify);

TokenReadRequest tokenToRead = new TokenReadRequestImpl();
tokenToRead.setSubjectValue(tokenValueToVerify);
tokenToRead.setSubjectType(tokenSubjectTypeToVerify);

AuthenticationResult retrievedToken = tc.readToken(tokenToRead, headers);
System.out.println("Token returned from readToken() =" + retrievedToken.getValue());
if (null != savedClientToken && null != retrievedToken) {
System.out.println("Does value in savedClientToken == retrievedToken?" +
savedClientToken.getValue().equals(retrievedToken.getValue()));
}

8.2.6 ユーザー・トークンの検証

Headers headers = new HeadersDefaultImpl();
headers.setIdaasRestAuthZHeader("TOKEN " + savedClientToken.getValue());

TokenReadRequest tokenToRead = new TokenReadRequestImpl();
tokenToRead.setSubjectValue(savedUserToken.getValue());
tokenToRead.setSubjectType("TOKEN");
AuthenticationResult retrievedToken = tc.readToken(tokenToRead, headers);
System.out.println("Token returned from readToken() =" + retrievedToken.getValue());
if (null != savedUserToken && null != retrievedToken) {
System.out.println("Does value in savedUserToken == retrievedToken?" +
savedUserToken.getValue().equals(retrievedToken.getValue()));
}

8.2.7 ユーザー・トークンを使用したユーザー参照の実行

この手順で、ユーザーは、認証プロバイダによって保護されている、保護されたリソースです。

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

final String SEARCH_PAGE_POSITION_QUERY_PARAM_NAME = "pagePos";
final String SEARCH_PAGE_SIZE_QUERY_PARAM_NAME = "pageSize";
String pageSizeValue = "1";  //Just get one user for this test.
String pageSizePosition = "0";

//Now do a search and fetch first page o results.
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put(SEARCH_PAGE_SIZE_QUERY_PARAM_NAME, pageSizeValue);
queryParameters.put(SEARCH_PAGE_POSITION_QUERY_PARAM_NAME, pageSizePosition);

// Set Header to include the User Token for authetication.
Headers headers = new HeadersDefaultImpl();
headers.setAuthZHeader(savedUserToken);

//Perform search operation.
JSONCollection searchResults = pc.searchUsers(queryParameters, headers);

8.2.8 クライアント・トークンの削除

String deleteSubjectValue = savedClientToken.getValue(); //use first token value
String deleteTokenType = "TOKEN";
TokenDeleteRequest tokenToDelete = new TokenDeleteRequestImpl();
tokenToDelete.setSubjectValue(deleteSubjectValue);
tokenToDelete.setTokenType(deleteTokenType);
boolean result = false;
result = tc.deleteToken(tokenToDelete, headers);

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

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

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

- ユーザーの使用

- グループの使用

- 組織の使用

- ページング・サポートを使用した検索

8.3.1 ユーザーの使用

次のコード・サンプルでは、ユーザー・プロファイル・サービスがアクセスおよび更新可能なディレクトリ・ストアにあるユーザー・レコードと連携させる方法について説明します。この項では基本的な次のシナリオについて説明します。

- 設定

- ユーザーの作成

- ユーザーの読取り

- ユーザーの更新

- ユーザーの削除

- ユーザーの検索

- ユーザー属性の取得と結果の検証

8.3.1.1 設定

まず、oic_clientsdk.jarファイルから次のJavaクラスをインポートし、次にpeopleサービスURIグローバル変数を宣言します。

import oracle.security.idaas.rest.jaxrs.client.sdk.ClientSDKConfig;
import oracle.security.idaas.rest.jaxrs.client.sdk.Headers;
import oracle.security.idaas.rest.jaxrs.client.sdk.HeadersDefaultImpl;
import oracle.security.idaas.rest.jaxrs.client.sdk.OICClientException;
import oracle.security.idaas.rest.jaxrs.client.sdk.userprofile.JSONCollection;
import oracle.security.idaas.rest.jaxrs.client.sdk.userprofile.PeopleClient;

private static String serviceURI = "http://hostcomputer.example.com:18001/oic_rest/rest/userprofile/people";

8.3.1.2 ユーザーの作成

次のサンプルはuid peopletestuser123を使用してユーザー・レコードを作成します。

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

//Just generate some fake user info.
String uid = "peopletestuser123";
String userpassword = "secret123";
String sn = uid;
String cn = uid;
String mail = uid + "@example.com";

//Now put these values into the resourceAttrs map, and pass to helper.
Map<String, Object> resourceAttrs = new HashMap<String, Object>();
resourceAttrs.put("uid", uid);
resourceAttrs.put("password", userpassword);
resourceAttrs.put("lastname", sn);
resourceAttrs.put("commonname", cn);
resourceAttrs.put("mail", mail);
List<String> phoneNums = new ArrayList<String>();
phoneNums.add("408-123-5555");
phoneNums.add("408-123-9999");
resourceAttrs.put("telephone", phoneNums);
String personJson = pc.createUser(resourceAttrs, new HeadersDefaultImpl());

8.3.1.2 ユーザーの読取り

次のサンプルはuid peopletestuser123を使用してユーザー・レコードを取得します。

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

String uidForExistingUser = "peopletestuser123";

//now GET that user just to check
Map<String, String> queryParameters = new HashMap<String, String>();//none yet
String existingUser = pc.readUser(uidForExistingUser, queryParameters, new HeadersDefaultImpl());
boolean found = false;
JSONObject jo = new JSONObject(existingUser);
String s = jo.getString("uid");
found = s.equalsIgnoreCase(uid);

8.3.1.4 ユーザーの更新

次のサンプルはuid peopletestuser123を使用してユーザー・レコードを更新します。

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

//Just generate some fake user info.
final String CN_VALUE = "UPDATED CN";

String uidForExistingUser = "peopletestuser123"; //From class-defined uid.

//now make some attributes with new values to update
Map<String, Object> attrsToUpdate = new HashMap<String, Object>();
attrsToUpdate.put("commonname", CN_VALUE);
String result = pc.updateUser(uidForExistingUser, attrsToUpdate,new HeadersDefaultImpl());

8.3.1.5 ユーザーの削除

次のサンプルはuid peopletestuser123を使用してユーザー・レコードを削除します。

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

boolean deleteResult = pc.deleteUser("peopletestuser123", new HeadersDefaultImpl());

8.3.1.6 ユーザーの検索

次のサンプルはuid peopletestuser123を使用してユーザー・レコードを検索します。

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

//now do a search on uid attribute
Map<String, String> queryParameters = new HashMap<String, String>();
String queryValue = "peopletestuser"+ "*";
queryParameters.put("searchparam.uid", queryValue);

//Set query parameters and empty headers.
JSONCollection searchResult = pc.searchUsers(queryParameters, new HeadersDefaultImpl());

//Get raw JSON array value in "elements" attribute.
String elementJSONString = searchResult.getJsonArrayElements();
JSONArray ja = null;
ja = new JSONArray(elementJSONString);

//Now try to match the result to the expected User with uid.
JSONObject elem = null;
boolean found = false;
for(int i=0; i<ja.length() && found==false; i++) {
elem = ja.getJSONObject(i);  //Get item from array
String u = elem.getString("uid");

//Check if attr is present AND matches some value.
if(u.equalsIgnoreCase("peopletestuser123")) {
found = true;
}
}

8.3.1.7 ユーザー属性の取得と結果の検証

次のサンプルはユーザー属性commonnameを取得し、属性descriptionが存在しないことを確認します。

final String ATTRIBUTES_TO_FETCH_QUERY_PARAM_NAME = "attrsToFetch";
String attributeToFetchName = "commonname";  //fetch this attribute
String attributeShouldNotBePresent = "description";
ClientSDKConfig cc = new ClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

//Now GET that User just to check.
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put(ATTRIBUTES_TO_FETCH_QUERY_PARAM_NAME, attributeToFetchName);
String existingUser = pc.readUser("peopletestuser123", queryParameters, new HeadersDefaultImpl());
boolean found = false;
try {
JSONObject jo = new JSONObject(existingUser);
//Throws exception if attribute not present
String s = jo.getString(attributeToFetchName);
found = true;
} catch (JSONException je) {
found = false;
}

//Now verify that a certain attribute is NOT present.
found = false;
try {
JSONObject jo = new JSONObject(existingUser);

//throws exception if attribute not present
for(Iterator it = jo.keys(); it.hasNext() && found==false; ) {
String key = (String) it.next();
if(key.equalsIgnoreCase(attributeShouldNotBePresent)) {
found = true; //Bad if present because it should not be.
}
}
} catch (JSONException je) {}

8.3.2 グループの使用

グループはユーザーのセットです。

この項では、次の基本的なシナリオについてのコード・サンプルを示します。

- 設定

- グループの作成

- グループの読取り

- グループの更新

- グループの削除

- グループの検索

- ページング・サポートを使用したグループの検索

- グループへのユーザーの追加

- グループ・メンバーシップ情報の取得

- グループ内のメンバーの検索

- グループからのメンバーの削除

- グループ所有権の割当て

- グループ所有権情報の取得

- グループ所有者の検索

- グループ所有者の削除

- addMemberOfを使用したグループへのグループ(またはユーザー)の追加

- getMemberOfを使用したグループ・メンバーシップの取得

- searchMemberOfを使用したグループの検索

- deleteMemberOfを使用したグループからのグループ(またはユーザー)の削除

- addOwnerOfを使用したグループ所有権の割当て

- getOwnerOfを使用したグループ所有権情報の取得

- searchOwnerOfを使用したグループ所有者の検索

8.3.2.1 設定

まず、次のJavaクラスをインポートし、次にgroupsサービスURIグローバル変数を宣言します。

import oracle.security.idaas.rest.jaxrs.client.sdk.ClientSDKConfig;
import oracle.security.idaas.rest.jaxrs.client.sdk.HeadersDefaultImpl;
import oracle.security.idaas.rest.jaxrs.client.sdk.OICClientException;
import oracle.security.idaas.rest.jaxrs.client.sdk.userprofile.GroupsClient;
import oracle.security.idaas.rest.jaxrs.client.sdk.userprofile.JSONCollection;

private static GroupsClient gc = null;
private static PeopleClient pc = null;

private static String roleServiceURI = 'http://hostcomputer.example.com:18001/oic_rest/
rest/userprofile/groups";

private static String peopleServiceURI = "http://hostcomputer.example.com:18001/oic_rest/
rest/userprofile/people";
Map<String, String> accessURIMap = Util.createAccessURIMap("manager", "reports", "memberOf",
"members", "groupMemberOf", "groupMembers", "ownerOf", "personOwner", "groupOwner",
"groupOwnerOf");

Map<String, String> entityURIMap = Util.createEntityURIMap("report-uri", "manager-uri",
"person-uri", "group-uri", "member-uri", "group-uri", "owner-uri", "group-uri", "group-uri",
"owner-uri");

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(roleServiceURI);
cc.setAccessURIMap(accessURIMap);
cc.setEntityURIMap(entityURIMap);
gc = new GroupsClient(cc);

UserProfileClientSDKConfig cc2 = new UserProfileClientSDKConfig(peopleServiceURI);
cc2.setAccessURIMap(accessURIMap);
cc2.setEntityURIMap(entityURIMap);
pc = new PeopleClient(cc2);

8.3.2.2 グループの作成

Map<String, Object> resourceAttrs = new HashMap<String, Object>();
resourceAttrs.put("commonname", "testGroup");
resourceAttrs.put("description", "testGroupDescription");
String creategroup = gc.createGroup(resourceAttrs, new HeadersDefaultImpl());

8.3.2.3 グループの読取り

String readgroup = gc.readGroup("testGroup", new HashMap<String, String>(), new HeadersDefaultImpl());

8.3.2.4 グループの更新

Map<String, Object> resourceAttrs2 = new HashMap<String, Object>();
resourceAttrs2.put("description", "new description");
String udpatedgroup = gc.updateGroup("testGroup", resourceAttrs2, new HeadersDefaultImpl());

8.3.2.5 グループの削除

boolean deletedgroup = gc.deleteGroup("testGroup", new HeadersDefaultImpl());

8.3.2.6 グループの検索

//search with searchOperator = OR, commonname and description
Map<String, String> queryParams = new HashMap<String,String>();
String commonname = "testGroup" + 1;
String description = "testGroup" + "Description";
queryParams.put("searchparam.commonname", commonname);
queryParams.put("searchparam.description", description);
queryParams.put("searchFilter","SimpleOR");

JSONCollection searchResult = gc.searchGroups(queryParams, new HeadersDefaultImpl());

//get raw JSON array value in "elements" attribute
String elementJSONString = searchResult.getJsonArrayElements();
JSONArray ja = new JSONArray(elementJSONString);

8.3.2.7 ページング・サポートを使用したグループの検索

次のサンプルではグループを検索し、一度に1ページ、結果を返します。

final String SEARCH_PAGE_POSITION_QUERY_PARAM_NAME = "pagePos";
final String SEARCH_PAGE_SIZE_QUERY_PARAM_NAME = "pageSize";
String pageSizeValue = "1"; //just get one group for this test
String pageSizePosition = "0";

//now do a search and fetch first page o results
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put(SEARCH_PAGE_SIZE_QUERY_PARAM_NAME, pageSizeValue);
queryParams.put(SEARCH_PAGE_POSITION_QUERY_PARAM_NAME, pageSizePosition);
JSONCollection searchResults = gc.searchGroups(queryParams, new HeadersDefaultImpl());

//get raw JSON array value in "elements" attribute
String elementJSONString = searchResults.getJsonArrayElements();
JSONArray ja = null;
ja = new JSONArray(elementJSONString);
boolean justOneFound = false;

//the search returns a set with just one user
if (ja.length() == Integer.parseInt(pageSizeValue)) {
justOneFound = true;
}

8.3.2.8 グループへのユーザーの追加

次の例では、addPersonMemberメソッドを使用しています。「addMemberOfを使用したグループへのグループ(またはユーザー)の追加」も参照してください。

String resultRoleMembership = gc.addPersonMember("testGroup", "testuser123", new HeadersDefaultImpl());

8.3.2.9 グループ・メンバーシップ情報の取得

次の例では、getPersonMemberメソッドを使用しています。「getMemberOfを使用したグループ・メンバーシップの取得」も参照してください。

Map<String, String> queryParameters = new HashMap<String, String>(); //none yet
String membershipId ="testuser123";
String result = gc.getPersonMember("testGroup",membershipId,queryParameters, new HeadersDefaultImpl());

8.3.2.10 グループ内のメンバーの検索

次の例では、searchGroupMembersメソッドを使用しています。「searchMemberOfを使用したグループの検索」も参照してください。

String queryFilter = "(uid=" +"*)";
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("nativequery", queryFilter);

//need to use membership uri such as ...doctors/members
JSONCollection searchResults = gc.searchPersonMembers("testGroup", queryParams, new HeadersDefaultImpl());

//get raw JSON array value in "elements" attribute
String elementJSONString = searchResults.getJsonArrayElements();
JSONArray ja = null;
ja = new JSONArray(elementJSONString);

//Sample of how to get the members' URIs. A client could call GET on each of these
// persons' URIs using the person client API to get details about each member.Set<String> userUriSet = new HashSet<String>();
final String PERSON_URI_FIELD_NAME = "person-uri";
for (int i=0; i<ja.length(); i++) {
JSONObject jo = ja.getJSONObject(i);

//Get the URI field of this user.   String uri = jo.getString(PERSON_URI_FIELD_NAME);
if (uri != null && !uri.isEmpty()) {
userUriSet.add(uri);
}
}

// Get Group members in the group.
searchResults = gc.searchGroupMembers("testGroup", queryParams, new HeadersDefaultImpl());

8.3.2.11 グループからのメンバーの削除

次の例では、deletePersonMemberメソッドを使用しています。「deleteMemberOfを使用したグループからのグループ(またはユーザー)の削除」も参照してください。

boolean result = gc.deletePersonMember("testGroup", "testuser123", new HeadersDefaultImpl());

8.3.2.12 グループ所有権の割当て

次の例は、ユーザーまたはグループへのグループ所有権の割当て方法を示しています。

// Add user testuser123 to group testGroup as group owner.
String resultRoleOwnership = gc.addPersonOwner("testGroup", "testuser123",
new HeadersDefaultImpl());

// Add group testSubGroup to group testGroup as group owner.
String resultRoleOwnership2 = gc.addGroupOwner("testGroup", "testSubGroup",
new HeadersDefaultImpl());

8.3.2.13 グループ所有権情報の取得

Map<String, String> queryParameters = new HashMap<String, String>();//none yet
String ownershipId="testuser123";
String result = gc.getPersonOwner("testGroup", ownershipId, queryParameters,
new HeadersDefaultImpl());
ownershipId ="testSubGroup";
result = gc.getGroupOwner("testGroup", ownershipId, queryParameters,
new HeadersDefaultImpl());

8.3.2.14 グループ所有者の検索

String queryFilter = "(uid=" +"*)";
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("nativequery", queryFilter);

// Get Person owners in the group.
JSONCollection searchResults = gc.searchPersonOwners("testGroup", queryParams,
new HeadersDefaultImpl());

// Get raw JSON array value in the "elements" attribute.
String elementJSONString = searchResults.getJsonArrayElements();
JSONArray ja = null;
ja = new JSONArray(elementJSONString);

// Sample of how to get the members' URIs.  A client could call GET on each of these
// person URIs using the person client API and get details on each member.
Set<String> userUriSet = new HashSet<String>();
final String OWNER_URI_FIELD_NAME = "owner-uri";
for(int i=0; i<ja.length(); i++) {
JSONObject jo = ja.getJSONObject(i);

//Get URI field of this user.
String uri = jo.getString(OWNER_URI_FIELD_NAME);
if (uri != null && !uri.isEmpty()) {
userUriSet.add(uri);
}
}

// Get Group owners in the group.
searchResults = gc.searchGroupOwners("testGroup", queryParams, new HeadersDefaultImpl());

8.3.2.15 グループ所有者の削除

boolean result = gc.deletePersonOwner("testGroup", "testuser123", new HeadersDefaultImpl());boolean result2= gc.deleteGroupOwner("testGroup", "testSubGroup", new HeadersDefaultImpl());

8.3.2.16 addMemberOfを使用したグループへのグループ(またはユーザー)の追加

次の例は、addMemberOfメソッドを使用して、グループを別のグループのメンバーにしたり、ユーザーをグループのメンバーにする方法を示しています。

// Add group "testSubGroup" to be a member of group "testGroup"
String resultRoleMembership2= gc.addMemberOf("testGroup", "testSubGroup",
new HeadersDefaultImpl());

// Add user "testuser123" to be a member of group "testGroup"
String resultRoleMembership = pc.addMemberOf("testuser123", "testGroup",
new HeadersDefaultImpl());

8.3.2.17 getMemberOfを使用したグループ・メンバーシップの取得

次の例は、getMemberOfメソッドを使用して、指定したグループの関係のデータを取得する方法を示しています。

// Get relationship data where user "testuser123" is a member of group "testGroup"
String resultRoleMembership = pc.getMemberOf("testuser123", "testGroup", new HeadersDefaultImpl());

// Get relationship data where group "testsubGroup" is a member of group "testGroup"
String resultRoleMembership2= gc.getMemberOf("testGroup", "testSubGroup",
new HeadersDefaultImpl());

8.3.2.18 searchMemberOfを使用したグループの検索

String queryFilter = "(uid=" +"*)";
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("nativequery", queryFilter);

// Search groups of which Person "testuser123" is a member
JSONCollection searchResults = pc.searchMemberOf("testuser123", queryParams,
new HeadersDefaultImpl());

//Get raw JSON array value in "elements" attribute
String elementJSONString = searchResults.getJsonArrayElements();
JSONArray ja = null;
ja = new JSONArray(elementJSONString);

// Sample of how to get the members' URIs. A client could call GET on each of these
// person URIs using the person client API to get details about each member.Set<String> groupUriSet = new HashSet<String>();
final String GROUP_URI_FIELD_NAME = "group-uri";
for(int i=0; i<ja.length(); i++) {
JSONObject jo = ja.getJSONObject(i);

//Get URI field of this user.  String uri = jo.getString(GROUP_URI_FIELD_NAME);
if (uri != null && !uri.isEmpty()) {
groupUriSet.add(uri);
}
}

// Search Groups of which group "testSbuGroup" is a member.
searchResults = gc.searchMemberOf("testSubGroup", queryParams, new HeadersDefaultImpl());

8.3.2.19 deleteMemberOfを使用したグループからのグループ(またはユーザー)の削除

// Delete member "testuser123" from group "testGroup"
boolean result = pc.deleteMemberOf("testuser123","testGroup", new HeadersDefaultImpl());

// Delete member "testSubGroup" from group "testGroup"
boolean result2= gc.deleteMemberOf("testGroup","testSubGroup", new HeadersDefaultImpl());

8.3.2.20 addOwnerOfを使用したグループ所有権の割当て

// Add user "testuser123" to be an owner of group "testGroup"
String resultRoleOwnership = pc.addOwnerOf("testuser123", "testGroup", new HeadersDefaultImpl());

// Add group "testSubGroup" to be an owner of group "testGroup"
String resultRoleOwnership2 = gc.addOwnerOf("testGroup", "testSubGroup", new HeadersDefaultImpl());

8.3.2.21 getOwnerOfを使用したグループ所有権情報の取得

// Get relationship data where user "testuser123" is an owner of group "testGroup"
String resultRoleOwnership = pc.getOwnerOf("testuser123", "testGroup", new HeadersDefaultImpl());

// Get relationship data where group "testsubGroup" is an owner of group "testGroup"
String resultRoleOwnership2= gc.getOwnerOf("testGroup", "testSubGroup", new HeadersDefaultImpl());

8.3.2.22 searchOwnerOfを使用したグループ所有者の検索

String queryFilter = "(uid=" +"*)";
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("nativequery", queryFilter);

// Search Groups of which Person "testuser123" is an owner.
JSONCollection searchResults = pc.searchOwnerOf("testuser123", queryParams,
new HeadersDefaultImpl());

// Get raw JSON array value in "elements" attribute.
String elementJSONString = searchResults.getJsonArrayElements();
JSONArray ja = null;
ja = new JSONArray(elementJSONString);

// Sample of how to get the members' URIs. A client could call GET on each of these person URIs using the person client API to get details about each member.
Set<String> groupUriSet = new HashSet<String>();
final String GROUP_URI_FIELD_NAME = "group-uri";
for(int i=0; i<ja.length(); i++) {
JSONObject jo = ja.getJSONObject(i);

// Get URI field of this user.
String uri = jo.getString(GROUP_URI_FIELD_NAME);
if (uri != null && !uri.isEmpty()) {
groupUriSet.add(uri);
}
}

// Search Groups of which group "testSbuGroup" is an owner.
searchResults = gc.searchOwnerOf("testSubGroup", queryParams, new HeadersDefaultImpl());

8.3.2.23 deleteOwnerOfを使用したグループからのグループ(またはユーザー)の削除

// Delete owner "testuser123" from group "testGroup"
boolean result = pc.deleteOwnerOf("testuser123","testGroup", new HeadersDefaultImpl());

// Delete owner "testSubGroup" from group "testGroup"
boolean result2= gc.deleteOwnerOf("testGroup","testSubGroup", new HeadersDefaultImpl());

8.3.3 組織の使用

組織は通常、マネージャや部下を含む、人の階層グループです。

この項では、次の基本的なシナリオについてのコード・サンプルを示します。

- 設定

- ヘルパー・ユーティリティの作成

- マネージャの検証

- 直属の部下の検証

- scope=allの機能を使用したすべての部下の取得

- Scope=toTop機能を使用したマネージャ連鎖の取得

- プリフェッチ機能を使用した部下の詳細の取得

- プリフェッチ機能を使用したマネージャ・データの取得

- マネージャからの部下の削除

8.3.3.1 設定

まず、次のJavaクラスをインポートし、次にgroupsサービスURIグローバル変数を宣言します。

import oracle.security.idaas.rest.jaxrs.client.sdk.ClientSDKConfig;
import oracle.security.idaas.rest.jaxrs.client.sdk.Headers;
import oracle.security.idaas.rest.jaxrs.client.sdk.HeadersDefaultImpl;
import oracle.security.idaas.rest.jaxrs.client.sdk.userprofile.PeopleClient;

private static String personServiceURI= "http://hostcomputer.example.com:18001/oic_rest/rest/userprofile/people";

private static String peopleBaseURI = "/oic_rest/rest/userprofile/people";

8.3.3.2 ヘルパー・ユーティリティの作成

この項の3つのヘルパー・ユーティリティは、組織データを使用する場合に役立ちます。

ユーザー・データを作成するためのヘルパー・ユーティリティ

public static String createPersonHelper(String personServiceURI, String username,String password,Map<String, String> optionalAttributes) {

ClientSDKConfig cc = new ClientSDKConfig(personServiceURI);
PeopleClient pc = new PeopleClient(cc);

//Generate some fake user info.
String uid = username;
String userpassword = password;
String sn = uid;
String cn = uid;
String mail = uid + "@example.com";

try {
//now put these values into the resourceAttrs map, and pass to helper
//these java string names need to match the json field names
Map<String, Object> resourceAttrs = new HashMap<String, Object>();
resourceAttrs.put("uid", uid);
resourceAttrs.put("password", userpassword);
resourceAttrs.put("lastname", sn);
resourceAttrs.put("commonname", cn);
resourceAttrs.put("mail", mail);
if (optionalAttributes != null && !optionalAttributes.isEmpty()) {
for(Map.Entry<String, String> me : optionalAttributes.entrySet()) {
resourceAttrs.put(me.getKey(), me.getValue());
}
}

String newUser = pc.createUser(resourceAttrs, new HeadersDefaultImpl());

}

マネージャと部下の関係を確立するためのヘルパー・ユーティリティ

private static boolean assignManagerToUser(String personServiceURI, String serviceBaseURI, String userUID, String theManagerId) {
ClientSDKConfig cc = new ClientSDKConfig(personServiceURI);
PeopleClient pc = new PeopleClient(cc);
final String MANAGER_URI_SEGMENT_NAME = "manager";
//now make payload
final String MANAGER_URI_JSON_ATTRIBUTE_NAME = "manager-uri";
final String REPORTS_URI_JSON_ATTRIBUTE_NAME = "report-uri";
Map<String, Object> resourceAttrs = new HashMap<String, Object>();
resourceAttrs = new HashMap<String, Object>();
//use base URI od people service within json values
String theManagerURIValue = serviceBaseURI + "/" + theManagerId;
resourceAttrs.put(MANAGER_URI_JSON_ATTRIBUTE_NAME, theManagerURIValue);
String theReporteeURIValue = serviceBaseURI + "/" + userUID; //user being added to list of reports
resourceAttrs.put(REPORTS_URI_JSON_ATTRIBUTE_NAME, theReporteeURIValue);

return pc.addUserToOrgChart(userUID, MANAGER_URI_SEGMENT_NAME, resourceAttrs, new HeadersDefaultImpl());
}

データ準備ユーティリティ

このユーティリティは、組織内の異なる階層レベルでユーザーを作成します。

String theUIDofManager = null;
Map<String, String> optionalAttributes = new HashMap<String, String>();
optionalAttributes.put("manager", theUIDofManager);
//keep a map of created people in orgchart
Map<String, String> createdPeople= new HashMap<String, String>();
String userPassword = "secret123";
String userId = "ceo"+ "orgcharttestuser"+ "123"; // user is CEO
String person = Util.createPersonHelper(peopleServiceURI, userId, userPassword, optionalAttributes );

theUIDofManager = userId; //set to previously created user
userId = "director" + "orgcharttestuer" + "123"; // user id DIRECTOR
optionalAttributes = new HashMap<String, String>();//reset for each new user
person = Util.createPersonHelper(peopleServiceURI, userId, userPassword, optionalAttributes);

//now assign this newly created user DIRECTOR's manager to be CEO
assignManagerToUser(peopleServiceURI, peopleBaseURI, userId, theUIDofManager);

theUIDofManager = userId; //set to previously created user
userId = "developer111" + "orgcharttestuser" + "123"; // user is DEVELOPER111
optionalAttributes = new HashMap<String, String>();//reset for each new user
person = Util.createPersonHelper(peopleServiceURI, userId, userPassword, optionalAttributes);

//now assign this newly created user DEVELOPER111's manager to be DIRECTOR
assignManagerToUser(peopleServiceURI, peopleBaseURI, userId, theUIDofManager);

userId = "developer222"+ "orgcharttestuser"+"123"; // user is DEVELOPER222
optionalAttributes = new HashMap<String, String>();//reset for each new user
person = Util.createPersonHelper(peopleServiceURI, userId, userPassword, optionalAttributes);
//now assign this newly created user DEVELOPER222's manager to be DIRECOTR
assignManagerToUser(peopleServiceURI, peopleBaseURI, userId, theUIDofManager);

8.3.3.3 マネージャの検証

//Set empty query parameters and empty headers.
Map<String, String> searchQueryParameters = new HashMap<String, String>();
Headers searchHeaders = new HeadersDefaultImpl();
JSONCollection resultSet = pc.searchManagers("developer222orgcharttestuser123", searchQueryParameters, searchHeaders);

//get raw JSON array value in "elements" attribute
String elementJSONString = resultSet.getJsonArrayElements();

boolean found = false;
final String MANAGER_URI_ATTRIBUTE_NAME = "manager-uri";
JSONArray ja = new JSONArray(elementJSONString);
for(int i=0; i< ja.length() && found==false; i++) {
JSONObject elem = ja.getJSONObject(i);//get item from array
try {
//The "manager-uri" attribute of this item in element array is
//expanded automatically so its value is a JSONObject.
JSONObject managerURIObject = elem.getJSONObject(MANAGER_URI_ATTRIBUTE_NAME);

//Check if attr is present AND matches some value.
if(managerURIObject.getString("uri").equalsIgnoreCase("directororgcharttestuser123")) {
found = true;
}
} catch (JSONException je) {
//An exception is thrown if attribute is not found or is not a JSON object
//found = false;
}

//print out each user, until found
}

8.3.3.4 直属の部下の検証

Map<String, String> searchQueryParameters = new HashMap<String, String>();
Headers searchHeaders = new HeadersDefaultImpl();
JSONCollection resultSet = pc.searchReportees("ceoorgcharttestuser123",
searchQueryParameters, searchHeaders);

//Get raw JSON array value in "elements" attribute.
String elementJSONString = resultSet.getJsonArrayElements();

boolean found = false;
final String REPORTS_URI_ATTRIBUTE_NAME = "report-uri";

JSONArray ja = new JSONArray(elementJSONString);
for(int i=0; i< ja.length() && found==false; i++) {
JSONObject elem = ja.getJSONObject(i); //Get item from array
try {
JSONObject reportURIObject = elem.getJSONObject(REPORTS_URI_ATTRIBUTE_NAME);

//Check if attr is present AND matches some value.
if(reportURIObject.getString("uri").equalsIgnoreCase("directororgcharttestuser123")) {
found = true;
}
} catch (JSONException je) {
//exception is thrown if attribute is not found or is not JSON object
//found = false;
}

//Print out each user, until found.
}

8.3.3.5 scope=all機能を使用したすべての部下の取得

次のコード・サンプルでは、直属ではない部下を含む、組織内の部下のすべてを検証します。

ClientSDKConfig cc = new ClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

//Now test CEO orgchart by getting reports with scope=all, which should include developer.
String orgChartIdURI = "reports";

//Now do a search and fetch first page o results.
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put(ClientConstants.ATTRIBUTES_TO_ORG_CHART_SCOPE_QUERY_PARAM_NAME, "all");
JSONCollection resultSet = pc.searchReportees("ceoorgcharttestuser123", queryParameters,
new HeadersDefaultImpl());

//Get raw JSON array value in "elements" attribute.
String elementJSONString = resultSet.getJsonArrayElements();
boolean found = false;
JSONArray ja = new JSONArray(elementJSONString);
for (int i=0; i<ja.length(); i++) {
JSONObject jo = ja.getJSONObject(i);
Object reportURIObj = jo.get("report-uri");
if (reportURIObj.toString().indexOf( "developer111orgcharttestuser123") != -1) {
found = true;
}
}

8.3.3.6 Scope=toTop機能を使用したマネージャ連鎖の取得

次のコード・サンプルでは、toTop属性を使用して、管理連鎖にマネージャを含む配列を取得します。

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

// Now do a search and fetch the first page of results.
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put(ClientConstants.ATTRIBUTES_TO_ORG_CHART_SCOPE_QUERY_PARAM_NAME, "toTop");
JSONCollection resultSet = pc.searchManagers("developer111orgcharttestuser123",
queryParameters, new HeadersDefaultImpl());

// Get raw JSON array value in "elements" attribute.
String elementJSONString = resultSet.getJsonArrayElements();

8.3.3.7 プリフェッチ機能を使用した部下の詳細の取得

次のコード・サンプルでは、部下IDおよびマネージャIDがわかっている場合にマネージャの詳細を取得します。

ClientSDKConfig cc = new ClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);
final String ATTRIBUTES_TO_PREFETCH_QUERY_PARAM_NAME = ClientConstants.ATTRIBUTES_TO_PRFFETCH_QUERY_PARAM_NAME;
String attributeToPrefetch = "report-uri";
final String MANAGER_URI_SEGMENT_NAME = "manager";

//Now read/get new user's details.
String reporteeId = "developer111orgcharttestuser123";
String managerId = "directororgcharttestuser123";

//Now GET that user just to check.
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put(ATTRIBUTES_TO_PREFETCH_QUERY_PARAM_NAME, attributeToPrefetch);

//Get raw JSON representation.
String existingManagerRel = pc.getManager(reporteeId, managerId, queryParameters, new HeadersDefaultImpl());

//Now obtain manager details and retrieve the reports data.
JSONObject jo = new JSONObject(existingManagerRel);
Object managerAttributeValue = jo.get(attributeToPrefetch);

8.3.3.8 プリフェッチ機能を使用したマネージャ・データの取得

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

final String ATTRIBUTES_TO_PREFETCH_QUERY_PARAM_NAME = ClientConstants.ATTRIBUTES_TO_PRFFETCH_QUERY_PARAM_NAME;
String attributeToPrefetchName = "manager(commonname)";
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put(ATTRIBUTES_TO_PREFETCH_QUERY_PARAM_NAME, attributeToPrefetchName);

// Get the raw JSON representation of the person.
String existingUser = pc.readUser("developer111orgcharttestuser123", queryParameters, new HeadersDefaultImpl());

// Get the manager attribute, which is expanded by prefetch to include one or more
// sub-attributes, so that manager is a JSON object within the person JSON.
// Now it is a JSONObject.
JSONObject jo = new JSONObject(existingUser);
Object managerAttributeValue = (Object) jo.get("manager");
System.out.println(CLASS_NAME + "." + METHOD + ": prefetch detail="
+ managerAttributeValue);

8.3.3.9 マネージャからの部下の削除

ClientSDKConfig cc = new ClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);
String uidForExistingUser = "developer111orgcharttestuser123";
String theManagerId = "directororgcharttestuser123";
final String REPORTS_URI_SEGMENT_NAME = "reports";
Map<String, String> queryParameters = new HashMap<String, String>(); //None yet.
String existingOrgChartInstanceDetails = pc.getReportee(theManagerId, uidForExistingUser, queryParameters, new HeadersDefaultImpl());

//Now that we verified it exists, delete this membership in the reports list.
boolean deleteResult = pc.deleteOrgChartInstance(theManagerId, REPORTS_URI_SEGMENT_NAME, uidForExistingUser, new HeadersDefaultImpl());

//Now try to get/read that user again. This time we should not find the user.
queryParameters = new HashMap<String, String>(); //None yet.
existingOrgChartInstanceDetails = null;
try {
existingOrgChartInstanceDetails = pc.readOrgChartInstance(theManagerId, REPORTS_URI_SEGMENT_NAME, uidForExistingUser, queryParameters, new HeadersDefaultImpl());
} catch (OICClientException ce) {
System.out.println("existingOrgChartInstanceDetails was successfully deleted so not found"
+ " on subsequent read.");
}

8.3.4 ページング・サポートを使用した検索

UserProfileClientSDKConfig cc = new UserProfileClientSDKConfig(serviceURI);
PeopleClient pc = new PeopleClient(cc);

final String SEARCH_PAGE_POSITION_QUERY_PARAM_NAME = "pagePos";
final String SEARCH_PAGE_SIZE_QUERY_PARAM_NAME = "pageSize";
String pageSizeValue = "1"; //Just get one user for this test.
String pageSizePosition = "0";

//Now do a search and fetch first page o results.
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put(SEARCH_PAGE_SIZE_QUERY_PARAM_NAME, pageSizeValue);
queryParameters.put(SEARCH_PAGE_POSITION_QUERY_PARAM_NAME, pageSizePosition);

//Set query params and empty headers.
JSONCollection searchResults = pc.searchUsers(queryParameters, new HeadersDefaultImpl());

//Get raw JSON array value in "elements" attribute
String elementJSONString = searchResults.getJsonArrayElements();
JSONArray ja = null;
ja = new JSONArray(elementJSONString);
boolean justOneFound = false;

//The search returns a set with just one user.
if (ja.length() == Integer.parseInt(pageSizeValue)) {
justOneFound = true;
}

8.4 JavaクライアントSDKを使用した認可サービスの起動

この例では、Access Manager認証サービスによって保護されている認可サービスにアクセスする方法を示します。

String clientToken = null;
String userToken = null;
ClientSDKConfig cc = null;
AuthenticationClient authNClient = null;
AuthorizationClient authZClient = null;
Headers headers = new HeadersDefaultImpl();
headers.setContractName("Default");

TokenCreateRequest req = null;
AuthenticationResult resultToken = null;

// Create a Client Token.
cc = new ClientSDKConfig("http://hostcomputer.example.com:18001/oic_rest/rest/oamauthentication/authenticate");

authNClient = new AuthenticationClient(cc);
req = new TokenCreateRequestImpl("USERCREDENTIAL", "profileid1", "secret12",
"CLIENTTOKEN");
headers = new HeadersDefaultImpl();
headers.setContractName("Default");
resultToken = authNClient.createToken(req, headers);
clientToken = resultToken.getValue();
System.out.println("ClientToken from REST Service : " + clientToken);

// Create a User Token.
req = new TokenCreateRequestImpl("USERCREDENTIAL", "jane", "secret12",
"USERTOKEN");
headers = new HeadersDefaultImpl();
headers.setIdaasRestAuthZHeader("TOKEN " + clientToken);
headers.setContractName("Default");

resultToken = authNClient.createToken(req, headers);
userToken = resultToken.getValue();
System.out.println("UserToken from REST Service : " + userToken);

// Access the Authorization Service using the User Token.
cc = new ClientSDKConfig("http://hostcomputer.example.com:18001/idaas_rest/rest/oamauthorization/authorization");
authZClient = new AuthorizationClient(cc);

headers = new HeadersDefaultImpl();
headers.setAuthZHeader(userToken);
headers.setContractName("Default");

Map<String, String> qp = new HashMap<String,String>();
qp.put("resource", "http://hostcomputer.example.com:18001/index.html");

qp.put("action", "get");
qp.put(ClientConstants.IDAAS_REST_SUBJECT_TYPE_QUERY_PARAM_NAME, "TOKEN");
qp.put(ClientConstants.IDAAS_REST_SUBJECT_VALUE_QUERY_PARAM_NAME, userToken);
AuthorizationDecision ad = authZClient.getAuthzDecision (qp, headers);
System.out.println("AuthZ Decision from REST Service : " + ad.getAllowed());

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

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

- 第9.1項「iOSクライアントSDKの概要」

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

- 第9.3項「iOSクライアントSDKを使用したHTTP Basic認証の起動」

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

- 第9.5項「資格証明ストア・サービス(KeyChain)の使用」

- 第9.6項「モバイル・シングル・サインオン・エージェント・アプリケーションの起動」

- 第9.7項「Webgateで保護されたリソースの起動」

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

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は、静的ライブラリとして提供されます。次の3つのモジュールが含まれます。

- 認証モジュール: ユーザー、デバイスおよびアプリケーションのかわりに認証リクエストを処理します。

- ユーザー・ロール・モジュール: ユーザーおよびアプリケーションが構成されたアイデンティティ・ストアからユーザーおよびグループ詳細を取得できるようにするユーザー・プロファイル・サービスを提供します。

- セキュア・ストレージ・モジュール: iOS Keychain機能を使用して重要なデータを保存および取得するためのAPIを提供します。

注意:

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

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

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

9.1.1 XCodeでのiOSクライアントSDKの使用に関する概要

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

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

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

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

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

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

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

2. PublicHeaders.zipファイルおよびPublicResources.zipファイルをダウンロードし、解凍します。
PublicHeaders.zipアーカイブには、IDM Mobile SDKヘッダー・ファイルが含まれています。

PublicResources.zipアーカイブには、IDM Mobile SDKリソース・バンドルが含まれています。

3. 「Add Files to Your-Project-Name」を選択し、PublicHeaders.zipのコンテンツおよびPublicResources.zipをプロジェクトに追加します。
IDM Mobile iOSクライアントSDKを使用してコーディングを開始できるようになりました。

重要:

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

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

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

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

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

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

この項のサンプル・コードは、JWTAuthentication (JSON Web Token Authentication)サービス・タイプをサポートしています。サービス・プロバイダの構成方法の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のモバイル・サービスの構成に関する項を参照してください。

手順1: 必須オブジェクトの初期化とエンドポイントの宣言

次のようにOMMobileSecurityServiceクラスを作成し、必要とされるMobile and Socialサーバーの詳細を提供することにより初期化します。

OMMobileSecurityService *mss = [[OMMoblieSecurityService alloc] initWithURL: mobileSocialServerURL]
appName: applicationName
domain: domainName
delegate: self];

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

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

domain引数は、Mobile and Socialサーバーが存在する場所内のインターネット・ドメインの名前です。

delegate引数は、selfに設定する必要があります。

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

[mss setup];

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

設定コールは、非同期コールで、iOSクライアントSDKは指定されたデリゲート用の次のメソッドをコールします。

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

このメソッドは、クライアント登録を処理するOMRegistrationServiceオブジェクトを返します。

注意:

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

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

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

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

OracleMobileSecurityServiceオブジェクトは現在のセッションに関する詳細のすべてを維持します。サービスに接続するために必要なアプリケーション・プロファイルおよびURLを受け取ったら、認証プロセスを開始します。次のメソッドをコールします。

NSError *error = nil;
//startAuthenticationProcess API triggers the authentication process.
error = [self.mss startAuthenticationProcess:nil
presenterViewController:loginController];
if (error)
{
UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Authentication process failed"
message:[error localizedDescription]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release];
return;
}

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

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

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

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

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

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

注意:

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

9.3 iOSクライアントSDKを使用したHTTP Basic認証の起動

この項では、HTTP Basic認証を実装するためのサンプル・コードを提供します。この認証モデルはMobile and Socialサーバーを必要としません。

HTTP Basic認証スキームは次の機能をサポートしています。

- オンラインおよびオフライン認証

- オフライン認証および取得の資格証明ストレージ

- アイドル・タイムアウトおよびセッション・タイムアウト

- オンライン認証が実施されるまでに許容されるオフライン認証の失敗の最大回数

- 認証(OAM_IDおよびObSSSOCookieなど)の後のHTTPCookieの取得

- ログアウトによるIDM Mobile iOSクライアントSDKのクッキーおよびキャッシュされた情報の消去

次に、HTTP Basic認証のサンプル・コードを示します。

OMMobileSecurityConfiguration *conf = [[OMMobileSecurityConfiguration alloc]
initWithApplicationID:@"TestApp"
maxFailureAttempts:3
authenticationScheme:OM_HTTP_BASIC_AUTH_SCHEME];

/* Initialize OMMobileSecurityService by passing in ADFMobileSecurityConfiguration */
OMMobileSecurityService *service =
[[OMMobileSecurityService alloc]initWithAppProfileConfiguration:conf delegate:self];

/* Create an authentication request object that will hold all the inputs for one particular session*/
OMAuthenticationRequest *request = [[[OMAuthenticationRequest alloc]init]];
[request setLogoutURL:@"http://hostName.example.com:14100/oam/server/logout"];
[request setSessionExpiryInSecs:30];
[request setIdleTimeInSecs:12];
[request setIsOnlineMode:true];
NSMutableArray *array = [[[NSMutableArray alloc]init];
[array addObject:@"OAM_ID"];
[request setRequiredTokens:array];
[request setAuthenticationURL:@"http://hostName.example.com:7777/index.html"];
[request setAuthenticationScheme:OM_HTTP_BASIC_AUTH_SCHEME];
NSError *error = nil;
UINavigationController *viewController = [service getAuthenticationViewController:request error:nil];
if (viewController != nil)
[self presentModalViewController:viewController animated:true];
else if (error != nil)
{
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Could not authenticate"
message:[error localizedDescription]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release];
}

認証プロセスが完了すると、コードは、デリゲートのdidFinishAuthentication: error:メソッドをコールします。

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

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

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

- ユーザーの使用

- グループの使用

- 組織の使用

9.4.1 ユーザーの使用

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

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

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

- (NSArray *)searchUsersWithFilter: (NSDictionary *)filter
isSimpleSearch: (BOOL)simpleSearch
attributesToBeFetched: (NSArray *)attributesToFetch
pageSize: (NSInteger)pageSize
pagePosition: (NSInteger)pagePosition
error: (NSError **)error;

- (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.4.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.4.3 組織の使用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

資格証明の削除

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

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

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

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

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

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

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

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

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

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

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

KeyChainItemでのプロパティの格納

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

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

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

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

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

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

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

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

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

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

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

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

- 名前: MobileSSOScheme

- 認証レベル: 2

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

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

- 認証モジュール: LDAP

- チャレンジURL: /mobilesso?serviceDomain=MobileServiceDomain
ここで、MobileServiceDomainは、シングル・サインオン用に構成されるドメインの名前です。

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

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

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

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

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

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

9.7 Webgateで保護されたリソースの起動

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

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

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

executeRESTRequest: convertDataToJSON: isJsonRepresentation returningResponse: error:

- または -

executeRESTRequestAsynchronously: convertDataToJSON:

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

didFinishExecutingRESTRequest: data: urlResponse: error: asyncHandle:

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

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

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

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

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

注意:

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

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

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

9.7.1 OMRESTRequest APIフローの理解

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

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

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

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

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

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

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

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

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

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

モバイル・シングル・サインオン・エージェントとして機能するには、アプリケーションは他のアプリケーション(モバイルSSOクライアント)からの認証リクエストを処理するロジックを含んでいる必要があります。Mobile and Socialでは、必要なロジックを示すサンプルのSSOエージェント・アプリケーションを提供します。このロジックを任意のビジネス・アプリケーションに適用して、アプリケーションがモバイルSSOエージェントとして機能できるようにします。開始するには、OICSSOAPP.zipを開きます。

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

注意:

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

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

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

10 インターネット・アイデンティティ・サービス・クライアントSDKを使用したアプリケーションの開発

この章では、インターネット・アイデンティティ・サービス・クライアントSDKを使用して、Mobile and Socialを、サポートされるWebおよびモバイル・アプリケーションと統合する方法について説明します。この章の内容は次のとおりです。

- 第10.1項「作業前の準備」

- 第10.2項「インターネット・アイデンティティ・サービス・アプリケーションの開発の概要」

- 第10.3項「アプリケーション用のアイデンティティ・プロバイダのリストの取得」

- 第10.4項「インターネット・アイデンティティ・サービスとサーバー上で実行されるWebアプリケーションとの統合」

- 第10.5項「Access Managerで保護されているWebアプリケーションとの統合」

- 第10.6項「インターネット・アイデンティティ・サービスとモバイル・アプリケーションとの統合」

10.1 作業前の準備

この章を読み始める前に、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のMobile and Socialの理解に関する項をお読みください。この開発者ガイドは、Mobile and Socialの用語と概念について熟知し、理解していることを前提としています。

10.2 インターネット・アイデンティティ・サービス・アプリケーションの開発の概要

この項では、一般的にインターネット・アイデンティティ・サービス・アプリケーションの開発に適用される概念および要件について説明します。

インターネット・アイデンティティ・サービスは、次の統合シナリオをサポートします。

- Javaベースのアプリケーション・サーバー上で実行されるWebサイトとの統合

- Access ManagerやSSOサービスなど、Oracle Access Managementサービスを使用するWebアプリケーションとの統合

- iOSモバイル・デバイス上で実行されるアプリケーションとの統合

Mobile and Socialは、インターネット・アイデンティティ・サービス用に事前作成されたログイン・ページを特徴としています。このページは、既存のアカウントを持つユーザーがログインできるようにローカル認証をサポートしており、また、新しいユーザーまたは既存のユーザーが、Yahoo、Google、Facebook、LinkedIn、Twitterなどのインターネット・アイデンティティ・プロバイダを使用して認証できるようにインターネット・アイデンティティ・プロバイダ・サポートを提供しています。アプリケーションのローカル・ユーザー認証メカニズムを保ちながら、ローカル・ユーザー認証とインターネット・アイデンティティ・プロバイダ認証の両方のために事前作成されたログイン・ページを使用するか、またはインターネット・アイデンティティ・プロバイダ認証専用のMobile and Socialログイン・ページを使用するかを選択できます。事前作成されたログイン・ページのルック・アンド・フィールは、必要に応じてカスタマイズできます。

エンドユーザー・アカウントの作成を容易にするために、インターネット・アイデンティティ・プロバイダを使用して認証するエンドユーザーに、ローカル・アカウントの作成を促すことができます。Mobile and Socialは、アイデンティティ・プロバイダからエンドユーザーのプロファイルを取得し、組込みユーザー登録機能により、ユーザーのデータを事前に移入します。

注意:

Facebook、Twitter、LinkedInなどのOAuthプロバイダでは、アプリケーションが各Mobile and Socialインスタンスを登録し、コンシューマ・キーとシークレット値を取得する必要があります。

10.2.1 インターネット・アイデンティティ・サービス・クライアントSDKについて

インターネット・アイデンティティ・サービス・クライアントSDKでの作業時に使用するプライマリJavaパッケージは、oracle.security.idaas.rp.clientパッケージです。("rp"はリライイング・パーティを表します。)

また、次のライブラリは、コンパイルおよび実行フェーズ中に使用可能になる必要があります。これらのライブラリは、クライアント・コードがWebコンテナによって実行時にコンパイルされる可能性のあるWebアプリケーションに含まれている場合に、アプリケーション・サーバーのクラス・パスで使用可能になる必要もあります。これらのライブラリは、製品パッケージoamms_sdk_for_java.zipで提供されます。

次のライブラリは、ライセンス情報およびAPIドキュメントとともに、oamms_sdk_for_java.zipに含まれています。

Mobile and Socialライブラリ

- oic_clientsdk.jar

- oic_common.jar

- oic_sae.jar

- ojdl.jar

サード・パーティ・アーカイブ

- jersey-archive-1.9.1

10.3 アプリケーション用のアイデンティティ・プロバイダのリストの取得

oracle.security.idaas.rp.clientパッケージにあるRPClientクラスは、アプリケーション用に構成されたインターネット・アイデンティティ・プロバイダのリストを取得するために必要です。

RPClientクラスは、applicationIDおよびpropertiesの2つのパラメータを取得します。

最初のパラメータ、applicationIDは、アプリケーションを識別する一意の識別子です。この文字列値はMobile and Socialサーバー管理コンソールのアプリケーション・プロファイルのセクションにあるアプリケーション名の値に一致している必要があります。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』で、「インターネット・アイデンティティ・サービスの構成」の章を参照してください。

2番目のパラメータは、プロパティ・ファイルにマップするURIです。このプロパティ・ファイルは、アプリケーションとMobile and Socialサーバーが接続して、データを安全に交換するために必要な構成プロパティをリストします。プロパティ・ファイルは、実行時にアプリケーションにアクセス可能な場所にある必要があります。

次の表は、Mobile and Socialサーバーが受け取る必須およびオプションの構成プロパティをリストしています。すべてのプロパティは文字列で、別途記載がないかぎり、オプションです。

表10-1 RPClientクラスで必要とされる構成プロパティ

プロパティ名

必須

説明

コメント

rp.server.hosturl

必須

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

rp.server.idp.service

必須

アイデンティティ・プロバイダ・サービスにアクセスするために必要な相対パス。

現在のサービス・パス:

/oic_rp/rest/
identityproviders

このパスは、rp.server.hosturlプロパティに追加されます。

rp.server.init.service

必須

リライイング・パーティ(RP)サービスにアクセスするために必要な相対パス。

現在のサービス・パス:

/oic_rp/
RPInitServlet

rp.server.connection.timeout

サーバーが応答を停止した場合の接続が中断されてからの経過時間(ミリ秒)。Nullまたは空は無限を意味します(タイムアウトなし)。

rp.server.connection.sae.sharedsecret

必須

サーバーと安全に通信するために使用されるシークレット。

BASE64でエンコードされた文字列。

rp.server.connection.sae.algorithm

サーバーと安全に通信するために使用されるアルゴリズム。省略される場合は、デフォルトでSAE。

サポートされる値は次のとおりです。

SAE: Secured Attribute Exchange.。

DES: データ暗号化規格。

rp.server.connection.sae.keystrength

キーの暗号化に使用されるキーの長さ。省略される場合は、デフォルトで128。

rp.server.connection.sae.cryptotype

暗号化のタイプ。省略される場合は、デフォルトで対称。

rp.server.connection.sae.keystorefile

暗号化キーを含むファイル名。

rp.server.connection.sae.keystoretype

キーストアのタイプを決定します。

rp.server.connection.sae.keystorepass

キーストア・パスワード。

rp.server.connection.sae.privatekeyalias

秘密鍵の別名。

rp.server.connection.sae.publickeyalias

公開鍵の別名。

rp.server.connection.sae.privatekeypass

秘密鍵のパスワード。

rp.server.connection.sae.certclass

Certインタフェースを実装するクラス名。

proxy.protocol

プロキシ・サーバーで使用するプロトコル。

サポートされる値は次のとおりです。

http

socks

direct

proxy.host

プロキシ・サーバーのホスト名。

proxy.port

プロキシ・サーバーのポート番号。

proxy.username

プロキシ・サーバーで認証するために必要なユーザー名。

proxy.password

プロキシ・サーバーで認証するために必要なパスワード。

次のサンプル・コードは、使用可能なインターネット・アイデンティティ・プロバイダおよびその対応するURLを出力する単一クラスで構成されます。このコードを使用して、インターネット・アイデンティティ・サービス・プラットフォーム構成を確認できます。必須のapplicationId入力パラメータを提供します。

まず、次のクラス依存性をインポートします。

// Java imports
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;

// Mobile and Social imports
import oracle.security.idaas.rp.client.RPClient;
import oracle.security.idaas.rp.client.RPClientConfigUtil;
import oracle.security.idaas.rp.client.RPClientException;

次に、次の定数を定義します。

public class SampleOicClient {
// Define the default properties file name
private static final String PROP_FILE_NAME = "SampleOicClient.properties";
// Pre-define the Client SDK properties
private final static String PEOPLE_SERVICE = "/oic_rest/rest/userprofileservice/people";
private final static String TOKEN_SERVICE = "/oic_rest/rest/tokenservice1/tokens";

createPropertiesFile()関数は、ローカル・ファイルが見つからない場合にデフォルトのプロパティ・ファイルを作成します。ただし、必要な値を提供する必要があります。詳細は、表10-1を参照してください。

private static void createPropertiesFile() {
try {

// Create file
FileWriter fstream = new FileWriter(PROP_FILE_NAME);
BufferedWriter out = new BufferedWriter(fstream);
out.write("");
out.write("rp.server.hosturl=http://hostcomputer.example.com:18001\n");
out.write("rp.server.idp.service=/oic_rp/rest/identityproviders\n");
out.write("rp.server.init.service=/oic_rp/RPInitServlet\n");

out.write("rp.server.connection.timeout=60000\n");
out.write("rp.server.connection.sae.sharedsecret=sharedSecret1\n");
out.write("rp.server.connection.sae.algorithm=AES\n");
out.write("rp.server.connection.sae.keystrength=128\n");
out.write("rp.server.connection.sae.cryptotype=symmetric\n");
out.write("rp.server.connection.sae.keystorefile=\n");
out.write("rp.server.connection.sae.keystoretype=\n");
out.write("rp.server.connection.sae.keystorepass=\n");
out.write("rp.server.connection.sae.privatekeyalias=\n");
out.write("rp.server.connection.sae.publickeyalias=\n");
out.write("rp.server.connection.sae.privatekeypass=\n");
out.write("rp.server.connection.sae.sigvalidityduration=\n");
out.write("rp.server.connection.sae.certclass=\n");

out.write("#proxy configuration\n");
out.write("proxy.host=\n");
out.write("proxy.port=\n");
out.write("#http|socks|direct\n");
out.write("proxy.protocol=\n");
out.write("proxy.username=\n");
out.write("proxy.password=\n");

out.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}

次のコードは、提供される必要なapplicationID識別子に基づいて使用可能なインターネット・アイデンティティ・プロバイダを出力します。

public static void main(String[] args) {
RPClient client = null;
int exitStatus = 0;
String ret = null;
File prop = new File(PROP_FILE_NAME);
String applicationName = null;

//Check the arguments: applicationID is mandatory
if (args.length < 1 || args[0].isEmpty()) {
System.err.println("Invalid number of arguments. Specify the name of the application
(the applicationID) to be used to connect to the Mobile and Social Server.\n");
exitStatus = 1;
} else {
applicationName = args[0];

// Check if a properties file is available
if (prop.exists()) {
RPClientConfigUtil conf = null;

// Read the configuration using the provided utility class
try {
conf = new RPClientConfigUtil(prop.toURI().toURL());
} catch (MalformedURLException e) {
System.err.println("Malformed URL:" + e.getMessage());
exitStatus = 1;
} catch (IOException ioe) {
System.err.println("IO Exception:" + ioe.getMessage());
exitStatus = 1;
}
System.out.println("RPClient :\n=========\n");
try {

// Initiate the interface with the Mobile and Social Server using
// the configuration properties and the applicationID.
client = new RPClient(applicationName, conf);

ret = "The application name is [" + applicationName + "]\n";
ret += "The retrieved IDP information is:\n\n";
for (String idp : client.getIDPList()) {
// Display the IDP name
ret += "    IDP name : " + idp + "\n";
// DISPLAY the IDP reference URL
ret += "    IDP Href : " + client.getHrefByIdpName(idp);
ret += "\n";
}
} catch (RPClientException rpce) {
System.err.println("Client Exception:" + rpce.getMessage());
exitStatus = 1;
}
System.out.println(ret);
System.out.println("\nClient SDK :\n============\n");
System.out.println("    CreateToken :\n    =============\n");
new CreateToken(conf.get("rp.server.hosturl") + TOKEN_SERVICE);
System.out.println("\n    People :\n    ========\n");
new CreateUser(conf.get("rp.server.hosturl") + PEOPLE_SERVICE);
} else {
//No properties file is available, so create a default one
createPropertiesFile();
System.out.println("The " + PROP_FILE_NAME + " properties file has not been found.
A default one has been created at this location.");
System.out.println("Please edit the file and provide the required values. Then
restart this utility.\n");
exitStatus = 2;
}
}
System.exit(exitStatus);
}
}

10.4 インターネット・アイデンティティ・サービスとサーバー上で実行されるWebアプリケーションとの統合

インターネット・アイデンティティ・サービスSDKは、Java互換のアプリケーション・サーバー上で実行しているポータル・サイトやコンシューマ主導のWebサイトなどのWebアプリケーションをサポートしています。

インターネット・アイデンティティ・サービスをWebアプリケーションと統合するには、まず、Mobile and Socialサーバー上でWebアプリケーションを定義し、インターネット・アイデンティティ・サービス・ログイン・ページをWebアプリケーションと統合します。次に、ユーザー登録を構成し(オプション)、最終的な返信レスポンスを処理します。

この項の項目は次のとおりです。

- Mobile and Socialサーバー上のWebアプリケーションの定義

- インターネット・アイデンティティ・サービス・ログイン・ページとWebアプリケーションとの統合

- ユーザー登録の処理

- 最終的な返信レスポンスの処理

10.4.1 Mobile and Socialサーバー上のWebアプリケーションの定義

Mobile and Socialシステム管理コンソールを使用して、Mobile and Socialサーバー上のWebアプリケーションを定義します。このタスクの実行の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または作成に関する項を参照してください。

次に、Mobile and Socialサーバー上で構成する必要があるアイテムの一部の簡単な説明を示します。

- アプリケーション名: Webアプリケーションのコンテキスト名を指定します。

- Mobile and Socialアプリケーション戻りURL: 認証レスポンスを返すためにMobile and Socialが使用するURLを指定します。

- 共有シークレット: WebアプリケーションとMobile and Socialサーバーがセキュアな通信を容易に実現するために共有するセキュリティ・シークレットを指定します。共有シークレットは、ユーザー登録時にも必要です。

- 必須のアイデンティティ・プロバイダ: アプリケーションへの認証にエンドユーザーが選択できるアイデンティティ・プロバイダを選択します。

- アプリケーション・ユーザー・プロファイル属性マッピング: アイデンティティ・プロバイダが返すユーザー・プロファイル属性を、アプリケーションに対してローカルのユーザー・プロファイル属性にマップします。

- ユーザー登録および登録URL: システムがローカル・アカウントのないユーザーに登録を促す必要があるかどうかを示します。サービス・プロバイダの完了時に、サーバーが認証後にユーザーをリダイレクトするURLを指定します。

10.4.2 インターネット・アイデンティティ・サービス・ログイン・ページとWebアプリケーションとの統合

インターネット・アイデンティティ・サービスを統合するには、インターネット・アイデンティティ・サービス・クライアントSDK(oic_clientssdk.jar)を使用し、そのログイン・ページ(login.jsp)を変更します。

インターネット・アイデンティティ・サービス・ログイン・ページをWebアプリケーションと統合するには、(1)Mobile and Socialサーバー上でホストされる事前作成されたログイン・ページをHTML <iframe>タグを使用してWebアプリケーションに追加する、または(2)Mobile and Socialで提供されるインターネット・アイデンティティ・プロバイダ・データを使用してカスタム・ログイン・ページを構築するという2通りの方法があります。

10.4.2.1 事前作成されたインターネット・アイデンティティ・サービス・ログイン・ページの追加

Mobile and Socialサーバー上でホストされるログイン・ページをWebアプリケーションに追加するには、まず、SDKを使用してセキュア・トークンを取得します。Webアプリケーションは、WebアプリケーションとMobile and Socialサーバーで認識される共有シークレットに基づく、Secured Attribute Exchange (SAE)トークンを必要とします。

次のサンプル・コードは、インターネット・アイデンティティ・サービス・クライアントSDKを初期化し、saeTokenを取得する方法を示しています。このコードは、JSPページ(例: login.jsp)に追加できます。

RPClientクラスは、applicationIDおよびpropertiesの2つのパラメータを取得します。

RPClient rpClient = new RPClient(“sampleapp”,properties);
Map<String, String> attrs = new HashMap<String, String>();
attrs.put("applicationID",“sampleapp”);
String saeToken = rpClient.getSaeToken(attrs,properties.getProperty("rp.server.connection.sae.sharedsecret"),
properties.getProperty("rp.server.connection.sae.sharedsecret"));

getSaeTokenメソッドは、アプリケーション用のSAEトークンを取得します。

プロパティ・ファイルからのsae.sharedsecretプロパティにより、rpClient.getSaeTokenメソッドの2番目および3番目のパラメータが形成されます。(詳細は、第10.3項「アプリケーション用のアイデンティティ・プロバイダのリストの取得」を参照してください。) 「SAEシークレット」の最初のインスタンスは、属性の署名に使用され、2番目のインスタンスはそれらの暗号化に使用されます。「SAEシークレット」の2番目のインスタンス(つまり、メソッドの3番目のパラメータ)がnullの場合、属性は署名されますが、暗号化されません。

次にHTML <iframe>タグを使用して、インターネット・アイデンティティ・サービス・ログイン・ページを埋め込みます。

<iframe
src="http://oc.example.com:24666/oic_rp/login.jsp?applicationID=sampleapp&saeToken=<%=saeToken%>"
scrolling="no"
frameBorder="no"
allowtransparency="true"
style="width:720px;height:440px;">
</iframe>

次のスクリーン・キャプチャは、Mobile and Socialサーバー上でホストされる事前作成されたログイン・ページを統合するためにiframeを使用しているサンプル・ログイン画面を示します。このページは、ローカル・ユーザー認証とインターネット・アイデンティティ・プロバイダ認証の両方をサポートするように構成されています。

図10-1 事前作成されたローカル・ログイン・サポートのあるログイン画面

次のスクリーン・キャプチャは、前の例と同様で、インターネット・アイデンティティ・プロバイダ・サポートのみが有効なページを示しています。この例では、Webアプリケーションはそのローカル・ユーザー認証メカニズムを個別に実装します。

図10-2 事前作成されたローカル・ログイン・サポートのないログイン画面

10.4.2.2 カスタム・ログイン・ページの構築

ログイン・ページをより一層柔軟に構築する必要がある場合は、この項で説明される方法を使用してください。

次の例のコードは、インターネット・アイデンティティ・サービス・クライアントSDKを初期化し、RESTエンドポイントを起動して、アイデンティティ・プロバイダ・データを取得し、HTML表を使用してログイン・ページを構築して、アイデンティティ・プロバイダのロゴを表の行に表示します。

String ret =” ";
RPClient client = null;
try {
client = new RPClient("sampleportal", "rpclient.properties");
for (String idp: client.getIDPList()){
ret += "\n<TR><TD><a href='" + client.getHrefByIdpName(idp)
+ "'><img src='images/" + idp.toLowerCase()
+ ".gif' alt=" + idp + " title=" + idp
+ "border='0'></img></a></TD></TR>";
}
} catch(Exception e){
e.printStackTrace();
}

Mobile and Socialサーバーからの出力は次のように表示されます。

<table cellpadding="6" cellspacing="6" align="center">
<th colspan=2>Sign in with any Account</th>
<TR>

<td>
<a href='http://rp.example.com:24666/oic_rp/init?applicationID=sampleportal
&saeToken=RU5DUllQVEVENjIwODgxM0ZCNTAxOEZENUZBRTA2MzYxOTJBQzM3MDIwQjc5NEE1RDdFMjczREYxNUYw
Mzk0NjQwRjRFRTQwNzBCMzc0OEMyRUVENTkyOTVCMkI5NUU0MzM2QTk5MzYyRjJCQjg5MDJDNDcwNDlFNTFFMTIzMU
Q5OTY1RTZBMjA3QzM3N0FCNDlBMDlFQjVFQUI2RDlDRTU1RERGOTExNEIyMThFNzBGMjYzRkI3MkRGNEIwMjlENTBFQ
zFEMTM1RkUzRjU5RjcxQkMxQTg2QkNBNzAzQTUwOTBCRUJBOEY3REM5RUU3RjIyQjEwQ0Q5QzNCQjA0RDVDRDBGQUNF
NkM1M0ZGQzJCNDk4NERBRDNGNkI4REY0QkU3QzZCMDU4QTRBREQxNTI4NzdCMTkxRkU4MTdGRTYzNEQ0OTdFN0MxQzk
3M0MzQkFFOEVCQzEwQzg0NDIzMDQ1NDAyNUZCRQ=='><img src='images/facebook.gif' alt=Facebook
title=Facebook border='0'></img></a></td>
<td>
<a href='http://rp.example.com:24666/oic_rp/init?applicationID=sampleportal
&saeToken=RU5DUllQVEVENjIwODgxM0
xNUYwMzk0NjQwRjRFRTQwNzBCMzc0OEMyZCNTAxOEZENUZBRTA2MzYxOTJBQzM3MDIwQjc5NEE1RDdFMjczREYRUVENT
RUVENTkyOTVCMkI5NUU0MzM2QTk5MzYyOTM3REY0NzJFQTIzQTVDNDY4RjRCREJFRTM4OEU2RDI2QUI3QTc4QjE3RUNDO
DY4NDU2MDZCQjk4Q0IyNjg3QTNFMUQzOTVENTM5NjEzRTZDMTM3RjVBNDJFRUZENzUzOERDOEVDQkUzOEY5NEM5QjU2Qz
E4NjVGRTA2MzVCMDBBNUYyNTgzRDU0OEI4ODE4RUI4ODgxMkUyMEM3RDU3RUIwQjMyRTk2RkI3ODc5RkI1MzU5QjhFNDU1
RjZDQzZEQTlEQTVCRDkwQjIxQzEyRDUzNEIzNTMyNTgwRTZCOTM3NzZDM0UyNTg2QTE3MTZFMDc3MTJFNDAxMDI3OTg1Qw=='>
<img src='images/twitter.gif' alt=Twitter title=Twitter border='0'></img></a></td>
</TR><TR>
<td>
<a href='http://rp.example.com:24666/oic_rp/init??applicationID=sampleportal
&saeToken=RU5DUllQVEVENjIwODgxM0ZCNTAxOEZENUZBRTA2MzYxOTJBQzM3MDIwQjc5NEE1RDdFMjczREYxNUYwMzk
0NjQwRjRFRTQwNzBCMzc0OEMyRUVENTkyOTVCMkI5NUU0MzM2QTk5MzYyNThGRDM1MjRDRDQ2QTQ5RTRFMEZEMTY3OEEyQ
TAxM0Y4NDQ1MjUwODkxRTlBRDgzMDdBNDRDRjEzMkE4MEJCNkU5ODhCMjcyRkNBNUMwREJFRjA4MDAzQkMwRTAzQzNGNkUy
OEJEMzMxMDcwNTlEMDdGQjREMzFEQjdCRjRDM0YxNUQ4OTI2QTY4OUM1NDIwNjk5MDY3RUM0M0YyNjA0QjBBRDc3MkZGOThB
QjUxRTJDQUFFOEYwOEQ0QTE3Njc4MDM1NjYxNzY5MzY4Mjk0MjVFRDFGNDhEMDAzQTFBMjU1MEQ1QUE1RkM3MkNDMUNGMjUwN0J
CMEI1NDkzM0Q5NQ=='><img src='images/linkedin.gif' alt=LinkedIn title=LinkedIn border='0'></img>
</a></td>
<td>
<a href='http://rp.example.com:24666/oic_rp/init??applicationID=sampleportal
&saeToken=RU5DUllQVEVEMDI5M0FFNjIzMEVEOUZEQkEzMEU0QzAxMDlCOTg1ODlDQ0I5QkQxM0JGQjhGQkY5QzAzNDZER
EZGN0I1RDBBMjQ3NzkxNjdBOERFNTUzN0IxMzk0QTdENUUyNDQxOTdBNkE4MDEwOTlGOEJDNTIyQTQwMEU3OTM3OUUxQTRFR
UYyNjY0MDc3Nzc0OEMzNDJCMzhCOUJDREZBQzdCNENFQkI5NTBCNDRCOTQyQjU5NkYwMEQ2MUY3MUMxNkJEOUIyQzk5MTk1R
DRGNzQ4OTg0QzFDMjFEMzQwOUQ0RUIxQTRFOTZGMTFBN0ExODg3MTZCQTc5QUE2QTU5RDk3MUMzOUQ1MkY1NEM2Q0I1OUFCNz
FBOTQ3M0VBQkE3QzUzQzc0MzM4ODk3RUY3NEJFQkJFODg2QjE4QkU5RUFGQURFRDE3NUMyRTg0NjRDRjNDQzJGN0Y1QTU4RDlD
OTIzMDM5OQ=='><img src='images/google.gif' alt=Google title=Google border='0'></img></a></td>
</TR><TR>
<td>
<a href='http://rp.example.com:24666/oic_rp/init??applicationID=sampleportal
&saeToken=RU5DUllQVEVEMDI5M0FFNjIzMEVEOUZEQkEzMEU0QzAxMDlCOTg1ODlDQ0I5QkQxM0JGQjhGQkY5QzAzNDZEREZGN
0I1RDBBMjQ3NzkxNjdBOERFNTUzN0IxMzk0QTdENUUyNDQxOTdBMDQ5MjMxQUJDMUZDMzVFNjI5NkVBREZBNzk0MUJDQTY2OTE3
RkRCQTUyRUFERTVGNEIyN0NCMzMzMThBQTM2MDlGOTE5NDY4OTBCN0EyNzdGRUY2Qjc1RTBENjY4MDEyNTVGOTA3Mzc5MTZGQkU
1MkM0RkQwMEJFQjAzOUQ4NEQyOEYyNDU4MDRDMjUzQjg2ODlGRkM1MkFGRTEwOTAwMDM2NDExRDIwMzkyMDBBMzYxMkZGRjU4Rj
VNkFBQ0QwQTgyMzA2NDA2REEyMzkxMzU2NjAzNDIzNzE5MDdDM0RFRURGNTE5NjI4MzQ2RTVCNzZCOTg5Q0NFMkM2RTkwMQ=='>
<img src='images/yahoo.gif' alt=Yahoo title=Yahoo border='0'></img></a></td></TR>
<!----End Providers---->
</table>

10.4.3 ユーザー登録の処理

ローカル・エンドユーザー・アカウントの作成を容易にするために、Mobile and Socialではユーザーがローカル・アカウントを作成するよう促すことができます。ユーザーがアイデンティティ・プロバイダで認証された後で、Mobile and Socialはカスタム・ユーザー登録ページ、またはMobile and Socialサーバーに含まれる組込み登録ページにリダイレクトできます。

この項では、次の両方の方法について説明します。

- カスタム・ユーザー登録ページの使用方法

- Mobile and Social組込みユーザー登録ページの使用方法

10.4.3.1 カスタム・ユーザー登録ページの使用方法

この項の情報を使用して、Mobile and Socialで使用するためのカスタム・ユーザー登録ページを構成します。

サーバー上でのユーザー登録プロパティの構成

Mobile and Socialシステム管理コンソールを使用して、アプリケーション用の次のユーザー登録プロパティを構成します。

- ユーザー登録(「有効」を選択)

- 登録URL

- 属性(「アプリケーション・ユーザー属性」セクションにある)

- 属性マッピング(アプリケーション・ユーザー属性マッピングを使用した登録サービス詳細セクションにある)

各フィールドの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または作成に関する項を参照してください。

saeTokenの復号化

ユーザー登録がアプリケーション用に有効になっている場合、Mobile and Socialは、構成された登録URLにリダイレクトします。Mobile and Socialは、URLにPOSTを実行し、共有シークレットで暗号化されたユーザー・プロファイル・データを含むsaeTokenと、アプリケーション名であるApplicationの2つのパラメータを含めます。

oic_clientsdkでRPClient APIを使用して、saeTokenを復号化します。

次に例を示します。

String saeToken = request.getParameter("saeToken");
Map<String, UserAttribute> regAttrMap = null;
if (saeToken != null) {    Map<String, String> saeAttrs = client.getAttrFromSaeToken(saeToken,
”shared secret value”,”shared secret value”);
System.out.println("register: saeAttrs :" + saeAttrs);
String regAttrs = saeAttrs.get ("reg_attrs");
String selectedIDP = saeAttrs.get ("oicInternetIdentityProvider");
String state = saeAttrs.get ("return_url");
}

次のブロックは、saeTokenのすべての属性を示しています。

saeAttrs :{readonly_fields=uid,mail, password_field=password,
registerReadOnlyToken=RU5DUllQVEVEODk4QjlGQzU0RjNDNTQyNTY0NTU1MzMzOTU3RDU3QjkwNzd
EMTBGREJDMTlBQjM4NDIzNTFFRkI0OUNDQjg1M0JFREQ1NTdCM0I5RkY4MEYyNjFDMEE1NUFBRjhDQjA4
QTQ1M0IyMDg0MzFCNzgxQjg4Nzg4QzJFNEU5MzJFNUM0MjgxMEQxNjEzNkFERjE1MUE0QTMzM0E3MTMyN
zM5NUExN0U3MzA2MjZCRjZDQzgxN0I2MjIwNzEyNEQ2REVE,
reg_attrs=uid:UserId:example@gmail.com:,mail:Email Address::,
timezone:Time Zone::,postaladdress:Country:US:,preferredlanguage:Language:en-US:,
lastname:Last Name:doe:,commonname:First Name:john:,password:Password::,,
username_attr=uid, mandatory_fields=uid,mail,password,password,
state=f166f9aa12edaaeffce703276de2d73c30dbddd0,
oicInternetIdentityProvider=Google,
return_url=http://host.example.com:18001/oic_rp/popup?state=f166f9aa12edaaeffce703276de2d73c30dbddd0}

アプリケーションは、reg_attrsの値を処理する必要があります。他のsaeToken属性は無視する必要があります。

reg_attrs=uid:UserId:example@gmail.com:,mail:Email Address::,
timezone:Time Zone::,postaladdress:Country:US:,preferredlanguage:Language:en-US:,
lastname:Last Name:doe:,commonname:First Name:john:,password:Password::,,

値はカンマで区切られた{User Attribute Name:User Attribute Label:User Attribute Value}セットです。

アプリケーションは、oicUserRegister=doneをURLに追加して、Mobile and Social戻りURLにリダイレクトできます。

次に例を示します。

response.sendRedirect(http://oic.host.com:18001/oic_rp/popup?state=f166f9aa12edaaeffce703276de2d73c
30dbddd0&oicUserRegister=done);

Mobile and Socialでは、アイデンティティ・プロバイダ認証に基づいたユーザー・トークンを作成し、それをアプリケーションに戻します。

10.4.3.2 Mobile and Social組込みユーザー登録ページの使用方法

この項の情報を使用して組込みユーザー登録ページを有効にします。このページを図10-3に示します。

サーバー上でのユーザー登録プロパティの構成

Mobile and Socialシステム管理コンソールを使用して、アプリケーション用の次のユーザー登録プロパティを構成します。

- ユーザー登録(「有効」を選択)

- 登録URL(デフォルトのMobile and Socialインターネット・アイデンティティ・サービス・アプリケーション、OAMApplicationで提供されるURLに設定。例: http://host.example.com:port/oic_rp/register.jsp

- 属性(「アプリケーション・ユーザー属性」セクションにある)

- 属性マッピング(アプリケーション・ユーザー属性マッピングを使用した登録サービス詳細セクションにある)

各フィールドの詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または作成に関する項を参照してください。

ユーザー登録がアプリケーション用に有効になっている場合、Mobile and Socialは、組み込まれたMobile and Socialユーザー登録ページにリダイレクトします。ユーザーはフォームに記入して登録するか(Access Managerがリソースを保護している場合は必須)、登録をスキップできます。Mobile and Socialは、アプリケーションの構成済戻りURLにリダイレクトします。

図10-3 Mobile and Social組込みユーザー登録ページ

10.4.4 最終的な返信レスポンスの処理

ユーザー認証後、およびオプションでユーザー登録後、Mobile and Socialは再度アプリケーションにリダイレクトします。

ユーザーがローカルでログインするか、アイデンティティ・プロバイダを使用してログインするかによって、返信レスポンスはわずかに異なります。

ローカル・ログイン返信レスポンス

ユーザーがローカルにログインする場合は、Mobile and SocialはsaeTokenパラメータを使用して、再度アプリケーションの戻りURLにリダイレクトします。saeTokenには、共有シークレットを使用して暗号化された、Mobile and Socialで生成されたユーザー・トークン・データが含まれます。

oic_clientsdkでRPClient APIを使用して、saeTokenを復号化します。

次に例を示します。

String saeToken = request.getParameter("saeToken");
if (saeToken != null) {
Map<String, String> saeAttrs = client.getAttrFromSaeToken(saeToken,
”shared secret value”,”shared secret value”);
System.out.println("register: saeAttrs :" + saeAttrs);
String uid = saeAttrs.get ("uid");
String authType = saeAttrs.get ("authType");
String oicUserToken = saeAttrs.get ("oicLocalLoginUserToken ");
}

次のブロックは、saeTokenレスポンス属性を示しています。

{uid=weblogic, authType=local,
oicLocalLoginUserToken=eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6ImJhc2VfZG9tYW
luIn0.eyJleHAiOjEzMzkwODkzMzAxMTgsImF1ZCI6InJlc3Rfc2VydmVyIiwiaXNzIjoiSW50ZXJuZXR
JZGVudGl0eUF1dGhlbnRpY2F0aW9uIiwicHJuIjoid2VibG9naWMiLCJqdGkiOiIyZTVhZmJhZS03ZTQz
LTQwYmMtODIwZS1mODVhN2MyODE2ZWUiLCJvcmFjbGUub2ljLnRva2VuLnR5cGUiOiJVU0VSVE9LRU4iL
CJpYXQiOjEzMzkwODU3MzAxMTgsIm9yYWNsZS5vaWMudG9rZW4udXNlcl9kbiI6InVpZD13ZWJsb2dpYy
xvdT1wZW9wbGUsb3U9bXlyZWFsbSxkYz1iYXNlX2RvbWFpbiJ9.UIZuur_e_uWyFzoig
_mBolPXKIz5BnmmszmB65zsAVNISQ9dui0PRd6F85N-0ZBPKQMf8Xnch0c_mjIt6eXwUD6YD_
Wo0f44svmzM43X74Q2VkMgkH2xM1-3lZEMQb03zZ55CrR5UXpsDKvF54bSa6-jbg2ODZAb2ralEqKiVd0}

レスポンス属性の詳細は、第10.4.4.1項「Secured Attribute Exchange (SAE)トークン・レスポンス属性」を参照してください。

アイデンティティ・プロバイダ・ログイン返信レスポンス

ユーザーがアイデンティティ・プロバイダを使用してログインする場合、Mobile and Socialは再度アプリケーションの戻りURLにリダイレクトします(HTTP POSTを使用)。レスポンスにはsaeTokenパラメータが含まれ、共有シークレットを使用して暗号化されたMobile and Socialで生成されたリライイング・パーティ・ユーザー・トークン・データおよびアイデンティティ・プロバイダによって戻されたユーザー・プロファイル・データが含まれます。

oic_clientsdkでRPClient APIを使用して、saeTokenを復号化します。

次に例を示します。

String saeToken = request.getParameter("saeToken");
if (saeToken != null) {
Map<String, String> saeAttrs = client.getAttrFromSaeToken(saeToken,
”shared secret value”,”shared secret value”);
System.out.println("register: saeAttrs :" + saeAttrs);
String uid = saeAttrs.get ("uid");
String authType = saeAttrs.get ("oicInternetIdentityProvider ");
String oicUserToken = saeAttrs.get ("internet_identity_user_token");
}

次のブロックは、saeTokenレスポンス属性を示しています。

{uid=example@gmail.com, mail=, timezone=, postaladdress=US,
internet_identity_user_token=eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6ImJhc2dn
VfZG9tYWluIn0.eyJleHAiOjEzMzkwODk4OTM4NjQsIm9yYWNsZS5vaWMudG9rZW4ucnAuaWRwX3VyaSI
6Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvbzgvaWQiLCJvcmFjbGUub2ljLnRva2VuLnJw
LnVzZXJfaWRfdXJpIjoibWFpbHRvOm9pY3VzZXIxMDFAZ21haWwuY29tIiwiYXVkIjoicmVzdF9zZXJ2Z
XIiLCJpc3MiJJbnRlcm5ldElkZW50aXR5QXV0aGVudGljYXRpb24iLCJwcm4iOiJtYWlsdG86b2ljdXNl
cjEwMUBnbWFpbC5jb20iLCJqdGkiOiI0ZTQxNzhkYy1hOWRhLTQxODMtODVkMi1hNDM0MDM5YmZhNzUiL
CJvcmFjbGUub2ljLnRva2VuLnR5cGUiOiJVU0VSVE9LRU4iLCJpYXQiOjEzMzkwODYyOTM4NjQsIm9yYW
NsZS5vaWMudG9rZW4udXNlcl9kbiI6Im1haWx0bzpvaWN1c2VyMTAxQGdtYWlsLmNvbSBodHRwczovL3d
3dy5nb29nbGUuY29tL2FjY291bnRzL284L2lkIn0.K4d_gewCE6N61Ng8DsB31BIEEG1S1wMHWpt5CC8u
yfdMgtpEjzs77yFYzNz5vS6x6lsa8fH2FrSgOlxoyoiOnRF8UfJgCzk3VJIDNoDd_2BsYrBQVLGQzWTbs
avO5x09macq6rmOOT1Jbg9napfol8plqgTHPZgm3CH7Rt7jmxA, preferredlanguage=en-US,
lastname=doe, commonname=johndoe, oicInternetIdentityProvider=Google, password=}

レスポンス属性の詳細は、第10.4.4.1項「Secured Attribute Exchange (SAE)トークン・レスポンス属性」を参照してください。

10.4.4.1 Secured Attribute Exchange (SAE)トークン・レスポンス属性

次の表は、saeTokenレスポンス属性を示しています。これらの属性は、必要に応じてコードで使用できます。

表10-2 Secured Attribute Exchange (SAE)トークン・レスポンス属性

属性

説明

uid

Mobile and Socialがホストするログイン・ページ上でローカル・ログインを完了したユーザーのユーザーID。

authType

ユーザーが選択したログインのタイプ。例: authType=local

oicInternetIdentityProvider

ユーザーが選択したアイデンティティ・プロバイダ。例: oicInternetIdentityProvider=Google

oicLocalLoginUserToken

ローカルにログインするユーザーの、Mobile and Socialで生成されたユーザー・トークン。自身のアプリケーションでこのユーザー・トークンを使用して、Mobile and Socialのユーザー・プロファイルおよび他のRESTサービスにアクセスできます。

internet_identity_user_token

アイデンティティ・プロバイダを使用してログインするユーザーの、Mobile and Socialで生成されたユーザー・トークン。自身のアプリケーションでこのユーザー・トークンを使用して、Mobile and Socialのユーザー・プロファイルおよび他のRESTサービスにアクセスできます。

10.5 Access Managerで保護されているWebアプリケーションとの統合

Access Managerと統合されているWebアプリケーションとインターネット・アイデンティティ・サービスを統合するためのコードを記述する必要はありません。この統合を実行するには、Mobile and SocialとAccess Managerシステム管理コンソールを使用します。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』の「インターネット・アイデンティティ・サービスの構成」の章を参照してください。

10.6 インターネット・アイデンティティ・サービスとモバイル・アプリケーションとの統合

モバイル・ブラウザを使用してMobile and Socialサーバーでホストされるログイン・ページを表示する場合は、インターネット・アイデンティティ・サービスにより、モバイル・フレンドリなログイン・ページが提供されます。Mobile and Socialは、モバイル・デバイスを自動的に検出し、適切なページを表示します。詳細な構成は必要ありません。

ネイティブのモバイル・アプリケーションでインターネット・アイデンティティ・サービス・ログイン・ページを統合する場合は、ホストされているログイン・ページまたはデバイス上にインストールされているカスタム・ログイン・ページのいずれかを使用できます。どのアイデンティティ・プロバイダがMobile and Socialサーバー上で有効になっているかを、モバイル・デバイスで実行されているコードが認識する必要はありません。モバイル・デバイス上で実行されるコードを更新する必要なしに、サーバー上でアイデンティティ・プロバイダを追加および削除できます。

10.6.1 Mobile and Socialサーバー上のモバイル・アプリケーションの定義

Mobile and Socialシステム管理コンソールを使用して、Mobile and Socialでモバイル・アプリケーション用のアプリケーション・プロファイルを定義します。このタスクの実行の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または作成に関する項を参照してください。

次に、Mobile and Socialサーバー上で構成する必要があるアイテムの一部の簡単な説明を示します。

- アプリケーション名: アプリケーションの名前を指定します。

- モバイル・アプリケーション戻りURL: モバイル・アプリケーションの戻りURLを指定します。Mobile and Socialは、このURLを使用して認証レスポンスを送信します。

- 共有シークレット: モバイル・アプリケーションとMobile and Socialサーバーがセキュアな通信を容易に実現するために共有するセキュリティ・シークレットを指定します。

- 必須のアイデンティティ・プロバイダ: アプリケーションへの認証にエンドユーザーが選択できるアイデンティティ・プロバイダを選択します。

- ユーザー属性マッピング: アイデンティティ・プロバイダが返すユーザー・プロファイル属性を、アプリケーションに対してローカルのユーザー・プロファイル属性にマップします。

11 Mobile and Socialサーバーの機能の拡張

この章では、Mobile and Social Javaインタフェースを拡張して、モバイル・サービス用の新しい認証サービス・プロバイダを追加する方法について説明します。この章の内容は次のとおりです。

- 第11.1項「モバイル・サービス用の新しい認証サービス・プロバイダの作成」

- 第11.2項「インターネット・アイデンティティ・サービス用の新しいアイデンティティ・サービス・プロバイダの作成」

11.1 モバイル・サービス用の新しい認証サービス・プロバイダの作成

この項の項目は次のとおりです。

- カスタム認証サービス・プロバイダの開発

- カスタム認証サービス・プロバイダの構築

- カスタム認証サービス・プロバイダのデプロイ

11.1.1 カスタム認証サービス・プロバイダの開発

カスタム認証サービス・プロバイダを作成するには、次の2つのカスタム・クラスを記述する必要があります。

- TokenService: 最初にこのインタフェースを実装します。これは、モバイル以外のアプリケーションと連動する基本的なカスタム・トークン・プロバイダです。

- MobileCompositeTokenServiceProvider: このクラスを拡張してモバイル・アプリケーションをサポートします。ここでは、モバイルSSOをサポートするために作成したカスタム・トークン・プロバイダを再利用しています。モバイル・アプリケーションをサポートする必要がない場合は、このクラスを拡張する必要はありません。

11.1.1.1 TokenServiceインタフェースの実装

実装するAPIの詳細は、TokenService Javaドキュメントを参照してください。LifecycleServiceProviderおよびUserAuthenticatorインタフェースを実装する必要もあることに注意してください。

カスタム・トークン・プロバイダでは、この認証サービス・プロバイダを再利用してモバイル・クライアントをサポートするために、createTokens()メソッドを実装する必要があります。

Tokenオブジェクトを戻す場合(成功時)またはRESTUnauthorizedExceptionをスローする場合(失敗時)、PluginContextオブジェクトを作成する必要があります。このオブジェクトは、戻されるTokenオブジェクトか、スローされるRESTUnauthorizedExceptionに含まれる必要があります。

- 各サービス・ドメインには、セキュリティ・ハンドラ・プラグインがあります。セキュリティ・ハンドラ・プラグインはユーザー動作パターンを追跡し、必要に応じて、認証チャレンジ(ナレッジベース認証チャレンジなど)を発行できます。OAAMSecurityHandlerPluginは、Mobile and Socialに含まれています。ナレッジベース認証(KBA)チャレンジには、Oracle Adaptive Access Managerの統合が必要です。

- 通常、認証サービス・プロバイダ・トークン操作の後で、セキュリティ・ハンドラ・プラグインが起動します。このPluginContextのデータは、セキュリティ・プラグインとの通信に使用されます。TokenオブジェクトまたはRESTUnauthorizedExceptionオブジェクトにPluginContextオブジェクトが含まれない場合、構成されたセキュリティ・プラグインは起動されません。

- PluginContextオブジェクトは、PluginDataFactory APIを介して作成されます。PluginContext APIは、セキュリティ・イベントのタイプ、ユーザーID、クライアント・アプリケーションID、それらの対応するID認証ステータスとタイプなどのセキュリティ・データを収集します。詳細は、Javadocを参照してください。

11.1.1.2 MobileCompositeTokenServiceProviderの拡張

このクラスを拡張して、カスタム・トークン・サービス・プロバイダを再使用し、モバイル・デバイスをサポートします。

getComponentTokenServiceProviderClass() APIを実装します。次のサンプル・コードを参照してください。

protected Class getComponentTokenServiceProviderClass() {
return CustomTokenProvider.class;
// CustomTokenProvider is the class name you implemented. Change the name to
// the name that you used when implementing the TokenService.
}

詳細は、このクラスのJavaドキュメントを参照してください。

11.1.2 カスタム認証サービス・プロバイダの構築

カスタム認証サービス・プロバイダは次のように構築します。

11.1.2.1 カスタム認証サービス・プロバイダを構築するには

1. oic_rest.jarファイル、oic_common.jarファイルおよびカスタム・コードに必要な追加のJARファイルを収集します。
次に例を示します。

com/example/tokenprovider/MyTokenProvider.java implementing TokenService
com/example/tokenprovider/MobileMyTokenProvider.java extending MobileCompositeTokenServiceProvider

2. カスタム・トークン・プロバイダを構築します。
次に例を示します。

javac -cp ./oic_rest.jar:./oic_common.jar com/example/tokenprovider/MyTokenProvider.java

javac -cp ./oic_rest.jar:./oic_common.jar:. com/example/tokenprovider/MobileMyTokenProvider.java

3. JARファイルを構築します。
次に例を示します。

jar cvf mytokenpro.jar com/example/tokenprovider/*.class

11.1.3 カスタム認証サービス・プロバイダのデプロイ

カスタム認証サービス・プロバイダは次のようにデプロイします。

11.1.3.1 カスタム認証サービス・プロバイダをデプロイするには

1. mytokenpro.jarをデプロイメントのfmwconfig/oic/pluginsディレクトリにコピーします。
ここでJARファイルは、Mobile and Socialによって動的に選択されます。カスタム・サービス・プロバイダに追加のJARファイルが必要な場合、これらのファイルは、コンテナのCLASSPATHで使用できるようにする必要があります。

2. 管理コンソールからカスタム・トークン・プロバイダを構成するには、「システム構成」→Mobile and Social→「サービス・プロバイダ」→「認証サービス・プロバイダ」を選択します。
たとえば、MyTokenProviderのような、新しいサービス・プロバイダを作成します。

3. モバイルSSOアプリケーション用のカスタム・トークン・プロバイダを構成します。
MobileCompositeTokenServiceProviderを実装している場合は、管理コンソールから「システム構成」→Mobile and Social→「モバイル・サービス」→「認証サービス・プロバイダ」を選択します。

たとえば、MobileMyTokenProviderのような、新しいサービス・プロバイダを作成します。

4. 手順2および3で定義しているように、カスタム・トークン・プロバイダを使用する認証サービス・インスタンスを構成します。
管理コンソールから、「システム構成」→Mobile and Social→「モバイル・サービス」→「サービス・ドメイン」→サービス・ドメインの選択→「認証サービス」を選択します。

たとえば、MyTokenServiceのような、新しいインスタンスを作成します。

5. 手順2および3で定義しているように、カスタム・モバイル・トークン・プロバイダを使用している認証サービス・インスタンスを定義します。
管理コンソールから、「システム構成」→Mobile and Social→「モバイル・サービス」→「サービス・ドメイン」→サービス・ドメインの選択→「認証サービス」を選択します。

たとえば、MobileMyAuthnServiceのような、新しいインスタンスを作成します。

これでカスタム認証サービス・プロバイダがデプロイメントで使用できるようになりました。

11.2 インターネット・アイデンティティ・サービス用の新しいアイデンティティ・サービス・プロバイダの作成

Mobile and Socialでは、Google、LinkedIn、TwitterおよびYahooのアイデンティティ・プロバイダをサポートしています。その他のOpenIDおよびOAuthサービス・プロバイダを追加するには、IdentityProvider Javaインタフェースを実装し、システム管理コンソールを使用してMobile and Socialデプロイメントにプロバイダを追加します。

この項の項目は次のとおりです。

- カスタム・アイデンティティ・サービス・プロバイダの開発

- カスタム・アイデンティティ・サービス・プロバイダの構築

- カスタム・アイデンティティ・サービス・プロバイダのデプロイ

11.2.1 カスタム・アイデンティティ・サービス・プロバイダの開発

このインタフェースには、次の3つのメソッドがあります。

- authenticateUser(): このメソッドは、アイデンティティ・プロバイダを使用してユーザーを認証するプロセスを開始します。認証後、アイデンティティ・プロバイダは、認証リクエストで送信された戻りURLを使用して、Mobile and Socialサーバーにアイデンティティ・プロファイル情報を戻します。
次の2つの戻りURLオプションがあります。

- https://host.example.com:port/oic_rp/popup: アイデンティティ・プロバイダ・ログイン・ページがポップアップ・ウィンドウで開かれる場合はこのオプションを使用します。

- https://host.example.com:port/oic_rp /return: アイデンティティ・プロバイダ・ログイン・ページがアプリケーションのログイン・ページと同じブラウザ・ウィンドウで開かれる場合は、このオプションを使用します。

- getAccessToken(): アイデンティティ・プロバイダがOAuthプロトコルを使用する場合、Mobile and Socialサーバーはこのメソッドを使用して、アクセス・トークンを取得する必要があります。Mobile and Socialサーバーはアクセス・トークンを使用して、ユーザー・トークンを取得します。

- getUserProfile(): このメソッドは、アイデンティティ・プロバイダからユーザー・プロファイルを取得します。

11.2.2 カスタム・アイデンティティ・サービス・プロバイダの構築

カスタム・アイデンティティ・サービス・プロバイダは次のように構築します。

11.2.2.1 カスタム・アイデンティティ・サービス・プロバイダを構築するには

1. oic_rp.jarファイル、oic_common.jarファイルおよびj2ee.jarファイルを収集します。

2. クラスを構築します。
たとえば、アイデンティティ・プロバイダ名がXYZである場合:

javac -cp ./j2ee.jar:./oic_rp.jar:./oic_common.jar com/xyz/custom/idp/XYZImpl.java

カスタム・コードによって必要に応じて、JARファイルを追加します。

3. JARファイルを構築します。
次に例を示します。

jar cvf xyz-idp.jar com/xyz/custom/idp/XYZImpl.class

11.2.3 カスタム・アイデンティティ・サービス・プロバイダのデプロイ

カスタム認証サービス・プロバイダは次のようにデプロイします。次の手順は、XYZProviderを例として使用します。

11.2.3.1 カスタム・アイデンティティ・サービス・プロバイダをデプロイするには

1. xyz-idp.jarをデプロイメントのfmwconfig/oic/pluginsディレクトリにコピーします。
ここでJARファイルは、Mobile and Socialによって動的に選択されます。カスタム・サービス・プロバイダに追加のJARファイルが必要な場合、これらのファイルは、コンテナのCLASSPATHで使用できるようにする必要があります。

2. 管理コンソールからカスタム・アイデンティティ・プロバイダを構成するには、「システム構成」→Mobile and Social→「インターネット・アイデンティティ・サービス」を選択します。
「インターネット・アイデンティティ・プロバイダ」セクションで、「作成」をクリックし、たとえばXYZProviderのような、新しいインターネット・アイデンティティ・プロバイダを追加します。

- 「プロトコル属性」の下で必要な属性を定義します。これらの属性は、カスタム実装で使用されます。

- 「返されたユーザー属性」セクションでユーザー属性を定義します。これらの属性は、getUserProfile()メソッド・ロジックの一部としてカスタム実装で使用されます。

または、管理コンソールを使用するかわりに、次のXMLをoic_rp.xmlに追加します。

<InternetIdentityProvider description="XYZ OAuth Provider" name="XYZProvider">
<icon>XYZ.gif</icon>
<protocolType>OAuth</protocolType>
<userAttribute>
<name>id</name>
<value>id</value>
</userAttribute>
<userAttribute>
<name>first_name</name>
<value>first_name</value>
</userAttribute>
<userAttribute>
<name>last_name</name>
<value>last_name</value>
</userAttribute>
<userAttribute>
<name>email</name>
<value>email</value>
</userAttribute>
<userAttribute>
<name>location</name>
<value>location</value>
</userAttribute>
<userAttribute>
<name>birthday</name>
<value>birthday</value>
</userAttribute>
<userAttribute>
<name>gender</name>
<value>gender</value>
</userAttribute>
<userAttribute>
<name>language</name>
<value>language</value>
</userAttribute>
<userAttribute>
<name>country</name>
<value>country</value>
</userAttribute>
<userAttribute>
<name>profile_image_url</name>
<value>profile_image_url</value>
</userAttribute>
<providerImplClass>com.xyz.custom.idp.XYZImpl</providerImplClass>
</InternetIdentityProvider>

3. カスタム・アイデンティティ・プロバイダを使用するアプリケーション・プロファイルを作成または編集します。
詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』のアプリケーション・プロファイルの編集または作成に関する項を参照してください。

4. 「アプリケーション・ユーザー属性とインターネット・アイデンティティ・プロバイダ・ユーザー属性のマッピング」セクションで、XYZProviderを選択し、ユーザー属性マッピングを定義します。

12 cURLによるMobile and SocialのRESTコールの送信

この章では、cURLを使用して、Mobile and SocialクライアントがMobile and Socialサーバーに送信するRESTコールについて説明します。この章の内容は次のとおりです。

- リクエストおよびレスポンス・ヘッダーの属性名リファレンス

- Mobile and Social RESTセキュリティ・フィルタ・リファレンス

- モバイル・サービスRESTリファレンス: 認証および許可

- モバイル・サービスRESTリファレンス: モバイル・シングル・サインオン・トークンのコマンド

- モバイル・サービスRESTリファレンス: ユーザー・プロファイル・サービスのコマンド

- 実例

cURLの使用に関する注意

cURLは、http://curl.haxx.se/のcURL Webサイトからダウンロードできるフリー・ソフトウェアです。

サーバーへのRESTコールの送信にcURLを使用することにより、Mobile and SocialクライアントとMobile and Socialサーバーとのやり取りについての理解を深めることができます。また、これを便利なトラブルシューティング・ツールとしても使用できます。

注意:

Windowsでは、一重引用符( ' )を含むcURLコマンドは失敗します。可能であれば、一重引用符のかわりに二重引用符( " )を使用してください。

コマンドに一重引用符と二重引用符の両方が必要な場合、二重引用符を円記号でエスケープし(例: \" )、一重引用符を二重引用符に置き換えます。

注意:

このガイドにおいて、cURLのコマンドおよびサーバー・レスポンスでの改行は、単に表示上の都合により使用されています。

リクエストおよびレスポンス・ヘッダーの属性名リファレンス

この項では、Mobile and SocialのRESTサービスで使用するために予約されているリクエストおよびレスポンスの属性名について説明します。これらの属性は、説明のとおり、問合せパラメータ、HTTPヘッダーまたはそのヘッダーのJSON本文部分に含めることができます。

注意:

すべての属性の名前および値では、大/小文字が区別されます。

この項で説明する属性名は次のとおりです。

- X-IDAAS-REST-VERSION

- X-IDAAS-SERVICEDOMAIN

- X-IDAAS-REST-AUTHORIZATION

- AUTHORIZATION

- X-Idaas-Rest-Subject-Type

- X-Idaas-Rest-Subject-Value

- X-Idaas-Rest-Subject

- X-Idaas-Rest-Subject-Username

- X-Idaas-Rest-Subject-Password

- X-Idaas-Rest-New-Token-Type-To-Create

- X-Idaas-Rest-Application-Context

- X-Idaas-Rest-Application-Resource

- X-Idaas-Rest-User-Principal

- X-Idaas-Rest-Provider-Type

X-IDAAS-REST-VERSION

この属性を使用して、クライアント・アプリケーションと互換性のある特定のバージョンのSDKを指定します。SDKバージョンを指定しない場合、Mobile and Socialサーバーではデフォルトで最新のSDKバージョンが使用されます。

この属性の使用場所

- HTTPヘッダー

- 問合せパラメータ

属性タイプ

- リクエスト

- レスポンス

cURLサンプル・コマンド

-H "X-IDAAS-REST-VERSION:v1"

サンプル・リクエスト

curl -i
-H "Content-Type: application/json http://host.us.example.com:14100/oic_rest
/rest/jwtauthentication/authenticate-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"profileid1","X-Idaas-Rest-Subject-Password":"secret12",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTTOKEN"}'-H "X-IDAAS-REST-VERSION:v1"

サンプル・レスポンス

HTTP/1.1 200 OK Date: Tue, 05 Jun 2012 11:23:19 GMT Transfer-Encoding: chunked
Content-Type: application/json
X-IDAAS-REST-VERSION: v1
Set-Cookie: JSESSIONID=5Z4sPNsHVmrplgs8HNDbQGxddC7TJQS7s4QspYvMpcMJJLC2nGx5!1574
236250;
path=/;
HttpOnly
X-ORACLE-DMS-ECID:a393487d2600b00c:-7abb0b83:137b52ee014:-8000-00000000000026aa
X-Powered-By: Servlet/2.5 JSP/2.1

説明

属性名は、v1など、そのプロトコル・バージョンの文字列表現にする必要があります。

X-IDAAS-SERVICEDOMAIN

サービス・ドメインの値の指定に使用します。サービス・ドメインの値が指定されていない場合、Defaultサービス・ドメインが使用されます。

この属性の使用場所

- HTTPヘッダー

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

-H "X-IDAAS-SERVICEDOMAIN: Default"

サンプル・リクエスト

curl -i
-H "Content-Type: application/json"--request POST
http://host.us.example.com:14100/oic_rest/rest/jwtauthentication/authenticate
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"profileid1",
"X-Idaas-Rest-Subject-Password":"secret12",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTTOKEN"}'-H "X-IDAAS-REST-VERSION:v1"
-H "X-IDAAS-SERVICEDOMAIN: Default"

説明

属性名は、MyMobileServiceDomainなど、そのターゲット・サービス・ドメインの文字列表現にする必要があります。

X-IDAAS-REST-AUTHORIZATION

HTTPリクエスト・ヘッダー内でアプリケーションの資格証明の指定に使用します。

次の書式を使用します。

-H "X-IDAAS-REST-AUTHORIZATION: <AuthenticationScheme-Name> <Credential Value>"

ここで、AuthenticationScheme-Nameは次のいずれかです。

- HTTP Basic

- UIDPassword

- Token

この属性の使用場所

- HTTPヘッダー

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

-H "X-IDAAS-REST-AUTHORIZATION: Token eyJhbG56I4OTg5OTk3M...fW1VGmunfzqZ-bG4rM"

-H "X-IDAAS-REST-AUTHORIZATION: Basic fn49xkOVXunF%2B5zMQUiGUlwTXPYiKw"

-H "X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred=\"Tp8aUEeptClBz6h9cH8F%2Fwk976\""

サンプル・リクエスト

curl -i -H "Content-Type: application/json" --request POST
http://host.us.example.com:14100/oic_rest/rest/jwtauthentication/authenticate
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"sampleuser",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN"}'-H "X-IDAAS-REST-VERSION:v1"
-H "X-IDAAS-SERVICEDOMAIN: Default"-H "X-IDAAS-REST-AUTHORIZATION: Token eyJhbGciOiJSUzUxMiIsInR5cSldUQXV0aGVudGljYXR
CI6IkpXVCIsImtpZCI6Im9yYWtleSJ9.eyJleHAiOjEzMzg4OTg5OTk3MzIsIzZXJ2ZXIxIiwiaXNzIjoi
joiY2I2MWU5YTQtZjJmYS00ZDQzLWFlOTYtZWQ5MjZlMGQ2NDZlIiwib3JhY2xlLm9pYy50b2tlbi50eXB
lIjoiQ0xJRU5UVE9LRU4iLCJpYXQiOjEzMzg4OTUzOTk3MzIsIm9yYWNsZS5vaWMudG9rZW4udXNlcl9kb
iI6InVpZD1wcm9maWxlaWQxLG91PXBlb3BsZSxvdT1teXJlYWxtLGRjPWJhc2VfZG9tYWsZSxvdT1teXJl
YWxtLGRjPWJhc2VfZG9tYWluIn0.kN17W0N3GEmdccm7GoUOT4iP23yWb6LloleOJ0grZkeiijXE-t8Kfy
N6Jq1m8EKzdYgiKFwdb-SO9MpOVMyPgxSRER9mn_3kkcKNagl7yIgu0EJUOS3Hudy2Suv0Th5b6fDgXLIY
LkBA0cC1WlP5RgW1VGmuBX7RnfzqZ-bG4rMiLCJwcm4iOiJwcm9maWxlaWQxIiwianRpI"

説明

サービス・ドメイン構成のサービスの保護タブのユーザー・プロファイル・サービスまたは認可サービスでセキュアなアプリケーションオプションを選択する場合、クライアント・アプリケーションは、X-IDAAS-REST-AUTHORIZATIONヘッダーを使用してセキュリティ資格証明を送信する必要があります。サーバーは、3つの有効なセキュリティ・スキーム(HTTP Basic、UIDPasswordまたはトークン)のいずれかを使用して送信された資格証明を受け取ります。

AUTHORIZATION

HTTPリクエスト・ヘッダー内でユーザーの資格証明の指定に使用します。AUTHORIZATIONヘッダーは、JWTAuthenticationまたはOAMAuthenticationのいずれかのトークン形式を使用していてユーザー・トークンが必要な場合に使用します。ユーザー・トークンの値は、認証サービス・プロバイダによって発行されたユーザー・トークンとする必要があります。

次の書式を使用します。

-H "AUTHORIZATION:<User Token Value>"

この属性の使用場所

- HTTPヘッダー

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

-H "AUTHORIZATION:eyJhbGciOiJSUzUxMiIsInR5cmtpZCI6Im9g5OTk3M...sW1VGmunfzqZ-bG4rM"

サンプル・リクエスト

curl -i --request GET
"http://host.us.example.com:14100/oic_rest/rest/userprofile/people/weblogic/"
-H
"AUTHORIZATION:eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6Im9yYWtleSJ9.eyJleHi
EzMzg4OTk3MTMxMzcsImF1ZCI6Im9hbV9zZXJ2ZXIxIiwiaXNzIjoiSldUQXV0aGVudGljYXRpb24iLCJw
cm4iOiJ3ZWJsb2dpYyIsImp0aSI6IjNlMjdiZjc4LTg3NDQtNDFkMS05MzlmLTlkZGY0N2VkNGFlNyIsIm
YWNsZS5vaWMudG9rZW4udHlwZSI6IlVTRVJUT0tFTiIsImlhdCI6MTMzODg5NjExMzEzNywib3JhY2xlLm
9pYy50b2tlbi51c2VyX2RuIjoidWlkPXdlYmxvZ2ljLG91PXBlb3BsZSxvdT1teXJlYWxtLGRjPWJhc2V6
ZG9tYWluIn0.hHmAa5Syw3AcqRPwIq_XLx6DcMzCBzvDXGFYvwAf9nqVgxgvLTJJfxZzofS5Ut272b0dFG
sv3qakeDm2NTgg6fR2YKH5BxAHnEmq0IAmhLuyWdux_rMZNB-wP8h5JD26UQf_nnBBWApvgULeM2mWQEzY
RVDMpN9K7pycNrsGKOj8U"

説明

サービス・ドメイン構成のサービスの保護タブのユーザー・プロファイル・サービスまたは認可サービスでセキュアなユーザーオプションを選択する場合、クライアント・アプリケーションは、AUTHORIZATIONヘッダーを使用してセキュリティ資格証明を送信する必要があります。サーバーはトークンのみを受け取ります。

X-Idaas-Rest-Subject-Type

サブジェクトのタイプ(USERCREDENTIAL、UID、UIDASSERTIONまたはTOKEN)

この属性の使用場所

- 問合せパラメータ

- JSON本文

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

-d '{"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL"}'

-d '{"X-Idaas-Rest-Subject-Type":"UID"}'
-d '{"X-Idaas-Rest-Subject-Type":"UIDASSERTION"}'

サンプル・リクエスト1

curl -H "Content-Type: application/json" --request GET
"http://host            .us.example.com:14100/oic_rest/rest/jwtauthentication/validate?
X-Idaas-Rest-Subject-Value=eyJhbGciOiJSUzU...I_A0PM&
X-Idaas-Rest-Subject-Type=TOKEN"

サンプル・リクエスト2

curl -i -H "Content-Type: application/json" --request POST
http://host             .us.example.com:14100/oic_rest/rest/jwtauthentication/authenticate
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"profileid1",
"X-Idaas-Rest-Subject-Password":"secret12345",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTTOKEN"}'

説明

属性値は次のいずれかにする必要があります。

- USERCREDENTIAL

- UID

- UIDASSERTION

- TOKEN

X-Idaas-Rest-Subject-Value

サブジェクトの文字列値。この属性は、X-Idaas-Rest-Subject-Typeの値がTOKEN、UIDまたはUIDASSERTIONの場合に追加します。

この属性の使用場所

- 問合せパラメータ

- JSON本文

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

サンプル・リクエスト1

curl -H "Content-Type: application/json" --request GET
"http://host.example.com:14100/oic_rest/rest/jwtauthentication/validate? X-Idaas-Rest-Subject-Value~=eyJhbGciOiJSUzU...PM&
X-Idaas-Rest-Subject-Type~=TOKEN"

サンプル・リクエスト2

curl -H "Content-Type: application/json" --request POST
http://localhost:18001/oic_rest/rest/jwtauthentication/access
-d '{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"vTBI8jN...%3D",
"X-Idaas-Rest-Application-Context":"75sSbBZZKJiUOAWikZxsKA==",
"X-Idaas-Rest-Application-Resource":"http:/host.example.com:7779/index.html",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN"}'

X-Idaas-Rest-Subject

サブジェクト・タイプがTOKENの場合、ヘッダーにサブジェクト・タイプと文字列値の両方を指定するために使用します。

この属性の使用場所

- HTTPヘッダー

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

サンプル・リクエスト

curl -H "Content-Type: application/json" --request GET
http://host.example.com:14100/oic_rest/rest/jwtauthentication/validate
-H
"X-Idaas-Rest-Subject: TOKEN eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6Im9yYWtl
eSJ9.eyJleHAiOjEzMzg5MDEzMzUyMjUsImF1ZCI6Im9hbV9zZXJ2ZXIxIiwiaXNzIjoiSldUQXV0aGVu
dGljYXRpb24iLCJwcm4iOiJ3ZWJsb2dpYyIsImp0aSI6ImUzNDZiYjJiLTQyZmYtNGRjMC1hOTZkLWYyY
2U5MjM0NTM0YSIsIm9yYWNsZS5vaWMudG9rZW4udHlwZSI6IlVTRVJUT0tFTiIsImlhdCI6MTMzODg5Nz
czNTIyNSwib3JhY2xlLm9pYy50b2tlbi51c2VyX2RuIjoidWlkPXdlYmxvZ2ljLG91PXBlb3BsZSxvdT1
teXJlYWxtLGRjPWJhc2VfZG9tYWluIn0.GZ3-X4NRGdQ99MB63B5MmPuyE5M2kFwqHMQ97AXwBjYElMep
ZdziTEgDeYLKJuVB83plSGwpfQEDdzlxR3Sy7tRXbfV3EdK1lpbUyUyEEIwAfuu4xtbNERKrPw3pJoPtU
q0TCd0BV2sRdyy1zuSBdU2J6zUjG8rW-PYDWI_A0PM"

X-Idaas-Rest-Subject-Username

X-Idaas-Rest-Subject-Typeの値がUSERCREDENTIALの場合のみ、文字列としてユーザー名を指定するために使用します。

この属性の使用場所

- JSON本文

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

サンプル・リクエスト

curl -i -H "Content-Type: application/json" --request POST
http://host.example.com:14100/oic_rest/rest/jwtauthentication/authenticate
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"sampleuser",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN"}'

X-Idaas-Rest-Subject-Password

X-Idaas-Rest-Subject-Typeの値がUSERCREDENTIALの場合のみ、文字列としてパスワードを指定するために使用します。

この属性の使用場所

- JSON本文

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

サンプル・リクエスト

curl -i -H "Content-Type: application/json" --request POST
http://host.example.com:14100/oic_rest/rest/jwtauthentication/authenticate
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"sampleuser",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN"}'

X-Idaas-Rest-New-Token-Type-To-Create

作成するトークン・タイプを指定するために使用します。1つのリクエストで複数のトークン・タイプを指定できます。

この属性の使用場所

- JSON本文

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

サンプル・リクエスト

curl -i -H "Content-Type: application/json" --request POST
http://host.example.com:14100/oic_rest/rest/jwtauthentication/authenticate
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"sampleuser",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN"}'

説明

属性値は次のいずれかにする必要があります。

- CLIENTREGHANDLE

- CLIENTTOKEN

- USERTOKEN

- USERTOKEN::OAMMT

- ACCESSTOKEN

X-Idaas-Rest-Application-Context

アクセス・トークンが必要なアプリケーション・コンテキストを指定するために使用します。指定する値は文字列とする必要があります。

この属性の使用場所

- JSON本文

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

サンプル・リクエスト1

curl -H "Content-Type: application/json"
--request POST http://localhost:18001/oic_rest/rest/jwtauthentication/access
-d '{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"vTBI8jN8eYIsfAp%2BZqe...GkiaHv7TjAGZ5XFSQk5A%3D%3D",
"X-Idaas-Rest-Application-Context":"75sSbBZZKJiUOAWikZxsKA==",
"X-Idaas-Rest-Application-Resource":"http://somehost.example.com:7779/index.html",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN"}'

X-Idaas-Rest-Application-Resource

アクセス・トークンが必要なターゲット・リソースを指定するために使用します。指定する値は文字列とする必要があります。

この属性の使用場所

- JSON本文

属性タイプ

- リクエストのみ

cURLサンプル・コマンド

サンプル・リクエスト1

curl -H "Content-Type: application/json"
--request POST http://localhost:18001/oic_rest/rest/jwtauthentication/access-d '{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"vTBI8jN8eYIsfAp%2BZqe...GkiaHv7TjAGZ5XFSQk5A%3D%3D",
"X-Idaas-Rest-Application-Context":"75sSbBZZKJiUOAWikZxsKA==",
"X-Idaas-Rest-Application-Resource":"http://somehost.example.com:7779/index.html",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN"}'

X-Idaas-Rest-User-Principal

プリンシパル・ユーザーを返すために使用します。

この属性の使用場所

- JSON本文

属性タイプ

- レスポンスのみ

cURLサンプル・コマンド

サンプル・レスポンス

HTTP/1.1 200 OK Date: Tue, 05 Jun 2012 11:35:13 GMT
Transfer-Encoding: Content-Type: application/json X-IDAAS-REST-VERSION: v1
Set-Cookie: JSESSIONID=
TCjjPNnRvL6fvhJpMSjLhHYrFyMKqwcFxTNL1RQzyvkSJ7G2TLj4!1574236250;
path=/; HttpOnly X-ORACLE-DMS-ECID: a393487d2600b00c:-7abb0b83:137b52ee014:
-8000-00000000000026f5 X-Powered-By: Servlet/2.5 JSP/2.1
{
"X-Idaas-Rest-Token-Value":"eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6Im9yYWtle
SJ9.eyJleHAiOjEzMzg4OTk3MTMxMzcsImF1ZCI6Im9hbV9zZXJ2ZXIxIiwiaXNzIjoiSldUQXV0aGVud
GljYXRpb24iLCJwcm4iOiJ3ZWJsb2dpYyIsImp0aSI6IjNlMjdiZjc4LTg3NDQtNDFkMS05MzlmLTlkZG
d0N2VkNGFlNyIsIm9yYWNsZS5vaWMudG9rZW4udHlwZSI6IlVTRVJUT0tFTiIsImlhdCI6MTMzODg5NjE
xMzEzNywib3JhY2xlLm9pYy50b2tlbi51c2VyX2RuIjoidWlkPXdlYmxvZ2ljLG91PXBlb3BsZSxvdT1t
eXJlYWxtLGRjPWJhc2VfZG9tYWluIn0.hHmAa5Syw3AcqRPwIqXLx6DcMzCBzvDXGFYvwAf9nqVgxgvLT
JfxZzofS5Ut272b0dFGsv3qakeDm2NTgg6fR2YKH5BxAHnEmq0IAmhLuyWdux_rMZNB-wP8h5JD26UQf
nnBBWApvgULeM2mWQEzYRVDMpN9K7pycNrsGK8U",
"X-Idaas-Rest-User-Principal":"jdoe",
"X-Idaas-Rest-Provider-Type":"JWT",
"X-Idaas-Rest-Token-Type":"USERTOKEN"
}

X-Idaas-Rest-Provider-Type

トークン・プロバイダのタイプを返すために使用します。有効な値は、OAM_10G、OAM_11GおよびJWTです。

この属性の使用場所

- JSON本文

属性タイプ

- レスポンス

cURLサンプル・コマンド

サンプル・レスポンス

HTTP/1.1 200 OK Date: Tue, 05 Jun 2012 11:35:13 GMT
Transfer-Encoding: chunked Content-Type: application/json X-IDAAS-REST-VERSION: v1
Set-Cookie:JSESSIONID=TCjjPNnRvL6fvhJpMSjLhHYrFyMKqwcFxTNL1RQzyvkSJ7G2TLj4!157423;
path=/; HttpOnly X-ORACLE-DMS-ECID:
a393487d2600b00c:-7abb0b83:137b52ee014:-8000-00000000000026f5
X-Powered-By: Servlet/2.5 JSP/2.1
{
"X-Idaas-Rest-Token-Value":"eyJhbGciOiJSUzUxMiIsInR
5cCI6IkpXVCIsImtpZCI6Im9yYWtleSJ9.eyJleHAiOjEzMzg4OTk3MTMxMzcsImF1ZCI6Im9hbV9
zZXJ2ZXIxIiwiaXNzIjoiSldUQXV0aGVudGljYXRpb24iLCJwcm4iOiJ3ZWJsb2dpYyIsImp0aSI6IjN
lMjdiZjc4LTg3NDQtNDFkMS05MzlmLTlkZGY0N2VkNGFlNyIsIm9yYWNsZS5vaWMudG9rZW4
udHlwZSI6IlVTRVJUT0tFTiIsImlhdCI6MTMzODg5NjExMzEzNywib3JhY2xlLm9pYy50b2tlbi51c2
VyX2RuIjoidWlkPXdlYmxvZ2ljLG91PXBlb3BsZSxvdT1teXJlYWxtLGRjPWJhc2VfZG9tYWluIn0.h
HmAa5Syw3AcqRPwIq_XLx6DcMzCBzvDXGFYvwAf9nqVgxgvLTJJfxZzofS5Ut272b0dFGsv3q
akeDm2NTgg6fR2YKH5BxAHnEmq0IAmhLuyWdux_rMZNB-wP8h5JD26UQf_nnBBWApvgULeM
2mWQEzYRVDMpN9K7pycNrsGK8U",
"X-Idaas-Rest-User-Principal":"weblogic",
"X-Idaas-Rest-Provider-Type":"JWT",
"X-Idaas-Rest-Token-Type":"USERTOKEN"
}

Mobile and Social RESTセキュリティ・フィルタ・リファレンス

この項の認可スキームは、Mobile and SocialのRESTサービスの保護に使用されます。

次のコールについて説明します。

- UIDPASSWORDによる認可

- HTTP Basicによる認可

- Access Managerトークンによる認可

UIDPASSWORDによる認可

UIDPASSWORD認証に必要なRESTコールの送信方法を示します。

cURLコマンド

curl --request GET
"localhost:18001/idaas_rest/rest/authorizationservice3/authorization?
resource=http://is-x86-05.us.example.com:7779/index.html&
action=GET&X-Idaas-Rest-Subject-Value=
ZNsJcMMM3ow83Zr5D8KqCPnhBGmui4RnBvUXJ5dqC7OfwZIv6FDcYWwfPuHupxN%2B
fs5qN0I6AWIZBX%2F2KQNNQ5bPDN1XqeE8y7OPPoy4znteEfCaRHb7UA1ia1ox%2BW8
5LbknXCLaZ5q%2FN4I0IcXP%2B13FGX9r9LROQ3OZZVNMLhfx3KabZcIVmSHBkK%2F
ARGYEJQv6RO%2FPCMN2YYTJgWxGr20rWeG8NLbzgN%2FPyADxxlPLvkxH2YCVHHH
7bLBfOp3p83IbJ%2FC%2Bm9sCd4YjlSlhsMUXKtvZ1LnJME4UymuR5tXuw2B0Yr25OHxU
bMreIGgRYZXFonmjhAovKhXqIgzpIg%3D%3D&
X-Idaas-Rest-Subject-Type=TOKEN"
-H "X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred=\"
Tp8aUEeptClBz6A6h9cH8F%2FwcZJvLok976\""
-H "Authorization: gdX4z0leySgt0DiPeItsQfBweYZIfZ2dm7fVypNz%2Bf6pbrzF7P4
AvUzPXIzLf2lL0zHuvNI%2B77OsUESM99U6zQjytC%2FgrAD6O2QdSe2VUNGjjw8Di5ev1
gSI0m5a5VQO9rmGNlB1xndnPYoaX0nDpi3eGAyQNw3PUAbEGYglsDMR1js2jsiXKyexryn
8k1coc3EHGqk%2ByqfEXzfzGjwEB4ipnSGg2c4a9BX2BKjKLoOD0PdNVc2nf6f%2F7T2Ck
hA%2BSFowwE%2BEIzvQ7cVbeRYqco2eYCJhs8GS8Haq9T2dnhIAa4tux9MyxVLRNRtDd
q39HDr5hvUI7OpHQHNUMeRcPQ%3D%3D"

予想される出力

{
"Allowed":"true"
}

説明

- リクエストにおいて、サービス・ドメインの値の指定には、X-IDAAS-SERVICEDOMAINヘッダー名を使用します。X-IDAAS-SERVICEDOMAIN名は、問合せパラメータまたはヘッダーとして使用できます。サービス・ドメインの値が指定されていない場合、Defaultサービス・ドメインが使用されます。

HTTP Basicによる認可

HTTP Basic認可に必要なRESTコールの送信方法を示します。

cURLコマンド

curl --request GET
"localhost:18001/idaas_rest/rest/authorizationservice3/authorization?
resource=http://is-x86-05.us.example.com:7779/index.html
&action=GET&
X-Idaas-Rest-Subject-Value=
ZNsJcMMM3ow83Zr5D8KqCPnhBGmui4RnBvUXJ5dqC7OfwZIv6FDcYWwfPuHupxN%2Bfs5
qN0I6AWIZBX%2F2KQNNQ5bPDN1XqeE8y7OPPoy4znteEfCaRHb7UA1ia1ox%2BW85Lbkn
XCLaZ5q%2FN4I0IcXP%2B13FGX9r9LROQ3OZZVNMLhfx3KabZcIVmSHBkK%2FARGYEJ
Qv6RO%2FPCMN2YYTJgWxGr20rWeG8NLbzgN%2FPyADxxlPLvkxH2YCVHHH7bLBfOp3p
83IbJ%2FC%2Bm9sCd4YjlSlhsMUXKtvZ1LnJME4UymuR5tXuw2B0Yr25OHxUbMreIGgRYZ
XFonmjhAovKhXqIgzpIg%3D%3D&
X-Idaas-Rest-Subject-Type=TOKEN"
-H "X-IDAAS-REST-AUTHORIZATION: Basic Tp8aUEeptClBz6A6h9cH8F%2FwcZJvLok976"
-H "Authorization: TOKEN gdX4z0leySgt0DiPeItsQfBweYZIfZ2dm7fVypNz%2Bf6pbrzF7P4A
vUzPXIzLf2lL0zHuvNI%2B77OsUESM99U6zQjytC%2FgrAD6O2QdSe2VUNGjjw8Di5ev1gS
I0m5a5VQO9rmGNlB1xndnPYoaX0nDpi3eGAyQNw3PUAbEGYglsDMR1js2jsiXKyexryn8k1
coc3EHGqk%2ByqfEXzfzGjwEB4ipnSGg2c4a9BX2BKjKLoOD0PdNVc2nf6f%2F7T2CkhA%2B
SFowwE%2BEIzvQ7cVbeRYqco2eYCJhs8GS8Haq9T2dnhIAa4tux9MyxVLRNRtDdq39HDr5hv
UI7OpHQHNUMeRcPQ%3D%3D"

予想される出力

{
"Allowed":"true"
}

説明

- 規定名は、X-IDAAS-CONTRACTの名前の問合せパラメータまたはヘッダーとして指定できます。指定されていない場合、Mobile and Socialはその規定をデフォルトの規定とみなします。

- HTTPBasicは、ここで示すように、クライアント定義に暗号化パスワードのあるクライアントに対して構成する必要があります。

<IdaasClient description="OIC Client 1" name="clientid1">
<authnService>sampletokenservice</authnService>
<param>
<name>userId4BasicAuth</name>
<value>rest_client1</value>
</param>
<param>
<name>sharedSecret4BasicAuth</name>
<value>9Qo9olLIl5gDwESYR0hOgw==</value>
</param>
</IdaasClient>

Access Managerトークンによる認可

Access Manager認可に必要なRESTコールの送信方法を示します。

cURLコマンド

curl --request GET
"localhost:18001/idaas_rest/rest/authorizationservice3/authorization?
resource=http://is-x86-05.us.example.com:7779/index.html
&action=GET&
X-Idaas-Rest-Subject-Value=ZNsJcMMM3ow83Zr5D8KqCPnhBGmui4RnBvUXJ5dqC7OfwZIv6
FDcYWwfPuHupxN%2Bfs5qN0I6AWIZBX%2F2KQNNQ5bPDN1XqeE8y7OPPoy4znteEfCaRHb
7UA1ia1ox%2BW85LbknXCLaZ5q%2FN4I0IcXP%2B13FGX9r9LROQ3OZZVNMLhfx3KabZcIV
mSHBkK%2FARGYEJQv6RO%2FPCMN2YYTJgWxGr20rWeG8NLbzgN%2FPyADxxlPLvkxH2
YCVHHH7bLBfOp3p83IbJ%2FC%2Bm9sCd4YjlSlhsMUXKtvZ1LnJME4UymuR5tXuw2B0Yr25
OHxUbMreIGgRYZXFonmjhAovKhXqIgzpIg%3D%3D
&X-Idaas-Rest-Subject-Type=TOKEN"
-H "X-IDAAS-REST-AUTHORIZATION: TOKEN Tp8aUEeptClBz6A6h9cH8F%2FwcZJvLok976
c5q0SitrrgSCJ5FQk58KMtUg2FCPLbjZbP2%2B3P5zZPiSCeHwNua%2FBHdIDCOnUYOXNg
4uBKA7t7O4jGRfn49xkOVXunF%2B5zMQUiGUlwTXPYiKwooAknkeHs3HIq6s2if%2FHpuPH
curRa%2BdyfjWfYWTpqPeo%2FzyHHzDH1wF8hM6k6YwJ%2FpxD8avuXogP%2Bp5j2tCZ0
aAhonseNMcKvGTRBoV1shGnotK9gt01nDgc2LWA5oidJgxlcaWDw3%2FXZhvgudkLwl0jxEw
0K%2BzffyeZs0gfUkZJBnsm8qh2KP%2BiCPzT7HPVPF%2FyYCg%3D%3D"
-H "Authorization: TOKEN gdX4z0leySgt0DiPeItsQfBweYZIfZ2dm7fVypNz%2Bf6pbrzF7P4AvU
zPXIzLf2lL0zHuvNI%2B77OsUESM99U6zQjytC%2FgrAD6O2QdSe2VUNGjjw8Di5ev1gSI0m5
a5VQO9rmGNlB1xndnPYoaX0nDpi3eGAyQNw3PUAbEGYglsDMR1js2jsiXKyexryn8k1coc3EH
Gqk%2ByqfEXzfzGjwEB4ipnSGg2c4a9BX2BKjKLoOD0PdNVc2nf6f%2F7T2CkhA%2BSFowwE
%2BEIzvQ7cVbeRYqco2eYCJhs8GS8Haq9T2dnhIAa4tux9MyxVLRNRtDdq39HDr5hvUI7OpHQ
HNUMeRcPQ%3D%3D"

予想される出力

{
"Allowed":"true"
}

説明

- 規定名は、X-IDAAS-CONTRACTの名前の問合せパラメータまたはヘッダーとして指定できます。指定されていない場合、Mobile and Socialはその規定をデフォルトの規定とみなします。

- クライアントは、次のように、リクエストのトークンを検証できるトークン・サービス名で定義する必要があります。

<IdaasClient description="OIC Client 5" name="clientid5">
<authnService>oamsdktokenservice</authnService>
</IdaasClient>

モバイル・サービスRESTリファレンス: 認証および許可

この項のcURLコマンドは、Mobile and Socialサーバーからセキュリティ・トークンをリクエストするために使用するRESTコールを示します。一部のRESTコールはPOSTメソッドを使用しますが、その他はGETを使用します。

次のコールについて説明します。

- クライアント・トークンの認証

- ユーザー・トークンの認証

- アクセス・トークンの認証

- (クライアント)トークンの取得または検証

- 許可

クライアント・トークンの認証

クライアント・トークンをリクエストするRESTコールを送信する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json" --request POST
http://localhost:18001/idaas_rest/rest/tokenservice1/tokens
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"client1",
"X-Idaas-Rest-Subject-Password":"secret12",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTTOKEN"}'

予想される出力

{"X-Idaas-Rest-Token-Value":"kubExOtDjCtL5Q0R1QhAgL5zNVmDFYKG1Y0AUe+P9HKvnz4gIDVx
YIMNxxyfJJpmkT5XtYKkDgW295juWEcK7c7LmPBkxE6MytcfvKh4HzWIUGEgS2uKej3PQJG49RpZ6UxAP
ZbGYWj7fpjZoqBhtPiCtyacI0C22bl2/DbbRCVx4341z68j5YiTgOklGC6lIucSorlM7pBI54bxygFZsr
F1DVKxL+RNhrobYsN6I7fFLR4fL+iO/BZcbwM/4SNDuCIC82eOxPI/mTcRraz0cLw9tcLbw7c11MjC2eu
EBSGUjGcNmxpbhiJIt7SIBzJczzNsaBnH+2fKx/VTeVVvGQgGAf19e5b1Drj5QyNhj2I=",
"X-Idaas-Rest-Token-Type":"CLIENTTOKEN",
"X-Idaas-Rest-User-Principal":"client-1",
"X-Idaas-Rest-Provider-Type":"OAM_11G"}

説明

- 規定名は、X-IDAAS-CONTRACTの名前の問合せパラメータまたはヘッダーとして指定できます。指定されていない場合、Mobile and Socialはその規定をデフォルトの規定とみなします。

ユーザー・トークンの認証

ユーザー・トークンをリクエストするRESTコールを送信する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json"
--request POST http://localhost:18001/idaas_rest/rest/tokenservice1/tokens
-d '{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"tester1",
"X-Idaas-Rest-Subject-Password":"secret12",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN"}'

予想される出力

{"X-Idaas-Rest-Token-Value":"adc3bfbExOtDjCtL5Q0R1QhAgL5zNVmDFYKG1Y0AUe+P9HKvnz4g
IDVxYIMNxxyfJJpmkT5XtYKkDgW295juWEcK7c7LmPBkxE6MytcfvKh4HzWIUGEgS2uKej3PQJG49RpZ6
UxAPZbGYWj7fpjZoqBhtPiCtyacI0C22bl2/DbbRCVx4341z68j5YiTgOklGC6lIucSorlM7pBI54bxyg
FZsrF1DVKxL+RNhrobYsN6I7fFLR4fL+iO/BZcbwM/4SNDuCIC82eOxPI/mTcRraz0cLw9tcLbw7c11Mj
C2euEBSGUjGcNmxpbhiJIt7SIBzJczzNsaBnH+2fKx/VTeVVvGQgGAf19e5b1Drj5QyNhj2I=",
"X-Idaas-Rest-Token-Type":"USERTOKEN",
"X-Idaas-Rest-User-Principal":"user-1",
"X-Idaas-Rest-Provider-Type":"OAM_11G"}

説明

- 規定名は、X-IDAAS-CONTRACTの名前の問合せパラメータまたはヘッダーとして指定できます。指定されていない場合、Mobile and Socialはその規定をデフォルトの規定とみなします。

アクセス・トークンの認証

アクセス・トークンをリクエストするRESTコールを送信する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json"
--request POST http://localhost:18001/idaas_rest/rest/tokenservice1/tokens
-d '{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":
"vTBI8jN8eYsmHCUzC4kITJ8xnv0WCcGaETq5OEco9lErOzn13EZIUpyKk4
xucZ9lfbe1b367GuCwPUceldPs8v8W4JtSWJO0IKhBc0o4EaBh4jZlRDcd9y
mNEbh%2BrdaG2rJ0%2BGFGglqe%2BNg0JUBVoKemdoe%2BylkQLj9RT4
yV%2FxOtI7eeXdIOtKD%2BURIIAp%2BZqeDmYHX%2BeTJqOi9dvhUv8b5
AniFPTX3xaO5%2Fovs8250aojYyz465Td0ZmchMyTn%2BSwSPoD81GEiV
MddlapJnred%2BVdStBv%2FHsawIgErLLsCNjlidd90z%2FDVGy31XSOuz3
GkwmE0BoM%2BSiAGZ5XFSQA%3D%3D",
"X-Idaas-Rest-Application-Context":"75sSbBZZKJiUOAWikZxsKA==",
"X-Idaas-Rest-Application-Resource":"http:/wengate123.us.example.com:7779/index.html",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN"}'

予想される出力

{"X-Idaas-Rest-Token-Value":"R1QhAgL5zNVmDFYKG1Y0AUe+P9HKvnz4gIDVxYIMNxxyfJJpmkT5
XtYKkDgW295juWEcK7c7LmPBkxE6MytcfvKh4HzWIUGEgS2uKej3PQJG49RpZ6UxAPZbGYWj7fpjZoqBh
tPiCtyacI0C22bl2/DbbRCVx4341z68j5YiTgOklGC6lIucSorlM7pBI54bxygFZsrF1DVKxL+RNhrobY
sN6I7fFLR4fL+iO/BZcbwM/4SNDuCIC82eOxPI/mTcRraz0cLw9tcLbw7c11MjC2euEBSGUjGcNmxpbhi
JIt7SIBzJczzNsaBnH+2fKx/VTeVVvGQgGAf19e5b1Drj5QyNhj2I=",
"X-Idaas-Rest-Token-Type":"ACCESSTOKEN",
"X-Idaas-Rest-User-Principal":"user-1",
"X-Idaas-Rest-Provider-Type":"OAM_11G"}

説明

- 規定名は、X-IDAAS-CONTRACTの名前の問合せパラメータまたはヘッダーとして指定できます。指定されていない場合、Mobile and Socialはその規定をデフォルトの規定とみなします。

(クライアント)トークンの取得または検証

クライアント・トークンをリクエスト(取得)するために必要なRESTコールを送信する方法を示します。

cURLコマンド

curl --request GET http://localhost:18001/idaas_rest/
rest/mobilesecret1/tokens/info -H "X-Idaas-Rest-Subject: TOKEN someTokenValue"

予想される出力

{"X-Idaas-Rest-Token-Value":"QA8wjxWGSf3VMggfxFFYW4Yrre0DuG7hOagET4yfF3PX
bbUUsgh7uJUOEX5aZAQPsrV90J20gtALfhiUI32gbxooeqppGnQSLnk0ehpN4%2B6%2BCgR2nOMrYzoLi
U7%2FvrnoG7894eUfxHwmvZESQw4w4ez6L%2BOcaHF2tc05F4zkqi6%2BveSL4uFdiaMh9pJ2k%2BXF%2
FWn2Q8IfOWBdk2IzWeFhwi35CzMLJrNiAST%2BdMWhteIKcNEFbvS1WFaYR8Fjzx%2FpuU3%2FdTaG2gX
xDJxE%2BpI2bpanks4fdZwaFmkLCraUfJFdtiGgOk2SIVIwi4UYCBAbM9XZJ5nyjtmxpqEESKJSGQ%3D%
3D",
"X-Idaas-Rest-Token-Type":"USERTOKEN",
"X-Idaas-Rest-User-Principal":"testuser",
"X-Idaas-Rest-Provider-Type":"JWT"
}

説明

- 規定名は、X-IDAAS-CONTRACTの名前の問合せパラメータまたはヘッダーとして指定できます。指定されていない場合、Mobile and Socialはその規定をデフォルトの規定とみなします。

認可

クライアント・トークンをリクエストするために必要なRESTコールを送信する方法を示します。

cURLコマンド

curl --request GET "localhost:18001/idaas_rest/
rest/authorizationservice1/authorization?
resource=http://webgate123.us.example.com:7779/index.html&
action=GET&X-Idaas-Rest-Subject-Value=
ZNsJcMMM3ow83Zr5D8KqCPnhBGmui4RnBvUXJ5dqC7OfwZIv6FDcYWwf
PuHupxN%2Bfs5qN0I6AWIZBX%2F2KQNNQ5bPDN1XqeE8y7OPPoy4znte
EfCaRHb7UA1ia1ox%2BW85LbknXCLaZ5q%2FN4I0IcXP%2B13FGX9r9LR
OQ3OZZVNMLhfx3KabZcIVmSHBkK%2FARGYEJQv6RO%2FPCMN2YYTJ
gWxGr20rWeG8NLbzgN%2FPyADxxlPLvkxH2YCVHHH7bLBfOp3p83IbJ%2
FC%2Bm9sCd4YjlSlhsMUXKtvZ1LnJME4UymuR5tXuw2B0Yr25OHxUbMreI
GgRYZXFonmjhAovKhXqIgzpIg%3D%3D&
X-Idaas-Rest-Subject-Type=TOKEN"

予想される出力

{
"Allowed":"true"
}

説明

- 規定名は、X-IDAAS-CONTRACTの名前の問合せパラメータまたはヘッダーとして指定できます。指定されていない場合、Mobile and Socialはその規定をデフォルトの規定とみなします。

モバイル・サービスRESTリファレンス: モバイル・シングル・サインオン・トークンのコマンド

この項のcURLコマンドは、クライアント、ユーザーおよびアクセス・トークンをリクエストし、クライアント登録ハンドルを作成するために、モバイル・シングル・サインオン・エージェントがMobile and Socialサーバーに送信するRESTコールを示します。

次のコールについて説明します。

- モバイル・シングル・サインオン・エージェント・アプリケーションのためのクライアント登録ハンドルの作成

- モバイル・シングル・サインオン・クライアント・アプリケーションのためのクライアント登録ハンドルの作成(ユーザー名のシナリオ)

- モバイル・シングル・サインオン・クライアント・アプリケーションのためのクライアント登録ハンドルの作成(ユーザー・トークンのシナリオ)

- ユーザー・トークンのリクエストの作成

- アクセス・トークンのリクエストの作成

- シングル・サインオン・エージェントによる独自に使用するアクセス・トークンを作成するためのリクエスト

- クライアント登録ハンドルの検証

モバイル・シングル・サインオン・エージェント・アプリケーションのためのクライアント登録ハンドルの作成

ユーザー名およびパスワードに基づいて、モバイル・シングル・サインオン(SSO)エージェント・アプリケーションのためのクライアント登録ハンドルを作成する方法を示します。この例で、モバイル・シングル・サインオン・エージェント・アプリケーションの名前はMobileAgent1です。

cURLコマンド

curl -H "Content-Type: application/json" --request POST
http://localhost:18001/idaas_rest/rest/mobilejwtauthentication/register -d
'{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL", "X-Idaas-Rest-Subject-Username":"theUserName",
"X-Idaas-Rest-Subject-Password":"thePassword",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTREGHANDLE",
"deviceProfile" : { ... },
"clientId": "MobileAgent1" }'

予想される出力

{"X-Idaas-Rest-Token-Value":"eyJ0b2tl...",
"X-Idaas-Rest-Token-Type":"CLIENTREGHANDLE",
handles : {
"oaam.session" : { ... } ,
"oaam.device" : { ... }
}
}

説明

- CLIENTREGHANDLEの値は、表示上の都合で短縮されています。

- ユーザー名とパスワード(この例ではtheUserNameとthePassword)は、そのデバイスに対して認可された認証済ユーザーを表すセキュリティ資格証明です。

モバイル・シングル・サインオン・クライアント・アプリケーションのためのクライアント登録ハンドルの作成(ユーザー名のシナリオ)

この例は、モバイル・シングル・サインオン・エージェントがユーザー名とパスワードを使用してどのようにモバイル・ビジネス・アプリケーション(クライアント・アプリケーション)のクライアント登録ハンドルを作成するのかを示しています。この例で、リクエストはMobileExpenseReport1というモバイル・ビジネス・アプリケーションで生成されています。

cURLコマンド

curl -H "Content-Type: application/json" --request POST
http://localhost:18001/idaas_rest/rest/mobilejwtauthentication/register -H
"X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD ..." -d
'{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"theUserName",
"X-Idaas-Rest-Subject-Password":"thePassword",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTREGHANDLE",
"deviceProfile" : { ... },
handles : {
"oaam.session" : "...",
"oaam.device" : "..." },
"clientId": "MobileExpenseReport1" } '

予想される出力

{"X-Idaas-Rest-Token-Value":"ey...",
"X-Idaas-Rest-Token-Type":"CLIENTREGHANDLE",
handles : {
"oaam.session" : { ... } ,
"oaam.device" : { ... }
}
}

説明

- CLIENTREGHANDLEおよびその他のトークンの値は、表示上の都合で短縮されています。

- clientIdがモバイルSSOエージェントではない場合(MobileExpenseReport1など)、コール元は、モバイル・エージェントに対して以前取得したクライアント登録ハンドルを含むヘッダーを、HTTPリクエストに追加する必要があります(例: -H "X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD....")。

モバイル・シングル・サインオン・クライアント・アプリケーションのためのクライアント登録ハンドルの作成(ユーザー・トークンのシナリオ)

この例は前の例に似ています。ただし、ユーザー名とパスワードのかわりにユーザー・トークンが送信されます。ユーザー・トークンは、認証済ユーザーがそのデバイスを認可したことを表すセキュリティ資格証明です。前の例と同様、リクエストはMobileExpenseReport1というモバイル・ビジネス・アプリケーションで生成されています。

cURLコマンド

curl -H "Content-Type: application/json" --request POST
http://localhost:18001/idaas_rest/rest/mobilejwtauthentication/register -H
"X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD ..." -d
'{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"ey...",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTREGHANDLE",
"deviceProfile" : { ... },
handles : {
"oaam.session" : "...",
"oaam.device" : "..." },
"clientId": "MobileExpenseReport1" } '

予想される出力

{"X-Idaas-Rest-Token-Value":"ey...",
"X-Idaas-Rest-Token-Type":"CLIENTREGHANDLE",
handles : {
"oaam.session" : { ... } ,
"oaam.device" : { ... }
}
}

説明

- CLIENTREGHANDLEおよびその他のトークンの値は、表示上の都合で短縮されています。

- クライアント・アプリケーションを登録する際、該当するモバイル・エージェントのクライアント・アプリケーション・プロファイルでMobile.reauthnForRegNewClientApp構成値がfalseに設定されている場合、ユーザー・トークンは単にユーザー登録を表します。

- HTTPヘッダーX-IDAAS-REST-AUTHORIZATIONには、モバイル・エージェント・アプリケーション(MobileAgent1など)のクライアント登録ハンドルを含むUIDPASSWORDスキーム値があります。

ユーザー・トークンのリクエストの作成

この例は、ユーザー・トークンの作成をリクエストするために、モバイル・シングル・サインオン・エージェントがMobile and Socialサーバーに送信するRESTコールを示しています。

cURLコマンド

curl -H "Content-Type: application/json" --request POST
http://localhost:18001/idaas_rest/rest/mobilejwtauthentication/authenticate -H
'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="..." ' -d
'{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"theUserName",
"X-Idaas-Rest-Subject-Password":"thePassword",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN",
"handles" : { ... },
"deviceProfile" : { ... } }'

予想される出力

{"X-Idaas-Rest-Token-Value":"ey...",
"X-Idaas-Rest-Token-Type":"USERTOKEN",
handles : {
"oaam.session" : { ... } ,
"oaam.device" : { ... }
}
}

説明

- トークンの値は、表示上の都合で短縮されています。

- SSOエージェント・アプリケーション(MobileAgent1など)は、ユーザー名とパスワードを使用してユーザー・トークンをリクエストします。
HTTPヘッダーX-IDAAS-REST-AUTHORIZATIONには、SSOエージェント・アプリケーション(MobileAgent1)のクライアント登録ハンドルを含むUIDPASSWORDスキーム値があります。

アクセス・トークンのリクエストの作成

この例は、モバイル・ビジネス・アプリケーションのかわりのモバイルSSOエージェントによるアクセス・トークンのリクエストを示しています。モバイルSSOエージェントの名前はMobileAgent1、ビジネス・アプリケーションの名前はMobileExpenseReport1です。

cURLコマンド

モバイルOAMAuthenticationの例

curl -H "Content-Type: application/json" -H
'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="..." ' -H
'X-IDAAS-REST-AGENT-AUTHORIZATION: UIDPASSWORD cred="..." '
--request POST
http://localhost:18001/idaas_rest/rest/mobileoamauthentication/access -d
'{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"... USER TOKEN VALUE...",
"X-Idaas-Rest-Application-Context":"75sSbBZZKJiUOAWikZxsKA==",
"X-Idaas-Rest-Application-Resource":
"http:/wengate123.us.example.com:7779/index.html",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN",
"handles" : { ... },
"deviceProfile" : { ... }
}'

モバイルJWTAuthenticationの例

curl -H "Content-Type: application/json" -H
'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="..." ' -H
'X-IDAAS-REST-AGENT-AUTHORIZATION: UIDPASSWORD cred="..." '
--request POST
http://localhost:18001/idaas_rest/rest/mobilejwtauthentication/access -d
'{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"... USER TOKEN VALUE ...",
"X-Idaas-Rest-Application-Resource":"...",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN",
"handles" : { ... },
"deviceProfile" : { ... }
}'

予想される出力

{"X-Idaas-Rest-Token-Value":"...",
"X-Idaas-Rest-Token-Type":"ACCESSTOKEN",
handles : {
"oaam.session" : { ... } ,
"oaam.device" : { ... }
}
}

説明

- このHTTPリクエストには2つのヘッダーがあります。1つ目にはSSOエージェント・アプリケーションのクライアント登録ハンドルが含まれ、2つ目にはビジネス・アプリケーションのクライアント登録ハンドルが含まれています。
ヘッダーX-IDAAS-REST-AGENT-AUTHORIZATIONには、SSOエージェント・アプリケーション(MobileAgent1)のクライアント登録ハンドルが含まれています。

ヘッダーX-IDAAS-REST-AUTHORIZATIONには、ビジネス・アプリケーション(MobileExpenseReport1)のクライアント登録ハンドルが含まれています。

- Mobile and Socialサーバー・コンポーネント(特にモバイル・サービス・コンポーネント)は、両方のハンドルの有効性を検証します。これにより、両方のアプリケーションがターゲット・サービス・ドメインに確実にリストされます。基礎となるトークン・サービスまたは認証サービスは、ユーザー・トークンの値の有効性の検証時にアクセス・トークンを提供します。Access Managerの場合、X-Idaas-Rest-Application-Resourceフィールドにより、特定のWebGateで保護されたリソースが参照されます。Access Managerアプリケーション・コンテキストに該当するX-Idaas-RESt-Application-Contextフィールドもあります。

- トークンの値は、表示上の都合で短縮されています。

シングル・サインオン・エージェントによる独自に使用するアクセス・トークンを作成するためのリクエスト

この例は、モバイルSSOエージェントによる独自に使用するアクセス・トークンのリクエストを示しています。モバイルSSOエージェントがクライアント・アプリケーションのかわりにトークンをリクエストするには、アクセス・トークンが必要です。

cURLコマンド

モバイルOAMAuthenticationの例

curl -H "Content-Type: application/json" -H
'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="..." '
--request POST http://localhost:18001/idaas_
rest/rest/mobileoamauthentication/access -d
'{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"... USER TOKEN VALUE...",
"X-Idaas-Rest-Application-Context":"75sSbBZZKJiUOAWikZxsKA==",
"X-Idaas-Rest-Application-Resource":"http:/wengate123.us.example.com:7779/index.html",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN",
"handles" : { ... },
"deviceProfile" : { ... }
}'

モバイルJWTAuthenticationの例

curl -H "Content-Type: application/json" -H
'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="..." '
--request POST http://localhost:18001/idaas_
rest/rest/mobilejwtauthentication/access -d
'{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"... USER TOKEN VALUE ...",
"X-Idaas-Rest-Application-Resource":"...",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN",
"handles" : { ... },
"deviceProfile" : { ... }
}'

予想される出力

{
"X-Idaas-Rest-Token-Value":"...",
"X-Idaas-Rest-Token-Type":"ACCESSTOKEN",
handles : {
"oaam.session" : { ... } ,
"oaam.device" : { ... }
}
}

説明

- このHTTPリクエストには1つのヘッダー、X-IDAAS-REST-AUTHORIZATIONがあり、これにはSSOエージェント・アプリケーション(MobileAgent1)のクライアント登録ハンドルが含まれています。
このリクエストにはX-IDAAS-REST-AGENT-AUTHORIZATIONヘッダーはありません。

- Mobile and Socialサーバー・コンポーネント(特にモバイル・サービス・コンポーネント)は、両方のハンドルの有効性を検証します。これにより、MobileAgent1アプリケーションがターゲット・サービス・ドメインにリストされ、SSO対応アプリケーションとしてマークされるようになります(つまり、このアプリケーションはSSO優先度にリストされます)。

- トークンの値は、表示上の都合で短縮されています。

クライアント登録ハンドルの検証

この例は、クライアント登録ハンドルの検証リクエストを示しています。Mobile and Socialには、トークンとハンドルの検証ロジックがあるため、モバイル・クライアントがこの検証をコールする必要はありません。

Mobile and Socialサーバーにユーザー・トークンまたはアクセス・トークンの作成のリクエストが送信されると、このサービスは、クライアント登録ハンドルを含む1つまたは2つのHTTPヘッダー(X-IDAAS-REST-AUTHORIZATIONおよびX-IDAAS-REST-AGENT-AUTHORIZATION)を検証します。

cURLコマンド

curl --request
GET http://localhost:18001/idaas_rest/rest/mobileservice1/tokens/info -H "X-Idaas-Rest-Subject: TOKEN ey..." -H
"X-IDAAS-REST-AUTHORIZATION: TOKEN ey..."

予想される出力

{
"X-Idaas-Rest-Token-Value":"eyJl...",
"X-Idaas-Rest-Token-Type":"CLIENTREGHANDLE"
}

説明

- CLIENTREGHANDLEの値は、2つの異なるHTTPヘッダーの下で繰り返されます。クライアント・トークンがトークンの検証処理を行うことを必要とせずに管理者が明示的なサービス・バインディングを使用する場合、2つ目のHTTPヘッダーは削除できます。

- CLIENTREGHANDLEの値は、表示上の都合で短縮されています。

- トークンの値は、表示上の都合で短縮されています。

モバイル・サービスRESTリファレンス: ユーザー・プロファイル・サービスのコマンド

この項のcURLコマンドは、接続されるディレクトリ・サーバーを使用してユーザー・プロファイル・サービス・トランザクションを実行するため、クライアント・アプリケーションからMobile and Socialサーバーに送信されるRESTコールを示しています。

ユーザー・プロファイルcURLコマンドは、次の項に分類されています。

- 基本的なユーザー操作

- 基本的なグループ操作

- memberOf関係の操作

- members関係の操作

- manager関係の操作

- reports関係の操作

- ownerOf関係の操作

- personOwner関係の操作

- groupOwner関係の操作

- groupOwnerOf関係の操作

- groupMemberOf関係の操作

- groupMembers関係の操作

- ユーザーの検索操作

- attrsToFetch問合せパラメータ機能

- prefetch問合せパラメータ機能

- scope問合せパラメータ機能

基本的なユーザー操作

基本的なユーザー操作コマンドには次のようなものがあります。

- ユーザーの作成

- ユーザーの読取り

- ユーザーの更新

- ユーザーの削除

ユーザーの作成

リモート・ディレクトリでユーザー・プロファイルを作成する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"John","description":"test user","lastname":"Anderson",
"commonname":"John Anderson","firstname":"John"}'

予想される出力

{"uid":"John","guid":"FE1D7BD0590111E1BFDCF77FB8E715D5","
description":"test user","name":"John","lastname":"Anderson",
"commonname":"John Anderson","loginid":"John","firstname":"John",
"uniquename":"FE1D7BD0590111E1BFDCF7FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}

ユーザーの読取り

リモート・ディレクトリでユーザー・プロファイルを取得する方法を示します。

cURLコマンド

curl -i --request GET http://localhost:14100/idaas_rest/
rest/userprofile/people/John/

予想される出力

{"uid":"John","guid":"FE1D7BD0590111E1BFDCF77FB8E715D5","description":"test user",
"name":"John","lastname":"Anderson","commonname":"John Anderson","loginid":"John",
"firstname":"John","uniquename":"FE1D7BD0590111E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}

ユーザーの更新

リモート・ディレクトリでユーザー・プロファイル・レコードを更新する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json" --request PUT
http://localhost:14100/idaas_rest/rest/userprofile/people/John/ -d
'{"description":"test user1"}'

予想される出力

{"uid":"John","guid":"FE1D7BD0590111E1BFDCF77FB8E715D5",
"description":"test user1","name":"John","lastname":"Anderson",
"commonname":"John Anderson","loginid":"John","firstname":"John",
"uniquename":"FE1D7BD0590111E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}

ユーザーの削除

リモート・ディレクトリでユーザー・プロファイル・レコードを削除する方法を示します。

cURLコマンド

curl -i --request DELETE http://localhost:14100/
idaas_rest/rest/userprofile/people/John/

予想される出力

レスポンスはありません。

基本的なグループ操作

基本的なグループ操作コマンドには次のようなものがあります。

- グループの作成

- グループの読取り

- グループの更新

- グループの削除

グループの作成

リモート・ディレクトリでグループ・プロファイルを作成する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"group1 testuing","commonname":"group1"}'

予想される出力

{"guid":"2259C6C0592011E1BFDCF77FB8E715D5","description":"group1 testing",
"name":"group1","commonname":"group1",
"uniquename":"2259C6C0592011E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1"}

グループの読取り

リモート・ディレクトリでグループ・プロファイルを取得する方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/idaas_rest/
rest/userprofile/groups/group1/"

予想される出力

{"guid":"2259C6C0592011E1BFDCF77FB8E715D5","description":"group1 testing",
"name":"group1","commonname":"group1",
"uniquename":"2259C6C0592011E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1"}

グループの更新

リモート・ディレクトリでグループ・プロファイルを更新する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json" --request PUT
http://localhost:14100/idaas_rest/rest/userprofile/groups/group1/ -d
'{"description":"group11 testing"}'

予想される出力

{"guid":"2259C6C0592011E1BFDCF77FB8E715D5","description":"group11 testing",
"name":"group1","commonname":"group1",
"uniquename":"2259C6C0592011E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1"}

グループの削除

リモート・ディレクトリでグループ・プロファイルを削除する方法を示します。

cURLコマンド

curl -H "Content-Type: application/json" --request PUT
http://localhost:14100/idaas_rest/rest/userprofile/groups/group1/ -d
'{"description":"group11 testing"}'

予想される出力

{"guid":"2259C6C0592011E1BFDCF77FB8E715D5","description":"group11 testing",
"name":"group1","commonname":"group1",
"uniquename":"2259C6C0592011E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1"}

memberOf関係の操作

membersおよびmemberOfの論理エンティティ関係は、どちらもLDAPグループ・エンティティ内の同じメンバー属性を指しています。グループに関しては、ユーザーの追加、削除、読取りおよび検索に両方の論理エンティティ関係を使用できます。

この項では次の操作について記載しています。

- memberOf関係の作成

- memberOf関係の読取り

- memberOf関係の削除

memberOf関係の作成

ユーザーをグループのメンバーにする方法を示します。

cURLコマンド

ユーザーJohnの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"John"Anderson","commonname":"John Anderson","firstname":"John"}'

グループgroup1の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"group1 testing","commonname":"group1"}'

memberOf関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/John/memberOf/ -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/group\/group1",
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}'

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1",
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John\/memberOf\/group1"}

memberOf関係の読取り

指定されたユーザーのmemberOf関係プロファイルを取得する方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/idaas_rest
/rest/userprofile/people/John/memberOf/group1/"

予想される出力

次のいずれかです。

- HTTPステータス200 (リクエストは成功しました。)

- レスポンスはありません。

memberOf関係の削除

memberOf関係の削除方法を示します。

cURLコマンド

memberOf関係の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/people/John/memberOf/group1/"

ユーザーJohnの削除

curl -i --request DELETE http://localhost:14100/idaas_rest/
rest/userprofile/people/John/

グループgroup1の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/groups/group1"

予想される出力

次のいずれかです。

- HTTPステータス200 (リクエストは成功しました。)

- レスポンスはありません。

members関係の操作

membersおよびmemberOfの論理エンティティ関係は、どちらもLDAPグループ・エンティティ内の同じメンバー属性を指しています。グループに関しては、ユーザーの追加、削除、読取りおよび検索に両方の論理エンティティ関係を使用できます。

この項では次の操作について記載しています。

- members関係の作成

- members関係の読取り

- members関係の削除

members関係の作成

ユーザーをグループに割り当てる方法を示します。

cURLコマンド

ユーザーJohnの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"John"Anderson","commonname":"John Anderson","firstname":"John"}'

グループgroup1の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"group1 testuing","commonname":"group1"}'

members関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/group1/members -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/group\/group1",
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}'

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1",
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/group1\/members\/John"}

members関係の読取り

members関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/idaas_rest/
rest/userprofile/people/group1/members/John"

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1",
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/group1\/members\/John"}

members関係の削除

members関係プロファイルの削除方法を示します。

cURLコマンド

members関係の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/people/group1/members/John/"

ユーザーJohnの削除

curl -i --request DELETE http://localhost:14100/idaas_rest/
rest/userprofile/people/John/

グループgroup1の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/groups/group1/"

予想される出力

HTTPステータス200 (リクエストは成功しました。)

manager関係の操作

この項では次の操作について記載しています。

- manager関係の作成

- manager関係の読取り

- manager関係の削除

manager関係の作成

マネージャをユーザーに割り当てる方法を示します。

cURLコマンド

ユーザーJohnの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"John"Anderson","commonname":"John Anderson","firstname":"John"}'

ユーザーAlanの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"Alan","description":"Manager User","lastname":"Doe",
"commonname":"Alan Doe","firstname":"Alan"}'

manager関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/John/manager/ -d
'{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}'

予想される出力

{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John\/manager\/Alan",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}

manager関係の読取り

manager関係プロファイルの読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/idaas_rest/
rest/userprofile/people/John/manager/Alan"

予想される出力

{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John\/manager\/Alan",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}

manager関係の削除

manager関係の削除方法を示します。

cURLコマンド

manager関係の削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/people/John/manager/Alan"

ユーザーJohnの削除

curl -i --request DELETE http://localhost:14100/
idaas_rest/rest/userprofile/people/John/

ユーザーAlanの削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/people/Alan/"

予想される出力

レスポンスはありません。

reports関係の操作

この項では次の操作について記載しています。

- reports関係の作成

- reports関係の読取り

- reports関係の削除

reports関係の作成

reports-to関係の作成方法を示します。

cURLコマンド

ユーザーJohnの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"John"Anderson","commonname":"John Anderson","firstname":"John"}'

ユーザーAlanの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"Alan","description":"Manager User","lastname":"Doe",
"commonname":"Alan Doe","firstname":"Alan"}'

reports関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/Alan/reports/ -d
'{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}'

予想される出力

{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan\/reports\/John",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}

reports関係の読取り

reports-to関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/idaas_rest/
rest/userprofile/people/Alan/reports/John"

予想される出力

{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan\/reports\/John",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}

reports関係の削除

reports-to関係の削除方法を示します。

cURLコマンド

reports関係の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/people/Alan/reports/John"

ユーザーJohnの削除

curl -i --request DELETE http://localhost:14100/idaas_rest/
rest/userprofile/people/John/

ユーザーAlanの削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/people/Alan/"

予想される出力

レスポンスはありません。

ownerOf関係の操作

この項では次の操作について記載しています。

- ownerOf関係の作成

- ownerOf関係の読取り

- ownerOf関係の削除

ownerOf関係の作成

ownerOf関係の作成方法を示します。

cURLコマンド

ユーザーJohnの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"John"Anderson","commonname":"John Anderson","firstname":"John"}'

グループgroup1の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"group1 testuing","commonname":"group1"}'

ownerOf関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/John/ownerOf/ -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/group\/group1",
"owner-uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}'

予想される出力

{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan\/reports\/John",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}

ownerOf関係の読取り

ownerOf関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/idaas_rest/
rest/userprofile/people/John/ownerOf/group1"

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1",
"owner-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John\/ownerOf\/group1"}

ownerOf関係の削除

ownerOf関係の削除方法を示します。

cURLコマンド

ownerOf関係の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/people/John/ownerOf/group1"

ユーザーJohnの削除

curl -i --request DELETE http://localhost:14100/idaas_rest/
rest/userprofile/people/John/

グループgroup1の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/groups/group1"

予想される出力

レスポンスはありません。

personOwner関係の操作

この項では次の操作について記載しています。

- ownerOf関係の作成

- ownerOf関係の読取り

- ownerOf関係の削除

personOwner関係の作成

personOwner関係の作成方法を示します。

cURLコマンド

ユーザーJohnの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{"uid":"John"Anderson","commonname":"John Anderson","firstname":"John"}'

グループgroup1の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"group1 testing","commonname":"group1"}'

personOwner関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/group1/personOwner -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/group\/group1",
"owner-uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}'

予想される出力

{"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan\/reports\/John",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/Alan"}

personOwner関係の読取り

personOwner関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:18001/idaas_rest/
rest/userprofile/groups/group1/personOwner/John"

予想される出力

{"owner-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1\/personOwner\/John"

personOwner関係の削除

personOwner関係の削除方法を示します。

cURLコマンド

personOwner関係の削除

curl -i --request DELETE "http://localhost:18001/idaas_rest/
rest/userprofile/groups/group1/personOwner/John"

ユーザーJohnの削除

curl -i --request DELETE http://localhost:14100/idaas_rest/
rest/userprofile/people/John/

グループgroup1の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/
rest/userprofile/groups/group1/"

予想される出力

レスポンスはありません。

groupOwner関係の操作

この項では次の操作について記載しています。

- groupOwner関係の作成

- groupOwner関係の読取り

- groupOwner関係の削除

groupOwner関係の作成

groupOwner関係の作成方法を示します。

cURLコマンド

グループXYZの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"XYZ Group","commonname":"XYZ"}'

グループABCの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"ABC Group","commonname":"ABC"}'

groupOwner関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/XYZ/groupOwner -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/group\/XYZ",
"owner-uri":"\/idaas_rest\/rest\/userprofile\/group\/ABC"}'

予想される出力

{"owner-uri":"\/idaas_rest\/rest\/userprofile\/groups\/ABC",
"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ\/groupOwner\/ABC"}

groupOwner関係の読取り

groupOwner関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/groupOwner/ABC"

予想される出力

{"owner-uri":"\/idaas_rest\/rest\/userprofile\/people\/John",
"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/group1\/personOwner\/John"

groupOwner関係の削除

groupOwner関係の削除方法を示します。

cURLコマンド

groupOwner関係の削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/groupOwner/ABC"

グループXYZの削除

curl -i --request DELETE http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/

グループABCの削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/groups/ABC/"

予想される出力

レスポンスはありません。

groupOwnerOf関係の操作

この項では次の操作について記載しています。

- groupOwnerOf関係の作成

- groupOwnerOf関係の読取り

- groupOwnerOf関係の削除

groupOwnerOf関係の作成

groupOwnerOf関係の作成方法を示します。

cURLコマンド

グループXYZの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"XYZ Group","commonname":"XYZ"}'

グループABCの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"ABC Group","commonname":"ABC"}'

groupOwnerOf関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ABC/groupOwnerOf -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/group\/XYZ",
"owner-uri":"\/idaas_rest\/rest\/userprofile\/group\/ABC"}'

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ",
"owner-uri":"\/idaas_rest\/rest\/userprofile\/groups\/ABC",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/ABC\/groupOwnerOf\/XYZ"}

groupOwnerOf関係の読取り

groupOwnerOf関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/
idaas_rest/rest/userprofile/groups/ABC/groupOwnerOf/XYZ"

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ",
"owner-uri":"\/idaas_rest\/rest\/userprofile\/groups\/ABC",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/ABC\/groupOwnerOf\/XYZ"

groupOwnerOf関係の削除

groupOwnerOf関係の削除方法を示します。

cURLコマンド

groupOwnerOf関係の削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/groups/ABC/groupOwnerOf/XYZ"

グループXYZの削除

curl -i --request DELETE http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/

グループABCの削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/groups/ABC/"

予想される出力

レスポンスはありません。

groupMemberOf関係の操作

この項では次の操作について記載しています。

- groupMemberOf関係の作成

- groupMemberOf関係の読取り

- groupMemberOf関係の削除

groupMemberOf関係の作成

groupMemberOf関係の作成方法を示します。

cURLコマンド

グループXYZの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"XYZ Group","commonname":"XYZ"}'

グループiCLOUDの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"iCloud Group","commonname":"iCLOUD"}'

groupMemberOf関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/XYZ/groupMemberOf -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD",
"member-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ"}'

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD",
"member-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ\/groupMemberOf\/iCLOUD"}

groupMemberOf関係の読取り

groupMemberOf関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/groupMemberOf/iCLOUD"

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD",
"member-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ\/groupMemberOf\/iCLOUD"

groupMemberOf関係の削除

groupMemberOf関係の削除方法を示します。

cURLコマンド

groupMemberOf関係の削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/groupMemberOf/iCLOUD"

グループXYZの削除

curl -i --request DELETE http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/

グループiCLOUDの削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/groups/iCLOUD/"

予想される出力

レスポンスはありません。

groupMembers関係の操作

この項では次の操作について記載しています。

- groupMembers関係の作成

- groupMembers関係の読取り

- groupMembers関係の削除

groupMembers関係の作成

groupMembers関係の作成方法を示します。

cURLコマンド

グループXYZの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"XYZ Group","commonname":"XYZ"}'

グループiCLOUDの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/ -d
'{"description":"iCloud Group","commonname":"iCLOUD"}'

groupMembers関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/groups/iCLOUD/groupMembers -d
'{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD",
"member-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ"}'

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD",
"member-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD\/groupMembers\/XYZ"}

groupMembers関係の読取り

groupMembers関係の読取り方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/
idaas_rest/rest/userprofile/groups/iCLOUD/groupMembers"

予想される出力

{"group-uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD",
"member-uri":"\/idaas_rest\/rest\/userprofile\/groups\/XYZ",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/iCLOUD\/groupMemberOf\/XYZ"

groupMembers関係の削除

groupMembers関係の削除方法を示します。

cURLコマンド

groupMembers関係の削除

curl -i --request DELETE "http://localhost:14100/idaas_rest/rest/
userprofile/groups/iCLOUD/groupMembers"

グループXYZの削除

curl -i --request DELETE http://localhost:14100/
idaas_rest/rest/userprofile/groups/XYZ/

グループiCLOUDの削除

curl -i --request DELETE "http://localhost:14100/
idaas_rest/rest/userprofile/groups/iCLOUD/"

予想される出力

レスポンスはありません。

ユーザーの検索操作

この項では次の操作について記載しています。

- ユーザーの検索

- PageSizeおよびPagePosによるユーザーの検索

- 検索パラメータがあり、検索フィルタがないユーザーの検索

- 検索フィルタによるユーザーの検索

- グループの検索

- 関係の検索

ユーザーの検索

すべてのユーザーのリストを取得する方法を示します。

cURLコマンド

curl -i --request GET http://localhost:14100/idaas_rest/rest/userprofile/people

予想される出力

{"next":"\/idaas_rest\/rest\/userprofile\/people?pageSize=10&pagePos=1",
"elements":[{"uid":"OracleSystemUser","guid":"E9A3B390581611E19F08FB1E3902A71C",
"description":"Oracle]]]] application software system user.",
"name":"OracleSystemUser","lastname":"OracleSystemUser",
"commonname":"OracleSystemUser","loginid":"OracleSystemUser",
"uniquename":"E9A3B390581611E19F08FB1E3902A71C",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/OracleSystemUser"},
{"uid":"weblogic","guid":"E9A4C500581611E19F08FB1E3902A71C",
"description":"This user is the default administrator.","name":"weblogic",
"lastname":"weblogic","commonname":"weblogic","loginid":"weblogic",
"uniquename":"E9A4C500581611E19F08FB1E3902A71C",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic"},
{"uid":"alice","guid":"D8D1907158F511E1BFDCF77FB8E715D5",
"description":"This test user is alice.","name":"alice","lastname":"alice",
"commonname":"alice","loginid":"alice",
"uniquename":"D8D1907158F511E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/alice"},
{"uid":"sean","guid":"D8D5AF2058F511E1BFDCF77FB8E715D5",
"description":"This test user is sean.","name":"sean","lastname":"sean",
"commonname":"sean","loginid":"sean",
"uniquename":"D8D5AF2058F511E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/sean"},
{"uid":"wei","guid":"D8D6245058F511E1BFDCF77FB8E715D5",
"description":"This test user is wei.","name":"wei","lastname":"wei",
"commonname":"wei","loginid":"wei",
"uniquename":"D8D6245058F511E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/wei"},
{"uid":"malla","guid":"D8D64B6058F511E1BFDCF77FB8E715D5",
"description":"This test user is malla.","name":"malla","lastname":"malla",
"commonname":"malla","loginid":"malla",
"uniquename":"D8D64B6058F511E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/malla"},
{"uid":"alan","guid":"D8D6998058F511E1BFDCF77FB8E715D5",
"description":"This test user is alan.","name":"alan","lastname":"alan",
"commonname":"alan","loginid":"alan",
"uniquename":"D8D6998058F511E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/alan"},
"uri":"\/idaas_rest\/rest\/userprofile\/people?pageSize=10&pagePos=0"}

PageSizeおよびPagePosによるユーザーの検索

ページ・サイズとページの位置を指定してユーザーのリストを取得する方法を示します。

cURLコマンド

curl -i --request GET "http://localhost:14100/
idaas_rest/rest/userprofile/people?pagePos=0&pageSize=1"

予想される出力

{"next":"\/idaas_rest\/rest\/userprofile\/people?pageSize=1&pagePos=1",
"elements":[{"uid":"OracleSystemUser","guid":"E9A3B390581611E19F08FB1E3902A71C",
"description":"Oracle]] application software system user.",
"name":"OracleSystemUser","lastname":"OracleSystemUser",
"commonname":"OracleSystemUser","loginid":"OracleSystemUser",
"uniquename":"E9A3B390581611E19F08FB1E3902A71C",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/OracleSystemUser"}],
"uri":"\/idaas_rest\/rest\/userprofile\/people?pageSize=1&pagePos=0"}

検索パラメータがあり、検索フィルタがないユーザーの検索

検索パラメータは設定するが検索フィルタは設定せずにユーザーのリストを取得する方法を示します。

cURLコマンド

curl -i --request GET "http:/localhost:14100/idaas_rest/rest/userprofile/people/
?pagePos=0&pageSize=10&searchparam.name=John*"

予想される出力

{"elements":[{"uid":"John","guid":"E932E4F0590911E1BFDCF77FB8E715D5",
"description":"test user","name":"John","lastname":"Anderson",
"commonname":"John Anderson","loginid":"John","firstname":"John",
"uniquename":"E932E4F0590911E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}],
"uri":"\/idaas_rest\/rest\/userprofile\/people?pageSize=10
&searchparam.name=John+Anderson&pagePos=0"}

検索フィルタによるユーザーの検索

デフォルトのそのまま使用できる単純なAND検索フィルタを指定して、ユーザーのリストを取得する方法を示します。

cURLコマンド

curl -i --request GET "http:/localhost:14100/idaas_rest/rest/userprofile/
people?searchFilter=SimpleOR&searchparam.uid=John&searchparam.lastname=TEST"

予想される出力

{"elements":[{
"uid":"John",
"guid":"E932E4F0590911E1BFDCF77FB8E715D5",
"description":"test user",
"name":"John",
"lastname":"Anderson",
"commonname":"John Anderson",
"loginid":"John",
"firstname":"John",
"uniquename":"E932E4F0590911E1BFDCF77FB8E715D5",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/John"}],
"uri":"\/idaas_rest\/rest\/userprofile\/people?pageSize=10
&searchFilter=SimpleOR&searchparam.lastname=TEST&searchparam.uid=John&pagePos=0"}

グループの検索

グループ情報の取得方法を示します。

cURLコマンド

curl -i --request GET "http:/localhost:14100/idaas_rest/rest/userprofile/
groups/?pagePos=0&pageSize=2"

予想される出力

{"next":"\/idaas_rest\/rest\/userprofile\/groups?pageSize=2&pagePos=1",
"elements":[{
"guid":"7CF7EC60724811E1BFB5AB6A1E4E415B",
"description":"AdminChannelUsers]] can access the admin channel.",
"name":"AdminChannelUsers",
"commonname":"AdminChannelUsers",
"uniquename":"7CF7EC60724811E1BFB5AB6A1E4E415B",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/AdminChannelUsers"},
{"guid":"7CF7EC61724811E1BFB5AB6A1E4E415B",
"description":"Administrators can view and modify all resource attributes and start and stop servers.",
"name":"Administrators",
"commonname":"Administrators",
"uniquename":"7CF7EC61724811E1BFB5AB6A1E4E415B",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/Administrators"}],
"uri":"\/idaas_rest\/rest\/userprofile\/groups?pageSize=2&pagePos=0"}

関係の検索

組織内の人の名前を指定して、その人のマネージャを検索できます。

cURLコマンド

curl -i --request GET "http:/localhost:14100/idaas_rest/rest/userprofile/
people/JohnD/manager/?pagePos=0&pageSize=2"

予想される出力

{"elements":[{
"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager\/SusanS",
"manager-uri":{
"uid":"SusanS",
"manager":"\/idaas_rest\/rest\/userprofile\/people\/SusanS\/manager",
"state":"CA",
"lastname":"Smith",
"firstname":"Susan",
"loginid":"SusanS",
"uniquename":"5B543C30790511E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS",
"country":"USA",
"guid":"5B543C30790511E1AF41BD17BAB1A1C1",
"title":"Sr]]. Director, Development ",
"name":"SusanS",
"commonname":"Susan Smith"}
}],
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager?pageSize=2
&pagePos=0"}

attrsToFetch問合せパラメータ機能

attrsToFetch問合せパラメータを使用して、特定の属性セットを取得します。このパラメータが指定されない場合は、属性のフル・セットが返されます。複数の属性を指定するには、属性名のカンマ区切りリストを使用します。

次に例を示します。

.../people/alice?attrsToFetch=uid,email

attrsToFetch問合せパラメータは、検索、読取り、ユーザー、グループまたは関係の任意の操作で使用できます。

この項では、次の例を示します。

- attrsToFetchによるユーザーの読取り

- attrsToFetchによるグループの検索

- attrsToFetchによる関係の検索

attrsToFetchによるユーザーの読取り

この例は、ユーザーの一般名のみを取得する方法を示しています。attrsToFetchパラメータを使用しないと、システムはユーザー属性のフル・セットを取得します。

cURLコマンド

curl -i --request GET
"http://host:10/idaas_rest/rest/userprofile/people/Alice/?attrsToFetch=commonname"

attrsToFetchを使用した場合に予想される出力

{
"commonname":"Alice Mac",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/Alice"}

attrsToFetchを使用しない場合に予想される出力

{
"uid":"Alice",
"guid":"C04020C078FE11E1AF41BD17BAB1A1C1",
"description":"Alice User",
"name":"Alice",
"lastname":"Mac",
"commonname":"Alice Mac",
"loginid":"Alice",
"firstname":"Alice",
"uniquename":"C04020C078FE11E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/Alice"}

attrsToFetchによるグループの検索

この例は、グループを検索し、各グループの名前のみを取得する方法を示しています。attrsToFetchパラメータを使用しないと、システムは各グループのすべての属性を取得します。

cURLコマンド

curl -i --request GET
"http:/host:10/idaas_rest/rest/userprofile/groups?pagePos=0&pageSize=2
&attrsToFetch=name"

attrsToFetchを使用した場合に予想される出力

{"next":
"\/idaas_rest\/rest\/userprofile\/groups?pageSize=2&attrsToFetch=name&pagePos=1",
"elements":[{
"name":"AdminChannelUsers",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/AdminChannelUsers"},
{
"name":"Administrators",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/Administrators"
}],
"uri":"\/idaas_rest\/rest\/userprofile\/groups?pageSize=2&attrsToFetch=name
&pagePos=0"}

attrsToFetchを使用しない場合に予想される出力

{"next":
"\/idaas_rest\/rest\/userprofile\/groups?pageSize=2&pagePos=1",
"elements":[{
"guid":"7CF7EC60724811E1BFB5AB6A1E4E415B",
"description":"AdminChannelUsers can access the admin channel.",
"name":"AdminChannelUsers",
"commonname":"AdminChannelUsers",
"uniquename":"7CF7EC60724811E1BFB5AB6A1E4E415B",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/AdminChannelUsers"},
{
"guid":"7CF7EC61724811E1BFB5AB6A1E4E415B",
"description":"Administrators can view and modify all resource attributes and
start and stop servers.",
"name":"Administrators",
"commonname":"Administrators",
"uniquename":"7CF7EC61724811E1BFB5AB6A1E4E415B",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/Administrators"
}],
"uri":"\/idaas_rest\/rest\/userprofile\/groups?pageSize=2&pagePos=0"}

attrsToFetchによる関係の検索

この例は、ユーザーが所属するグループの名前を取得する方法を示しています。attrsToFetchパラメータを使用しないと、システムは各グループのグループ属性のフル・セットを取得します。

cURLコマンド

curl -i --request GET
"http://host:10/idaas_rest/rest/userprofile/people/weblogic/memberOf?
pagePos=0&pageSize=2&attrsToFetch=name"

attrsToFetchを使用した場合に予想される出力

{"next":
"\/idaas_rest\/rest\/userprofile\/people\/weblogic\/memberOf?
pageSize=2&attrsToFetch=name&pagePos=1",
"elements":[
{
"group-uri":
{
"name":"Administrators",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/Administrators"
},
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic\/memberOf\/
Administrators"
},
{
"group-uri":
{
"name":"OAAMEnvAdminGroup",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/OAAMEnvAdminGroup"
},
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic",
"uri":"\/idaas_ rest\/rest\/userprofile\/people\/weblogic\/memberOf\/
OAAMEnvAdminGroup"
}],
"uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic\/memberOf?
pageSize=2&attrsToFetch=name&pagePos=0"}

attrsToFetchを使用しない場合に予想される出力

{"next":
"\/idaas_rest\/rest\/userprofile\/people\/weblogic\/memberOf?
pageSize=2&pagePos=1",
"elements":[
{
"group-uri":
{
"guid":"7CF7EC61724811E1BFB5AB6A1E4E415B",
"description":"Administrators can view and modify all resource attributes
and start and stop servers.",
"name":"Administrators",
"commonname":"Administrators",
"uniquename":"7CF7EC61724811E1BFB5AB6A1E4E415B",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/Administrators"
},
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic\/memberOf\/
Administrators"
},
{
"group-uri":
{
"guid":"7CF83A81724811E1BFB5AB6A1E4E415B",
"description":"EnvAdminGroup",
"name":"OAAMEnvAdminGroup",
"commonname":"OAAMEnvAdminGroup",
"uniquename":"7CF83A81724811E1BFB5AB6A1E4E415B",
"uri":"\/idaas_rest\/rest\/userprofile\/groups\/OAAMEnvAdminGroup"
},
"person-uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic\/memberOf\/
OAAMEnvAdminGroup"
}],
"uri":"\/idaas_rest\/rest\/userprofile\/people\/weblogic\/memberOf?
pageSize=2&pagePos=0"}

prefetch問合せパラメータ機能

prefetch問合せパラメータを使用して問合せを拡張し、問合せのサブジェクトであるユーザー、グループまたは関係にリンクされた属性のコレクションを取得します。複数の属性を指定するには、属性名のカンマ区切りリストを使用します。

次に例を示します。

.../people/alice?prefetch=attr1,attr2(b1,b2),attr3(b1,b2,b3)

prefetch問合せパラメータを指定しない場合、システムはリクエストされたURIのみを返します。

prefetch問合せパラメータは、ユーザー、グループまたは関係プロファイル操作で使用することはできますが、検索操作では使用できません。

したがって、次のようなインスタンス・リソースでprefetchを使用できます。

- .../people/alice

- .../groups/Admin

- .../people/alice/memberOf/Admin

ただし、次のようなコレクション・リソースでprefetchを使用することはできません。

- .../people

- .../groups

- .../people/alice/memberOf

この項では1つの例を示します。

- prefetchによるユーザーの読取り

prefetchによるユーザーの読取り

この例は、デフォルトで返されるユーザー属性のフル・セットに加え、指定されたユーザーのマネージャ属性のコレクションを取得する方法を示しています。

cURLコマンド

curl -i --request GET
"http://localhost:16191/idaas_rest/rest/userprofile/people/JohnD/
?prefetch=manager"

prefetchを使用した場合に予想される出力

{
"uid":"JohnD",
"manager":
{"elements":
[{
"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager\/SusanS",
"manager-uri":
{
"uid":"SusanS",
"manager":"\/idaas_rest\/rest\/userprofile\/people\/SusanS\/manager",
"state":"CA",
"lastname":"Smith",
"firstname":"Susan",
"loginid":"SusanS",
"uniquename":"5B543C30790511E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS",
"country":"USA",
"guid":"5B543C30790511E1AF41BD17BAB1A1C1",
"title":"Sr]]. Director, Development ",
"name":"SusanS",
"commonname":"Susan Smith"
}
}],
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager
?pageSize=0&pagePos=-1"
},
"state":"CA",
"lastname":"Doe",
"firstname":"John",
"loginid":"JohnD",
"uniquename":"2F23AC90790511E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD",
"country":"USA",
"guid":"2F23AC90790511E1AF41BD17BAB1A1C1",
"title":"Director, Development ",
"name":"JohnD",
"commonname":"John Doe"}

prefetchを使用しない場合に予想される出力

{
"uid":"JohnD",
"manager":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager",
"state":"CA",
"lastname":"Doe",
"firstname":"John",
"loginid":"JohnD",
"uniquename":"2F23AC90790511E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD",
"country":"USA",
"guid":"2F23AC90790511E1AF41BD17BAB1A1C1",
"title":"Director, Development ",
"name":"JohnD",
"commonname":"John Doe"}

scope問合せパラメータ機能

scope問合せパラメータを使用して、関係の検索でネストされたレベルの属性を取得します。

次に例を示します。

.../people/JohnD/manager?scope=toTop

scopeは、直接的な階層関係を持つ2つのエンティティ間(たとえば、2ユーザー間のmanager関係や、ユーザーとグループ間のmemberOf関係など)で検索が行われる場合に使用します。

scope問合せパラメータは、manager、reports、groupMemberOf、groupMembers、groupOwnerおよびgroupOwnerOfのユーザー・プロファイル・サービス標準エンティティで使用できます。

注意:

Oracle Access Managementシステム管理コンソールでユーザー・プロファイル・サービス・プロバイダを編集することにより、toTopのscope属性値を構成します。ページの関係構成セクションで、再帰リクエストのスコープ列の値を編集します。詳細は、『Oracle Access Management管理者ガイド』のユーザー・プロファイル・サービス・プロバイダの編集または作成に関する項を参照してください。

この項では1つの例を示します。

- scopeによる関係の検索

scopeによる関係の検索

この例は、scopeをtoTopに設定してmanager関係の検索を行う方法を示しています。

cURLコマンド

ユーザーJohnDの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{
"uid":"JohnD",
"title":"Director, Development ",
"state":"CA",
"lastname":"Doe",
"commonname":"John Doe ",
"firstname":"John",
"password":"secret12345",
"country":"USA"}'

ユーザーSusanSの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{
"uid":"SusanS",
"title":"Sr. Director, Development ",
"state":"CA",
"lastname":"Smith",
"commonname":"Susan Smith",
"firstname":"Susan",
"password":"12345secret",
"country":"USA"}'

ユーザーAlanCの作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/ -d
'{
"uid":"AlanC",
"title":"VP, Identity Management Development ",
"state":"CA",
"lastname":"Cooper",
"commonname":"Alan Cooper",
"firstname":"Alan",
"password":"welcome321",
"country":"USA"}'

JohnDとSusanSの間のmanager関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/JohnD/manager -d
'{
"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS"}'

SusanSとAlanCの間のmanager関係の作成

curl -H "Content-Type: application/json" --request POST
http://localhost:14100/idaas_rest/rest/userprofile/people/SusanS/manager -d
'{
"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS",
"manager-uri":"\/idaas_rest\/rest\/userprofile\/people\/AlanC"}'

scope = toTopでのmanager関係の検索の実行

curl -i --request GET "http://localhost:14100/idaas_rest/rest/userprofile/people/
JohnD/manager/?scope=toTop&pagePos=0&pageSize=2"

scope = toTopを設定した場合に予想される出力

{"next":
"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager
?pageSize=2&scope=toTop&pagePos=1",
"elements":
[{
"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager\/SusanS",
"manager-uri":
{
"uid":"SusanS",
"manager":"\/idaas_rest\/rest\/userprofile\/people\/SusanS\/manager",
"state":"CA",
"lastname":"Smith",
"firstname":"Susan",
"loginid":"SusanS",
"uniquename":"5B543C30790511E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS",
"country":"USA",
"guid":"5B543C30790511E1AF41BD17BAB1A1C1",
"title":"Sr. Director, Development ",
"name":"SusanS",
"commonname":"Susan Smith"
}
},
{
"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS\/manager\/AlanC",
"manager-uri":
{
"uid":"AlanC",
"guid":"31486BE0790611E1AF41BD17BAB1A1C1",
"title":"VP, Identity Management Development ",
"name":"AlanC",
"state":"CA",
"lastname":"Cooper",
"commonname":"Alan Cooper",
"loginid":"AlanC",
"firstname":"Alan",
"uniquename":"31486BE0790611E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/AlanC",
"country":"USA"
}
}],
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager
?pageSize=2&scope=toTop&pagePos=0"}

scope = toTopを設定しない場合に予想される出力

{"elements":
[{
"report-uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager\/SusanS",
"manager-uri":
{
"uid":"SusanS",
"manager":"\/idaas_rest\/rest\/userprofile\/people\/SusanS\/manager",
"state":"CA",
"lastname":"Smith",
"firstname":"Susan",
"loginid":"SusanS",
"uniquename":"5B543C30790511E1AF41BD17BAB1A1C1",
"uri":"\/idaas_rest\/rest\/userprofile\/people\/SusanS",
"country":"USA",
"guid":"5B543C30790511E1AF41BD17BAB1A1C1",
"title":"Sr. Director, Development ",
"name":"SusanS",
"commonname":"Susan Smith"
}
}],
"uri":"\/idaas_rest\/rest\/userprofile\/people\/JohnD\/manager
?pageSize=2&pagePos=0"}

実例

この項の例は、RESTコールの進行を表しています。まずデバイス登録ハンドルが取得され、Mobile and Socialサーバーへの後続のコールで使用されて、ユーザーの認証、保護されたリソースへのアクセス権限の取得、およびユーザー・プロファイル・サービスとの対話が行われます。基本シーケンスは、(1)デバイス登録ハンドルの取得、(2)ユーザー・トークンの取得、(3)アクセス・トークンの取得となります。

注意:

この項に示すRESTの例では、読みやすくするために、改行およびコード・ブロックのインデントを行っています。

- モバイルSSOエージェントによるクライアント登録ハンドルのリクエスト(クライアント・トークン)

- ビジネス・アプリケーションのかわりのモバイルSSOエージェントによるクライアント登録ハンドルのリクエスト

- ユーザー・トークン・リクエスト

- アクセス・トークン・リクエスト

- Access Managerマスター・トークン認証

- KBAレスポンスによるデバイス登録リクエスト

モバイルSSOエージェントによるクライアント登録ハンドルのリクエスト(クライアント・トークン)

この例は、iOSデバイス上のモバイルSSOエージェント・アプリケーションがMobile and Socialサーバーに送信するクライアント登録リクエスト・コールを示しています。

リクエスト

curl -H "Content-Type: application/json" --request POST
http://hostname.example.com:18001/idaas_rest/rest/mobilejwtauthentication/register
-H 'X-IDAAS-SERVICEDOMAIN:MobileServiceDomain'
-d
'{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"jdoe",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTREGHANDLE",
"deviceProfile":
{
"oracle:idm:claims:client:sdkversion":"11.1.2.0.0",
"hardwareIds":
{
"oracle:idm:claims:client:udid":"0e83ff56a12a9cf0c7",
"oracle:idm:claims:client:phonenumber":"1-650-555-1234",
"oracle:idm:claims:client:macaddress":"00-16-41-34-2C-A6",
"oracle:idm:claims:client:imei":"010113006310121"
},
"oracle:idm:claims:client:jailbroken":false,
"oracle:idm:claims:client:geolocation":"+40.689060,-74.044636",
"oracle:idm:claims:client:networktype":"PHONE_CARRIER",
"oracle:idm:claims:client:vpnenabled":false,
"oracle:idm:claims:client:ostype":"iPhone OS",
"oracle:idm:claims:client:phonecarriername":"AT&T",
"oracle:idm:claims:client:locale":"EN-US",
"oracle:idm:claims:client:osversion":"4.0"
}
"clientId":"OICSecurityApp"
}'

レスポンス

{"X-Idaas-Rest-Token-Value":"eyJ0b2tlblR...l9M=",
"X-Idaas-Rest-Token-Type":"CLIENTREGHANDLE",
"handles":
{"oaam.device":
{
"expirationTSInSec":1334423076,
"value":"20_7fe4bde3d448598c4cb8211d214b5eaded0620428c06061b1261644603717cd3"
},
"oaam.session":
{
"expirationTSInSec":1332955447,
"value":"18_2743f64c111cb6691ea18689317958192d748b191a4955851e43f40910079e9a"
}
}
}

ビジネス・アプリケーションのかわりのモバイルSSOエージェントによるクライアント登録ハンドルのリクエスト

リクエスト

curl -H "Content-Type: application/json" --request POST
http://hostname.example.com:18001/idaas_rest/rest/mobilejwtauthentication/register
-H 'X-IDAAS-SERVICEDOMAIN:MobileServiceDomain'
-H 'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="T0lDU2VjdXJ...Gw5TT0="'
-d
'{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"jdoe",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTREGHANDLE",
"deviceProfile":
{
"oracle:idm:claims:client:sdkversion":"11.1.2.0.0",
"hardwareIds":
{
"oracle:idm:claims:client:udid":"0e83ff56a12a9cf0c7",
"oracle:idm:claims:client:phonenumber":"1-650-555-1234",
"oracle:idm:claims:client:macaddress":"00-16-41-34-2C-A6",
"oracle:idm:claims:client:imei":"010113006310121"
},
"oracle:idm:claims:client:jailbroken":false,
"oracle:idm:claims:client:geolocation":"+40.689060,-74.044636",
"oracle:idm:claims:client:networktype":"PHONE_CARRIER",
"oracle:idm:claims:client:vpnenabled":false,
"oracle:idm:claims:client:ostype":"iPhone OS",
"oracle:idm:claims:client:phonecarriername":"AT&T",
"oracle:idm:claims:client:locale":"EN-US",
"oracle:idm:claims:client:osversion":"4.0"
}
"handles":
{"oaam.session":"18_2743f64c111cb6691ea18689317958192d748b191a4955851e43f40910079e9a",
"oaam.device":"20_7fe4bde3d448598c4cb8211d214b5eaded0620428c06061b1261644603717cd3"
},
"clientId":"WhitePageApp"
}'

レスポンス

{"X-Idaas-Rest-Token-Value":"eyJ0b2tlblR...Lyhko=",
"X-Idaas-Rest-Token-Type":"CLIENTREGHANDLE",
"handles":
{"oaam.device":
{
"expirationTSInSec":1334423298,
"value":"20_7fe4bde3d448598c4cb8211d214b5eaded0620428c06061b1261644603717cd3"
},
"oaam.session":
{
"expirationTSInSec":1332955669,
"value":"18_2743f64c111cb6691ea18689317958192d748b191a4955851e43f40910079e9a"
}
}
}

ユーザー・トークン・リクエスト

リクエスト

curl -H "Content-Type: application/json" --request POST
http://hostname.example.com:18001/idaas_rest/rest/mobilejwtauthentication/authenticate
-H 'X-IDAAS-SERVICEDOMAIN:MobileServiceDomain'
-H 'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="T0lDU2VjdXJpdHlBc...Fa00vOD0="'
-d
'{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL",
"X-Idaas-Rest-Subject-Username":"jdoe",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN",
"deviceProfile":
{
"oracle:idm:claims:client:sdkversion":"11.1.2.0.0",
"hardwareIds":
{
"oracle:idm:claims:client:udid":"0e83ff56a12a9cf0c7",
"oracle:idm:claims:client:phonenumber":"1-650-555-1234",
"oracle:idm:claims:client:macaddress":"00-16-41-34-2C-A6",
"oracle:idm:claims:client:imei":"010113006310121"
},
"oracle:idm:claims:client:jailbroken":false,
"oracle:idm:claims:client:geolocation":"+40.689060,-74.044636",
"oracle:idm:claims:client:networktype":"PHONE_CARRIER",
"oracle:idm:claims:client:vpnenabled":false,
"oracle:idm:claims:client:ostype":"iPhone OS",
"oracle:idm:claims:client:phonecarriername":"AT&T",
"oracle:idm:claims:client:locale":"EN-US",
"oracle:idm:claims:client:osversion":"4.0"
}
"handles":
{"oaam.session":"21_9e2e728b3180a7a3c9b80cef542c58339c2c7ed0e1a3ba66db4807ef1cf1523d",
"oaam.device":"23_3a958d144b04f91c53b4236ed9f880357122df946f14ba21d957be5b49ef529b"
}
}'

レスポンス

{"X-Idaas-Rest-Token-Value":"eyJhbGciOiJSUzUx...1OC6qw",
"X-Idaas-Rest-Token-Type":"USERTOKEN",
"handles":
{"oaam.device":
{
"expirationTSInSec":1334424634,
"value":"23_3a958d144b04f91c53b4236ed9f880357122df946f14ba21d957be5b49ef529b"
},
"oaam.session":
{
"expirationTSInSec":1332957005,
"value":"21_9e2e728b3180a7a3c9b80cef542c58339c2c7ed0e1a3ba66db4807ef1cf1523d"
}
}
}

アクセス・トークン・リクエスト

リクエスト

curl -H "Content-Type: application/json" --request POST
http://hostname.example.com:18001/idaas_rest/rest/mobilejwtauthentication/access
-H 'X-IDAAS-SERVICEDOMAIN:MobileServiceDomain'
-H 'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="T0lDU2VjdXJpdHlBc...TFPQzZxdw=="'
-d
'{
"X-Idaas-Rest-Subject-Type":"TOKEN",
"X-Idaas-Rest-Subject-Value":"eyJhbGciOiJSUzUxM...411OC6qw",
"X-Idaas-Rest-Application-Context":"<webgate context>",
"X-Idaas-Rest-Application-Resource":"http:\/\/am-v40z-04.us.example.com:7777\/index.html",
"X-Idaas-Rest-New-Token-Type-To-Create":"ACCESSTOKEN",
"deviceProfile":
{
"oracle:idm:claims:client:sdkversion":"11.1.2.0.0",
"hardwareIds":
{
"oracle:idm:claims:client:udid":"0e83ff56a12a9cf0c7",
"oracle:idm:claims:client:phonenumber":"1-650-555-1234",
"oracle:idm:claims:client:macaddress":"00-16-41-34-2C-A6",
"oracle:idm:claims:client:imei":"010113006310121"
},
"oracle:idm:claims:client:jailbroken":false,
"oracle:idm:claims:client:geolocation":"+40.689060,-74.044636",
"oracle:idm:claims:client:networktype":"PHONE_CARRIER",
"oracle:idm:claims:client:vpnenabled":false,
"oracle:idm:claims:client:ostype":"iPhone OS",
"oracle:idm:claims:client:phonecarriername":"AT&T",
"oracle:idm:claims:client:locale":"EN-US",
"oracle:idm:claims:client:osversion":"4.0"
}
"handles":
{"oaam.session":"21_9e2e728b3180a7a3c9b80cef542c58339c2c7ed0e1a3ba66db4807ef1cf1523d",
"oaam.device":"23_3a958d144b04f91c53b4236ed9f880357122df946f14ba21d957be5b49ef529b"
}
}'

Access Managerマスター・トークン認証

リクエスト

curl -H "Content-Type: application/json" --request POST
http://hostname.example.com:18001/idaas_rest/rest/mobilejwtauthentication/authenticate
-H 'X-IDAAS-SERVICEDOMAIN:MobileServiceDomain'
-H 'X-IDAAS-REST-AUTHORIZATION: UIDPASSWORD cred="T0lDU2VjdXJpdHlBc...TFPQzZxdw=="'
-d
'{
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL"
"X-Idaas-Rest-Subject-Username":"jdoe",
"X-Idaas-Rest-Subject-Password":"password123",
"X-Idaas-Rest-New-Token-Type-To-Create":"USERTOKEN",
"OAM-Token-Type-To-Create":"USERTOKEN::OAMMT",
"deviceProfile":
{
"oracle:idm:claims:client:sdkversion":"11.1.2.0.0",
"hardwareIds":
{
"oracle:idm:claims:client:udid":"0e83ff56a12a9cf0c7",
"oracle:idm:claims:client:phonenumber":"1-650-555-1234",
"oracle:idm:claims:client:macaddress":"00-16-41-34-2C-A6",
"oracle:idm:claims:client:imei":"010113006310121"
},
"oracle:idm:claims:client:jailbroken":false,
"oracle:idm:claims:client:geolocation":"+40.689060,-74.044636",
"oracle:idm:claims:client:networktype":"PHONE_CARRIER",
"oracle:idm:claims:client:vpnenabled":false,
"oracle:idm:claims:client:ostype":"iPhone OS",
"oracle:idm:claims:client:phonecarriername":"AT&T",
"oracle:idm:claims:client:locale":"EN-US",
"oracle:idm:claims:client:osversion":"4.0"
}
"handles":
{"oaam.session":"21_9e2e728b3180a7a3c9b80cef542c58339c2c7ed0e1a3ba66db4807ef1cf1523d",
"oaam.device":"23_3a958d144b04f91c53b4236ed9f880357122df946f14ba21d957be5b49ef529b"
}
}'

KBAレスポンスによるデバイス登録リクエスト

ナレッジベース認証(KBA)は、ユーザーが少なくとも1つの質問に答えることを求められる認証スキームです。

デバイス登録リクエスト

curl -H "Content-Type: application/json" --request POST
http://server1.domain.com:14100/
oic_rest/rest/mobileoamauthentication/register  -H
'X-IDAAS-SERVICEDOMAIN:MobileServiceDomain' -d
'{"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTREGHANDLE",
"X-Idaas-Rest-Subject-Password":"welcome1",
"deviceProfile":{"oracle:idm:claims:client:sdkversion":"11.1.2.0.0","hardwareIds":
{"oracle:idm:claims:client:udid":"0e83ff56a12a9cf0c7",
"oracle:idm:claims:client:phonenumber":"1-650-555-1234",
"oracle:idm:claims:client:macaddress":"00-16-41-34-2C-A6",
"oracle:idm:claims:client:imei":"010113006310121"},
"oracle:idm:claims:client:jailbroken":false,
"oracle:idm:claims:client:geolocation":"+40.689060,-74.044636",
"oracle:idm:claims:client:networktype":"PHONE_CARRIER",
"oracle:idm:claims:client:vpnenabled":false,
"oracle:idm:claims:client:ostype":"iPhone OS",
"oracle:idm:claims:client:phonecarriername":"AT&T",
"oracle:idm:claims:client:locale":"EN-US",
"oracle:idm:claims:client:osversion":"4.0"},
"X-Idaas-Rest-Subject-Username":"JohnS","clientId":"OICSSOApp",
"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL"}'

KBA質問を含むレスポンス

{"handles":{"oaam.device":{"expirationTSInSec":1352076952,"value":"563_
23552f26e974030dc16018cc6b76237432c363d47a019cec8c73aa318caf2f97"},
"oaam.session":{"expirationTSInSec":1350609323,"value":"561_
419dc5ee6b325535dd026c882ac67cabc271dd7e0297ab73c74573a49dec233a"},
"oic.multiStepAuthnSessionHandle":{"expirationTSInSec":1350606623,"value":
"eyJvcmlnU2VjdXJpdHlFdmVudHMiOlsiUkVHX1NFQ1VSSVRZX0NMSUVOVF9BUFAiXSwib3JpZ1JlcU1hc
CI6eyJjbGllbnRJUEFkZHJlc3MiOiIxMC4xMzMuMTM5LjE0MyIsIlgtSWRhYXMtUmVzdC1TdWJqZWN0LVB
hc3N3b3JkIjoid2VsY29tZTEiLCJYLUlkYWFzLVJlc3QtTmV3LVRva2VuLVR5cGUtVG8tQ3JlYXRlIjoiQ
0xJRU5UUkVHSEFORExFIiwiWC1JZGFhcy1SZXN0LVN1YmplY3QtVXNlcm5hbWUiOiJKb2huUyIsImNsaWV
udElkIjoiT0lDU1NPQXBwIiwiWC1JZGFhcy1SZXN0LVN1YmplY3QtVHlwZSI6IlVTRVJDUkVERU5USUFMI
n0sImNvbnRyYWN0TmFtZSI6Ik1vYmlsZVNlcnZpY2VEb21haW4iLCJzZXJ2aWNlSWRFUCI6IlwvbW9iaWx
lb2FtYXV0aGVudGljYXRpb24ifQ=="}},"message":
"The Challenge Action is triggered",
"multi-step-challenge-question":{"challengeType":"KBA","locale":"en",
"questionRefId":"112","questionStr":
"What was the year of your favorite sports moment?"},
"oicErrorCode":"IDAAS-61010","status":"REQUIRE_MULTI_STEP_AUTHN"}

KBA回答を含むデバイス登録リクエスト

curl -H "Content-Type: application/json" --request POST
http://server1.domain.com:14100/oic_rest/rest/mobileoamauthentication/register
-H 'X-IDAAS-SERVICEDOMAIN:MobileServiceDomain' -d
'{"X-Idaas-Rest-New-Token-Type-To-Create":"CLIENTREGHANDLE",
"X-Idaas-Rest-Subject-Password":"welcome1","deviceProfile":
{"oracle:idm:claims:client:sdkversion":"11.1.2.0.0","hardwareIds":
{"oracle:idm:claims:client:udid":"0e83ff56a12a9cf0c7",
"oracle:idm:claims:client:phonenumber":"1-650-555-1234",
"oracle:idm:claims:client:macaddress":"00-16-41-34-2C-A6",
"oracle:idm:claims:client:imei":"010113006310121"},
"oracle:idm:claims:client:jailbroken":false,
"oracle:idm:claims:client:geolocation":"+40.689060,-74.044636",
"oracle:idm:claims:client:networktype":"PHONE_CARRIER",
"oracle:idm:claims:client:vpnenabled":false,
"oracle:idm:claims:client:ostype":"iPhone OS",
"oracle:idm:claims:client:phonecarriername":"AT&T",
"oracle:idm:claims:client:locale":"EN-US",
"oracle:idm:claims:client:osversion":"4.0"},
"X-Idaas-Rest-Subject-Username":"JohnS","multi-step-challenge-answer":
{"challengeType":"KBA","locale":"EN-US","answerStr":
"moment","questionRefId":"112"},
"handles":{"oaam.session":"561_419dc5ee6b325535dd026c882ac67cabc271dd7e0297ab73c74573a49dec233a",
"oaam.device":"563_23552f26e974030dc16018cc6b76237432c363d47a019cec8c73aa318caf2f97",
"oic.multiStepAuthnSessionHandle":
"eyJvcmlnU2VjdXJpdHlFdmVudHMiOlsiUkVHX1NFQ1VSSVRZX0NMSUVOVF9BUFAiXSwib3JpZ1JlcU1hc
CI6eyJjbGllbnRJUEFkZHJlc3MiOiIxMC4xMzMuMTM5LjE0MyIsIlgtSWRhYXMtUmVzdC1TdWJqZWN0LVB
hc3N3b3JkIjoid2VsY29tZTEiLCJYLUlkYWFzLVJlc3QtTmV3LVRva2VuLVR5cGUtVG8tQ3JlYXRlIjoiQ
0xJRU5UUkVHSEFORExFIiwiWC1JZGFhcy1SZXN0LVN1YmplY3QtVXNlcm5hbWUiOiJKb2huUyIsImNsaWV
udElkIjoiT0lDU1NPQXBwIiwiWC1JZGFhcy1SZXN0LVN1YmplY3QtVHlwZSI6IlVTRVJDUkVERU5USUFMI
n0sImNvbnRyYWN0TmFtZSI6Ik1vYmlsZVNlcnZpY2VEb21haW4iLCJzZXJ2aWNlSWRFUCI6IlwvbW9iaWx
lb2FtYXV0aGVudGljYXRpb24ifQ=="},"X-Idaas-Rest-Subject-Type":"USERCREDENTIAL"}'

クライアント登録ハンドルが含まれるレスポンス

{"X-Idaas-Rest-Token-Value":"eyJvcmFjbGU6aWRtOmNsYWltczpjbGllbnQ6c2RrdmVyc2lvbiI6I
jExLjEuMi4wLjAiLCJ0b2tlblR5cGUiOiJDTElFTlRSRUdIQU5ETEUiLCJvcmFjbGU6aWRtOmNsYWltczp
jbGllbnQ6bWFjYWRkcmVzcyI6IjAwLTE2LTQxLTM0LTJDLUE2IiwicmVnVXNlciI6IkpvaG5TIiwiaXNzI
joiTW9iaWxlT0FNQXV0aGVudGljYXRpb24iLCJvcmFjbGU6aWRtOmNsYWltczpjbGllbnQ6b3N0eXBlIjo
iaVBob25lIE9TIiwib3JhY2xlOmlkbTpjbGFpbXM6Y2xpZW50OmltZWkiOiIwMTAxMTMwMDYzMTAxMjEiL
CJyZWdUUyI6MTM1MDYwNTc4MCwianRpIjoiYTNlMWM1MjYtYjBjMS00ZDg0LThjYzAtZjYyMDNmYjM4NWV
lIiwib3JhY2xlOmlkbTpjbGFpbXM6Y2xpZW50Om9zdmVyc2lvbiI6IjQuMCIsImNsaWVudElkIjoiT0lDU
1NPQXBwIn0=.qA6Ez+gXNdLbk/hD5LRVDaBRK3t6b6IOOk7Z8iwW03s=",
"X-Idaas-Rest-Token-Type":"CLIENTREGHANDLE",
"handles":{"oaam.device":{"expirationTSInSec":1352077009,"value":"563_
23552f26e974030dc16018cc6b76237432c363d47a019cec8c73aa318caf2f97"},
"oaam.session":{"expirationTSInSec":1350609380,"value":"561_
419dc5ee6b325535dd026c882ac67cabc271dd7e0297ab73c74573a49dec233a"}}}

第IV部

Identity Federationによる開発

この部では、Oracle Access Management Identity Federation APIを使用したアプリケーションの開発について説明します。

この部の構成は、次のとおりです。

- 第13章「カスタム・ユーザー・プロビジョニング・プラグインの開発」

13 カスタム・ユーザー・プロビジョニング・プラグインの開発

Oracle Access Management Identity Federation (Identity Federation)は、Access Managerのプラグイン・フレームワークを使用して、ユーザーのプロビジョニングを容易に行えるようにします。標準のユーザー・プロビジョニング・プラグインが提供されており、さらに、ここで説明するように、カスタムのプラグインを開発することもできます。この章の内容は次のとおりです。

- 第13.1項「ユーザー・プロビジョニング・プラグインの概要」

- 第13.2項「プラグイン・インタフェースの概要」

- 第13.3項「サンプル・コード: カスタム・ユーザー・プロビジョニング・プラグイン」

- 第13.4項「ユーザー・プロビジョニング・プラグインの開発」

参照:

デフォルトのユーザー・プロビジョニング・プラグインの使用方法の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

13.1 ユーザー・プロビジョニング・プラグインの概要

Identity Federationがサービス・プロバイダ(SP)モードで動作している場合、ユーザー・アサーションはローカル・ストアにマップされ、フェデレーテッド・シングル・サインオンを実行します。ただし、場合によっては、サービス・プロバイダがユーザー・アサーションを実行する際に、ユーザーが見つからないことがあります。デフォルトのユーザー・プロビジョニング・プラグイン(LDAPProvisioningPlugin)は、Access Managerアイデンティティ・ストアとして構成されたLDAPストア内のユーザーをプロビジョニングします。

実行時に収集されたすべての情報は、標準またはカスタムの任意のユーザー・プロビジョニング・プラグインに渡されます。カスタムのユーザー・プロビジョニング・プラグインは、この情報に基づいて、取得および使用する必要のあるユーザー情報を決定する必要があります。また、各カスタム・プラグインには、プロビジョニングするユーザーの追加処理を実行するための独自の構成を含めることができます。

Identity FederationがSPモードで動作しており、アサーションのユーザーへのマップに失敗した場合、Identity Federationはそのユーザーをプロビジョニングする必要があるかどうかを確認するため、構成プロパティを探します。ユーザー・プロビジョニング・フラグがtrueに設定されている場合、Identity Federationは起動する必要のあるプラグイン名を検索します。カスタム・プラグインが使用されていない場合は、標準プラグイン(LDAPProvisioningPlugin)がデフォルトで起動されます。GenricPluginFactoryを使用して定義されているプラグインを検索し、プロビジョニング・ロジックを実行します。

Identity Federationは、パートナnameideattrnameに関連付けられたプロパティを取得し、プラグインに送信された属性リストのnameid値に移入します。Identity Federationが標準プラグインを使用するように構成されている場合、データ・ストアの選択肢は次のとおりです。

- Identity Federationがパートナ固有のデータ・ストア(マルチストア)を使用している場合、Identity Federationはアイデンティティ・ストア名をプラグインに渡します。

- Identity Federationがデフォルトのユーザー・アイデンティティ・ストアを使用する場合、標準のプラグインはユーザー・プロビジョニングAPIを使用して、データ・ストアのユーザー・データをプロビジョニングします。

- パートナ固有のストアが構成されていない場合は、デフォルトのアイデンティティ・ストアが使用されます。

デフォルトのアイデンティティ・ストアとパートナ固有のストアのどちらが使用されるかに関係なく、ユーザーのプロビジョニングに使用されるユーザー・プロビジョニングAPIは同じです。

13.2 プラグイン・インタフェースの概要

カスタムのユーザー・プロビジョニング・プラグインが拡張する主なクラスはOIFUserProvisioningPluginです。次のインタフェースがカスタム・プラグインに対して公開されています。

- oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPlugin.java (oracle.security.am.plugin.AbstractAMPluginを拡張します)

- oracle.security.fed.plugins.fed.provisioning.UserContext.java

- oracle.security.fed.plugins.fed.provisioning.UserProvisioningException.java

- oracle.security.fed.plugins.fed.provisioning.UserProvisioningConstants.java

これらのインタフェースの詳細は、Oracle Fusion Middleware Oracle Access Management Identity Federationユーザー・プロビジョニング・プラグインJava APIリファレンスを参照してください。

13.3 サンプル・コード: カスタム・ユーザー・プロビジョニング・プラグイン

カスタムのユーザー・プロビジョニング・プラグインのjarファイル構造は、Access Managerのカスタム認証プラグイン構造に準拠している必要があります。つまり、これには、plugin.class、plugin.xmlおよびMANIFEST.MFファイルが必要です。この構造の詳細は、第3.4項「サンプル・コード: カスタム・データベース・ユーザー認証プラグイン」を参照してください。

この項では、次のユーザー・プロビジョニング・プラグインのコード・サンプルを示します。

- 例13-1「UserProvisioning.javaのサンプル」

- 例13-2「UserPlugin.xmlのサンプル」

- 例13-3「MANIFEST.MFのサンプル」

例13-1 UserProvisioning.javaのサンプル

package oif.test;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

import oracle.security.am.plugin.ExecutionStatus;
import oracle.security.am.plugin.MonitoringData;
import oracle.security.am.plugin.PluginConfig;
import oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPlugin;
import oracle.security.fed.plugins.fed.provisioning.UserContext;
import oracle.security.fed.plugins.fed.provisioning.UserProvisioningConstants;
import oracle.security.fed.plugins.fed.provisioning.UserProvisioningException;

/*
* Sample OIF User proisioning plugin
*/

public class ProvisioningPlugin extends OIFUserProvisioningPlugin {

private boolean monitoringStatus = false;
private Map paramMap ;
private String userRecordAttrList = null;
private String useridAssertionAttr = null;

/* (non-Javadoc)
*/
@Override
public ExecutionStatus process(UserContext context) throws UserProvisioningException {
/*
* Execute method for plugin
*/
boolean provisioningStatus = false;
try{
Map<String, Object> attrs = context.getAttributes();
Map<String, Object> attrsMapping = context.getAttributesUsedInMapping();
if (useridAssertionAttr == null) {
System.out.println("User id attribute to create user is not found in the attributes list");
return ExecutionStatus.ABORT;
}

String userid = null;
if (attrs.containsKey(useridAssertionAttr)) {
Object valueObj = attrs.get(useridAssertionAttr);
if (valueObj instanceof String)
userid = (String) valueObj;
else {
userid = (String)((Set) valueObj).iterator().next();
}
}

DirContext ctx = getContext();

// creating the user record
Attributes record = new BasicAttributes();

// Create the objectclass to add
Attribute objClasses = new BasicAttribute("objectClass");
objClasses.add("top");
objClasses.add("person");
String objectClass = "inetOrgPerson";
objClasses.add(objectClass);
objClasses.add("organizationalPerson");
record.put(objClasses);

String userIDAttr = "uid";

// Set the attributes
record.put(new BasicAttribute(userIDAttr, userid));
StringTokenizer st = new StringTokenizer(userRecordAttrList, ",");
while (st.hasMoreTokens()) {
String key = (String) st.nextToken();
record.put(new BasicAttribute(key, attrs.get(key)));
}
Set keys = attrsMapping.keySet();
Iterator itr = keys.iterator();
while (itr.hasNext()) {
String key = (String) itr.next();
if (!attrs.containsKey(key)) {
record.put(new BasicAttribute(key, attrsMapping.get(key)));

}

String ldapUserBaseDN = "dc=iplanet,dc=com";
// Create the record
ctx.createSubcontext("cn=" + userid + "," + ldapUserBaseDN, record);
provisioningStatus = true;
}
catch(Exception e){
/*
* If exception abort the authentication.
*/
e.printStackTrace();
return ExecutionStatus.ABORT;
}

if( provisioningStatus){
/*
* Success
*/
return ExecutionStatus.SUCCESS;
}else{
/*
* Failure.
*/
return ExecutionStatus.FAILURE;
}
}

/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#initialize(java.util.Map)
*/
@Override
public ExecutionStatus initialize(PluginConfig config) {
//success for the execution status
userRecordAttrList = (String)config.getParameter(UserProvisioningConstants.KEY_USER_RECORD_ATTRIBUTE_LIST);
useridAssertionAttr = (String)config.getParameter(UserProvisioningConstants.KEY_USERID_ATTRIBUTE_NAME);

return ExecutionStatus.SUCCESS;
}

/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getDescription()
*/
@Override
public String getDescription() {
return "Ldap Provisioning Plugin";
}

/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getMonitoringData()
*/
@Override
public Map < String, MonitoringData > getMonitoringData() {
// TODO Auto-generated method stub
return null;
}

/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getMonitoringStatus()
*/
@Override
public boolean getMonitoringStatus() {
return monitoringStatus;
}

/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getName()
*/
@Override
public String getPluginName() {
return "LDAP_Provisioning_plugin";
}

/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getVersion()
*/
@Override
public int getRevision() {
return 10;
}

/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#setMonitoringStatus(boolean)
*/
@Override
public void setMonitoringStatus(boolean status) {
monitoringStatus = status;
}

private DirContext getContext() {
try {
DirContext context = null;

String ldapURL = "ldap://myldap.oracle.com:389";
String ldapUserBaseDN = "dc=iplanet,dc=com";

Hashtable<String, String> env = new Hashtable <String, String> ();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.REFERRAL, "follow");

String credential = "password";
String secPrincipal = "cn=Directory Manager";
env.put(Context.SECURITY_PRINCIPAL, secPrincipal);
env.put(Context.SECURITY_CREDENTIALS, credential);

context = new InitialDirContext (env);
return context;
} catch (NamingException ne) {
throw new UserProvisioningException(ne);
} catch (Throwable e) {
throw new UserProvisioningException(e);
}

}
}

例13-2 UserPlugin.xmlのサンプル

<Plugin type="User Provisioning">
<author>uid=User1</author>
<email>User1@mycompany</email>
<creationDate>09:32:20,2012-06-15</creationDate>
<description>User provisioning</description>
<configuration>
<AttributeValuePair>
<Attribute type="string" length="100">KEY_USERID_ATTRIBUTE_NAME</Attribute>
<mandatory>false</mandatory>
<instanceOverride>false</instanceOverride>
<globalUIOverride>true</globalUIOverride>
<value>uid</value>
</AttributeValuePair>
<AttributeValuePair>
<Attribute type="string" length="200">KEY_USER_RECORD_ATTRIBUTE_LIST</Attribute>
<mandatory>true</mandatory>
<instanceOverride>false</instanceOverride>
<globalUIOverride>true</globalUIOverride>
<value>mail,uid</value>
</AttributeValuePair>
</configuration>
</Plugin>

例13-3 MANIFEST.MFのサンプル

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ProvisioningPlugin
Bundle-SymbolicName: ProvisioningPlugin
Bundle-Version: 10
Bundle-Activator: oif.test.ProvisioningPlugin
Import-Package: org.osgi.framework;version="1.3.0",oracle.security.fed.plugins.fed.provisioning
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

13.4 ユーザー・プロビジョニング・プラグインの開発

この項では、カスタムのIdentity Federationユーザー・プロビジョニング・プラグインの記述手順を示します。以降では、システム・アーキテクトがカスタム・プラグインのビジネス要件を識別し、ユーザーがローカル・ユーザー・ストアにマップされていない場合のユーザー・プロビジョニング・フローを検討した後に開発者が実行する必要があるアクションについて説明します。

この項には次のトピックが含まれます。

- プロセスの概要: カスタム・プラグインの開発

- プラグインのコンパイルに必要なファイル

13.4.1 プロセスの概要: カスタム・プラグインの開発

Identity FederationはAccess Managerプラグイン・フレームワークを使用するので、それらプロセスは類似しています。詳細は、第3.1.2項「計画、認証モデルおよびプラグインについて」を参照してください。

1. OIFUserProvisioningPluginクラスを拡張し、次のメソッドを実装します。詳細は、第3.5.1項「カスタム認証プラグインの記述について」を参照してください。

- initializeメソッドの実装

- processメソッドの実装

2. 適切なAccess Manager 11gインタフェースおよびパッケージを使用して、プラグイン・コードを開発します。詳細は、次を参照してください。

- 第3.3項「プラグイン・インタフェースの概要」

- 第3.4項「サンプル・コード: カスタム・データベース・ユーザー認証プラグイン」

3. カスタム・プラグインのメタデータを作成します。詳細は、第3.4.2項「プラグイン構成メタデータ要件のサンプル」を参照してください。

4. プラグインjarファイルおよびマニフェストを作成し、これらをデプロイ・チームに引き渡します。詳細は、次を参照してください。

- 第3.4.3項「プラグインのサンプル・マニフェスト・ファイル」

- 第3.4.4項「プラグインJARファイル構造」

5. 第13.4.2項「プラグインのコンパイルに必要なファイル」に進みます。

カスタム認証プラグインのデプロイと管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

13.4.2 プラグインのコンパイルに必要なファイル

カスタムのユーザー・プロビジョニング・プラグインをコンパイルするには、次のjarファイルが必要です。

- felix.jar

- oam-plugin.jar

- fed.jar

これらのファイルは、DOMAIN_HOME/servers/managed_instance_name/tmp/_WL_user/oam_server_11.1.2.0.0/RANDOM_STRING/APP-INF/libに置かれています。

第V部

Security Token Serviceによる開発

この部では、Oracle Access Management Security Token Service APIを使用したアプリケーションの開発について説明します。

第V部の構成は次のとおりです。

- 第14章「カスタム・トークン・モジュールの開発」

14 カスタム・トークン・モジュールの開発

Oracle Security Token Serviceにおいて、検証または発行するトークンがデフォルトでサポートされていない場合、独自の検証および発行モジュール・クラスを記述できます。この章では、Oracle Security Token Serviceのカスタム・トークン・オプションについて説明します。内容は、次のとおりです。

- 第14.1項「Oracle Security Token Serviceカスタム・トークン・モジュール・クラスの概要」

- 第14.2項「TokenValidatorModuleクラスの記述」

- 第14.3項「TokenIssuanceModuleクラスの記述」

14.1 Oracle Security Token Serviceカスタム・トークン・モジュール・クラスの概要

カスタム・トークンには、2つ(検証または発行クラス)のいずれかが必要です。

- カスタム検証クラス: カスタム・トークンの検証に使用します。

- カスタム発行クラス: カスタム・トークンの発行に使用します。

次の概要では、実行する必要があるタスクを説明します。

タスク概要: カスタム・トークン・モジュール・クラスのデプロイ

1. TokenValidatorModuleクラスを記述し、必要に応じて、Oracle Security Token Serviceによりカスタム・トークンを検証します。

2. TokenIssuanceModuleクラスを記述し、必要に応じて、Oracle Security Token Serviceによりカスタム・トークンを発行します。

3. カスタム・トークンの検証テンプレートおよび発行テンプレートをユーザーが作成できるカスタム・トークン・モジュールを作成します。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

4. カスタム・トークンの検証および発行テンプレートを作成し、そのカスタム・テンプレートを、標準トークンのテンプレートを使用するようにエンドポイントおよびパートナ・プロファイルで使用します。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

14.2 TokenValidatorModuleクラスの記述

ここでは、次の内容について説明します。

- TokenValidatorModuleクラスの記述について

- TokenValidatorModuleクラスの記述

14.2.1 TokenValidatorModuleクラスの記述について

Oracle Security Token Service検証モジュール・クラスは、oracle.security.fed.sts.token.tpe.TokenValidatorModuleインタフェースを実装します。検証プロセスでは、次のプロパティをTokenContextからフェッチできます。

- XML_TOKEN: 検証が必要なトークンが含まれるXMLメッセージのバイト数。

- BST_VALUE_TYPE: カスタム・トークンがバイナリ・セキュリティ・トークンとして送信される場合、これにはバイナリ・セキュリティ・トークン値タイプが含まれます。

- BST_ENCODING: トークンがバイナリ・セキュリティ・トークンとして送信される場合、これにはエンコーディングが含まれます。

- BST_CONTENT: トークンがバイナリ・セキュリティ・トークンとして送信される場合、これにはバイナリ・セキュリティ・トークン・コンテンツが含まれます。

- TOKEN_ELEMENT: トークンがバイナリ・セキュリティ・トークンではなく、Oracle Security Token Service内部クラスにJAXB表現がない場合、これにはトークンを表すXML要素またはカスタムJAXBクラスが含まれます。

- XML_DOM: これは着信メッセージのDOM表現です。これは、DOMオブジェクトがこれまでOracle Security Token Service処理の一部として作成されていた場合のみ存在します。

トークンは、TokenContextのプロパティの情報を使用して検証される必要があり、TokenResultが戻される必要があります。TokenResultオブジェクトで次のプロパティを設定し、Oracle Security Token Serviceに情報を戻すことができます。

- TPE_RESULT_FAILURE_CODE: 失敗した場合の失敗コード。

- TPE_RESULT_FAILURE_STRING: 失敗を説明する文字列。

- 結果で設定された他のプロパティは、トークン・マッピングに使用される状況において使用可能です。通常、バリデータはSTS_SUBJECT_IDプロパティを名前IDに設定し、これを使用してユーザー・レコードにマップします。

例14-1 EmailTokenValidatorModuleImpl.java

package oracle.security.fed.sts.tpe.providers.email;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import oracle.security.fed.sts.token.tpe.TokenContext;
import oracle.security.fed.sts.token.tpe.TokenProcessingException;
import oracle.security.fed.sts.token.tpe.TokenResult;
import oracle.security.fed.sts.token.tpe.TokenValidatorModule;
import oracle.security.fed.sts.token.tpe.TokenResultImpl;
import oracle.security.fed.sts.tpe.providers.TokenValidationErrors;
import oracle.security.fed.xml.security.wss.ext.v10.BinarySecurityTokenType;
import oracle.security.fed.util.common.Base64;
import sun.misc.BASE64Decoder;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class EmailTokenValidatorModuleImpl implements TokenValidatorModule{

private Map options = null;
private String testSetting = null;

private static final String TEST_SETTING_IN_TEMPLATE = "testsetting";

public void init(Map options1) throws TokenProcessingException{

options = options1;
try{
testSetting = (String)options.get(TEST_SETTING_IN_TEMPLATE);
}catch(Exception e){
throw new TokenProcessingException(e);
}

}

public TokenResult validate(TokenContext context) throws TokenProcessingException{

byte[] tokenBytes = (byte[])context.getOtherProperties().get("XML_TOKEN");
Document inputDocument = (Document)context.getOtherProperties().get("XML_DOM");

Element tokenElement = (Element)context.getOtherProperties().get("TOKEN_ELEMENT");
String encodedBytes = (String) context.getOtherProperties().get("BST_CONTENT");
byte[] decodedBytes = null;
BASE64Decoder decoder = new BASE64Decoder();
try{
if(encodedBytes != null){
decodedBytes = decoder.decodeBuffer(encodedBytes);
}
}catch(java.io.IOException exp){
exp.printStackTrace();
}

if(tokenElement != null && tokenElement.getLocalName().equals("email")){
String emailAddress = tokenElement.getTextContent();
TokenResultImpl result = null;
result = new TokenResultImpl(0, TokenResult.SUCCESS, null);
result.setTokenProperty("STS_SUBJECT_ID", emailAddress);

//add any other attributes - necessary only if you need for mapping or issuance
result.setTokenProperty("testattr2", "attr2");

return result;
}else if (decodedBytes != null) {
String emailAddress = new String(decodedBytes);
TokenResultImpl result = null;
result = new TokenResultImpl(0, TokenResult.SUCCESS, null);
result.setTokenProperty("STS_SUBJECT_ID", emailAddress);

//add any other attributes - necessary only if you need for mapping or issuance
result.setTokenProperty("testattr2", "attr2");

return result;

} else {
TokenResultImpl result = new TokenResultImpl(0, TokenResult.FAILURE, null);
String failureCode = null;
failureCode = "TEST_FAILURE_CODE";

result.setTokenProperty("TPE_RESULT_FAILURE_CODE", failureCode);
result.setTokenProperty("TPE_RESULT_FAILURE_STRING", "validation failed");
return result;
}

}
}

次の概要では、このモジュール・クラスの開発におけるハイライトを説明します。

開発におけるハイライト: TokenValidatorModuleクラスの記述

1. init(Map options)メソッドを実装します。これはTokenValidatorModuleが初期化された場合にコールされます。initメソッドは、検証テンプレートで定義されたパラメータが含まれるマップに渡されます。

2. validate(TokenContext context)メソッドを実装します。これは、特定の着信カスタム・トークンを検証する必要がある場合にコールされます。

1. TokenContextオブジェクトのプロパティからトークン情報をフェッチします。

2. トークンを検証し、TokenResultオブジェクトを戻します。
成功時には次を戻します。

TokenResultImpl result = new TokenResultImpl(0, TokenResult.SUCCESS, token);

失敗時には次を戻します。

TokenResultImpl result = new TokenResultImpl(0, TokenResult.FAILURE, token);
result.setTokenProperty("TPE_RESULT_FAILURE_CODE", failureCode);
result.setTokenProperty("TPE_RESULT_FAILURE_STRING", "validation failed");

3. 検証済トークン結果において、トークンのSubjectIDおよびトークンに基づいて解析された属性が次の形式で戻されることを確認します。

result.setTokenProperty("STS_SUBJECT_ID", emailAddress);

//add any other attributes - necessary only if you need for mapping or issuance
result.setTokenProperty("testattr2", "attr2")

14.2.2 TokenValidatorModuleクラスの記述

次のタスクを実行し、カスタムTokenValidatorModuleクラスを記述します。

タスクの概要: TokenValidatorModuleクラスの記述

1. 次を参照して、独自のモジュール・クラスを開発します。

- 第14.2.1項「TokenValidatorModuleクラスの記述について」

- Oracle Fusion Middleware Oracle Access Management Security Token Service Java APIリファレンス

2. 必要に応じて次に進みます。

- 第14.3項「TokenIssuanceModuleクラスの記述」

- Security Token Serviceのカスタム構成の管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

14.3 TokenIssuanceModuleクラスの記述

ここでは、次の内容について説明します。

- TokenIssuanceModuleクラスの記述について

- TokenIssuanceModuleクラスの記述

14.3.1 TokenIssuanceModuleクラスの記述について

EmailTokenIssuerModuleImpl.javaクラスは、oracle.security.fed.sts.token.tpe.TokenIssuerModuleインタフェースおよびTokenContextの属性を実装する必要があります。

例14-2は、EmailTokenIssuanceModuleImplクラスの例を示しています。次の概要では、このモジュール・クラスの開発におけるハイライトを説明します。

例14-2 EmailTokenIssuanceModule.java

package oracle.security.fed.sts.tpe.providers.email;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

import javax.xml.namespace.QName;

import oracle.security.fed.sts.token.tpe.TokenContext;
import oracle.security.fed.sts.token.tpe.TokenIssuerModule;
import oracle.security.fed.sts.token.tpe.TokenProcessingException;
import oracle.security.fed.sts.token.tpe.TokenResult;
import oracle.security.fed.sts.token.tpe.Token;
import oracle.security.fed.sts.token.tpe.TokenImpl;
import oracle.security.fed.sts.token.tpe.TokenResult;
import oracle.security.fed.sts.token.tpe.TokenResultImpl;

public class EmailTokenIssuerModuleImpl implements TokenIssuerModule{

Map config;

private static final String TEST_SETTING_IN_TEMPLATE = "testsetting";

public void init(Map options) throws TokenProcessingException
{
config = options;
}
public TokenResult issue(TokenContext context) throws TokenProcessingException
{
//use any config options necessary for processing from issuance template
String setting = (String)config.get(TEST_SETTING_IN_TEMPLATE);

HashMap attributes = (HashMap)context.getOtherProperties().get("STS_TOKEN_ATTRIBUTES");
System.out.println("attributes : " + attributes.toString());
String emailAddress = null;
Iterator attrIter = null;
if (attributes != null) {
attrIter = attributes.keySet().iterator();
}
if (attrIter != null) {
while (attrIter.hasNext()) {
String attributeName = (String)attrIter.next();
if ("mail".equals(attributeName)) {
Object valuesObj = attributes.get(attributeName);
if (valuesObj instanceof List){
Iterator iter = ((List)valuesObj).iterator();

while (iter.hasNext()) {
Object valueObj = iter.next();
if(valueObj instanceof String){
emailAddress = (String)valueObj;
break;
}
}
} else if (valuesObj instanceof String) {
emailAddress = (String)valuesObj;
}
}
}
}

String email = "<email>" + emailAddress + "</email>";
System.out.println("email : " + email);
TokenImpl token = new TokenImpl();
byte[] tokenBytes = email.getBytes();

token.setTokenBytes(tokenBytes);
//set the below if you have a doc object that can be reused
token.setTokenDocument(null);

token.setTokenBytes(tokenBytes);
TokenResultImpl result = new TokenResultImpl(0, TokenResult.SUCCESS, token);
Map resultMap = new HashMap();
resultMap.put("STS_KEY_IDENTIFIER_VALUE", emailAddress);
resultMap.put("STS_KEY_IDENTIFIER_VALUE_TYPE", "EmailAddress");
System.out.println("TOKEN_KEY_IDENTIFIER_VALUE  :  " + emailAddress);

result.setTokenProperties(resultMap);
return result;

}

}

開発におけるハイライト: TokenIssuanceModuleクラスの記述

1. public void init(Map options)throws TokenProcessingExceptionメソッドを実装します。
発行者モジュールが初期化されると、init()メソッドがコールされます。initメソッドには、発行テンプレートで定義されたパラメータが含まれるマップが渡されます。

2. public TokenResult issue(TokenContext context) throws TokenProcessingExceptionメソッドを実装します。
このメソッドは、カスタム送信トークンを作成する必要がある場合にコールされます。

1. issueメソッド内で、発行テンプレートの属性およびTokenContextに渡された属性を使用してトークンを作成します。TokenContextの属性には、次の方法でアクセスします。

HashMap attributes = (HashMap)context.getOtherProperties().get("STS_TOKEN_ATTRIBUTES");
System.out.println("attributes : " + attributes.toString());
String emailAddress = null;
Iterator attrIter = null;
if (attributes != null) {
attrIter = attributes.keySet().iterator();
}

if (attrIter != null) {
while (attrIter.hasNext()) {
String attributeName = (String)attrIter.next();
if ("mail".equals(attributeName)) {
Object valuesObj = attributes.get(attributeName);
if (valuesObj instanceof List){
Iterator iter = ((List)valuesObj).iterator();

while (iter.hasNext()) {
Object valueObj = iter.next();
if(valueObj instanceof String){
emailAddress = (String)valueObj;
break;
}
}
} else if (valuesObj instanceof String) {
emailAddress = (String)valuesObj;
}
}
}
}
Status

2. 結果オブジェクトを作成し、トークンのバイト数と、トークンのDocument Object Model (DOM)表現を設定します(DOM表現がこのクラスの処理中に作成された場合のみ)。

token.setTokenDocument(null);--> if you have a doc object that can be reuse.d set it here
token.setTokenBytes(tokenBytes);
TokenResult result = new TokenResultImpl(0, TokenResult.SUCCESS, token);

3. 次のように、キー識別子情報をトークン・プロパティに設定します。

Map resultMap = new HashMap();
resultMap.put("STS_KEY_IDENTIFIER_VALUE", emailAddress);
resultMap.put("STS_KEY_IDENTIFIER_VALUE_TYPE", "EmailAddress");
result.setTokenProperties(resultMap);

注意:

トークン・プロパティとして設定される属性は、コンテキストにおいて使用可能です。これらの属性をトークン・マッピングに使用したり、リライイング・パーティのプロファイル属性セクションで指定して、通常の方法で送信トークンに含めることができます。

14.3.2 TokenIssuanceModuleクラスの記述

タスクの概要: 発行モジュール・クラスの記述

1. 第14.3.1項「TokenIssuanceModuleクラスの記述について」およびOracle Fusion Middleware Oracle Access Management Security Token Service Java APIリファレンスを参照して、発行モジュール・クラスを記述します。

2. Security Token Serviceのカスタム構成の管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

第VI部

付録

この部は、リファレンス付録で構成されています。

第VI部は、次の付録で構成されています。

- 付録A「デプロイメント固有ページの作成」

A デプロイメント固有ページの作成

Oracle Single Sign-Onでは、デプロイメントに固有のログイン、パスワード変更、およびシングル・サインオン・サーバーによるシングル・サインオフ・ページを統合するためのフレームワークが提供されます。つまり、UIのルック・アンド・フィールおよびグローバリゼーション要件に合せてこれらのページを調整できます。

JavaServer (JSP)ページを使用することをお薦めします。他のWebテクノロジでは、結果に矛盾が生じる可能性があります。PLSQLページはサポートされていません。製品にサンプル・ページが付属しています。Oracle Single Sign-On製品には、Oracle Application Serverでのテスト用のサンプル・ページが付属しています。

この章には次のトピックが含まれます。

- 第A.1項「シングル・サインオン・サーバーでのデプロイメント固有ページの使用方法」

- 第A.2項「デプロイメント固有ページの記述方法」

- 第A.3項「ページのエラー・コード」

- 第A.4項「グローバリゼーション・サポートの追加」

- 第A.5項「デプロイメント固有ページに関するガイドライン」

- 第A.6項「デプロイメント固有ページの例」

- 第A.7項「外部アプリケーションの追加」

A.1 シングル・サインオン・サーバーでのデプロイメント固有ページの使用方法

シングル・サインオン・ページを使用可能にするプロセスは、次のようにまとめることができます。

1. ユーザーはアプリケーションをリクエストし、シングル・サインオン・サーバーへリダイレクトされます。

2. ユーザーが認証されない場合、シングル・サインオン・サーバーはユーザーをサンプル・ログイン・ページかデプロイメント固有ページへリダイレクトします。このリダイレクトの一環として、表A-1に示すパラメータがサーバーからページに渡されます。

3. ユーザーはログイン・ページを実行します。これにより、表A-2に示すパラメータが次の認証URLに渡されます。

http://sso_host:sso_port/oam/server/auth_cred_submit

または

https://sso_host:sso_ssl_port/oam/server/auth_cred_submit

これらのパラメータのうち少なくとも2つ(ssousername、password)が変更可能なフィールドとしてページに表示されます。

4. 認証が失敗すると、サーバーはユーザーを再びログイン・ページへリダイレクトして、エラー・メッセージを表示します。

5. ユーザーがシングル・サインオン・セッションを終了するには、作業中のアプリケーションで「ログアウト」をクリックします。これにより、アプリケーションのログアウトURLが同時にコールされ、ユーザーはアクセスしたすべてのアプリケーションからログアウトされ、シングル・サインオン・セッションが終了します。

6. ユーザーはシングル・サインオン・サーバーへリダイレクトされ、そこでシングル・サインオフ・ページが表示されます。

A.1.1 パスワード変更ページの動作

パスワードの有効期限が切れている場合や期限切れが近いときにユーザーがログインしようとすると、サーバーは次のように動作します。

A.1.1.1 パスワードが失効している場合

パスワードの失効を表すページが表示されます。ユーザーは、古いパスワードと新しいパスワードを入力する必要があります。新しいパスワードは、Access Managerパスワード・ポリシー・ルールに準拠している必要があります。

A.1.1.2 パスワードが間もなく失効する場合

警告ページが表示され、ユーザーはここで、パスワードを変更したり、変更せずに続行できます。

A.1.1.3 猶予ログインが有効

パスワードが間もなく失効する場合と同じになります。

A.1.1.4 パスワード変更の強制

この機能は、管理者によるパスワードのリセット後にパスワードの変更をユーザーに要求します。このリセットは、属性obpasswordchangeflagが1に設定された後に要求されます。属性が設定されると、ユーザーは次回ログイン時にパスワードを変更する必要があります。

A.2 デプロイメント固有ページの記述方法

ログイン・ページ、パスワード変更ページおよびシングル・サインオフ・ページのURLでは、これらのページが正常に機能するために、以降の表に示すパラメータを受け入れる必要があります。

この項には次のトピックが含まれます。

- ログイン・ページのパラメータ

- パスワード変更ページのパラメータ

A.2.1 ログイン・ページのパラメータ

ログイン・ページのURLでは、表A-1に示すパラメータを受け入れる必要があります。

表A-1 シングル・サインオン・サーバーによりログイン・ページに送信されるログイン・ページ・パラメータ

パラメータ

説明

p_error_code

エラー・コードが文字列の形式で含まれています。認証中にエラーが発生したときに渡されます。

request_id

クライアントとサーバー間でルーティングされるリクエストの追跡に使用される一意の識別子。

OAM_REQ

認証プロセスが完了するまでクライアントで追跡されるユーザー・ログイン・リクエスト・コンテキスト。

ログイン・ページでは、表A-2に示すパラメータを次の認証URLに渡す必要があります。

http://sso_host:sso_port/sso/auth

表A-2 ページからシングル・サインオン・サーバーに送信されるログイン・ページのパラメータ

パラメータ

説明

ssousername

ユーザー名が含まれています。UTF-8 encodedであることが必要です。

password

ユーザーによって入力されたパスワードが含まれています。UTF-8 encodedであることが必要です。

OAM_REQ (リクエストに存在する場合)

認証プロセスが完了するまでクライアントで追跡されるユーザー・ログイン・リクエスト・コンテキスト。

request_id (リクエストに存在する場合)

クライアントとサーバー間でルーティングされるリクエストの追跡に使用される一意の識別子。

ログイン・ページには、パラメータ名ssousernameのテキスト・フィールドとパラメータ名passwordのパスワード・フィールドの少なくとも2つが必要です。値は、認証URLに渡されます。

これらのパラメータを送信する他に、ログイン・ページはp_error_codeの指定に従って適切なエラー・メッセージを表示し、ユーザーが「取消」をクリックするとp_cancel_urlへリダイレクトする必要があります。

A.2.2 パスワード変更ページのパラメータ

パスワード変更ページのURLでは、表A-3に示すパラメータを受け入れる必要があります。

注意:

GITデプロイメントでは、パートナ・ログアウト・フローがp_done_urlで問合せパラメータを必要とするとき、このパラメータをURLエンコーディングして、Access Managerログアウト・サーブレットがこれらをAccess Managerパラメータであると解釈するのでなく、1つのp_done_urlの要素であると解釈するようにする必要があります。

表A-3 ページに送信されるパスワード変更パラメータ

パラメータ

説明

p_username

ページのどこかに表示されるユーザー名が含まれています。

p_subscribername

ホスティングが有効な場合のサブスクライバ・ニックネームです。

注意: このフィールドは、ログイン・ページで必須です。

p_error_code

前回のパスワード変更時にエラーが発生していた場合、文字列形式のエラー・コードが含まれます。

p_done_url

パスワードが保存された後に戻る適切なページのURLが含まれます。

site2pstoretoken

パスワードの期限が切れたか期限が切れようとしている場合に/sso/authログインURLで必要になるsite2pstoretokenが含まれています。

p_pwd_is_exp

パスワードの期限が切れたのか、それとも期限が切れようとしているのかを示すフラグ値が含まれています。値はWARNかFORCEのいずれかです。関連するエラー・コードは、表A-5を参照してください。

locale

ユーザーの言語設定です(オプション)。ISO形式にする必要があります。たとえば、フランス語の場合はfr-frです。このパラメータの詳細は、「グローバリゼーション・サポートの追加」を参照してください。

パスワード変更ページは、表A-4に示すパラメータを、パスワード変更URLに渡す必要があります。

http://sso_host:sso_port/sso/ChangePwdServlet

表A-4 ページにより送信されるパスワード変更ページのパラメータ

パラメータ

説明

p_username

ページのどこかに表示されるユーザー名が含まれています。パスワード変更ページから、非表示フィールドとして送信する必要があります。UTF-8 encodedであることが必要です。

p_old_password

ユーザーの古いパスワードが含まれています。UTF-8 encodedであることが必要です。

p_new_password

ユーザーの新しいパスワードが含まれています。UTF-8 encodedであることが必要です。

p_new_password_confirm

ユーザーの新しい確認パスワードが含まれています。UTF-8 encodedであることが必要です。

p_done_url

パスワードが保存された後に戻る適切なページのURLが含まれます。

p_pwd_is_exp

パスワードの期限が切れたのか、それとも期限が切れようとしているのかを示すフラグ値が含まれています。値はWARNかFORCEのいずれかです。関連するエラー・コードは、表A-5を参照してください。

site2pstoretoken

ログイン処理用のリダイレクトURL情報が含まれています。

p_action

変更をコミットします。値はOK(コミット)とCANCEL(無視)のいずれかであることが必要です。

p_subscribername

ページのどこかに表示されるユーザー名が含まれています。

p_request

ユーザーによりリクエストされた保護URLです。

locale

ユーザーの言語設定です(オプション)。ISO形式にする必要があります。たとえば、フランス語はfr-frです。

「グローバリゼーション・サポートの追加」を参照してください。

パスワード変更ページには、少なくともp_old_password、p_new_passwordおよびp_new_password_confirmの3つのパスワード・フィールドが必要です。パスワード変更ページはこれらのフィールドをパスワード変更URLへ送信します。

パスワード変更ページは、p_done_urlも非表示パラメータとしてパスワード変更URLへ送信します。さらに、p_error_codeの値に応じてエラー・メッセージを表示する必要があります。

A.3 ページのエラー・コード

ログインおよびパスワード変更ページのURLでは、これらのページが正しく機能するために、以降の表に示すプロセス・エラーを受け入れる必要があります。

A.3.1 OSSO 10gログイン・ページのエラー・コード

OAMサーバーがOSSO10gに設定されると、ログイン・ページは表A-5に示すエラー・コードを処理する必要があります。

表A-5 ログイン・ページのエラー・コード

p_error_codeの値

対応するメッセージと説明

acct_lock_err

説明: ユーザーは何度もログインに失敗しました。

メッセージ: 「アカウントがロックされています。システム管理者に通知してください。」

pwd_exp_err

説明: ユーザーのパスワードはすでに期限切れです。

メッセージ: 「パスワードが期限切れです。管理者に連絡して、パスワードをリセットしてください。」

null_uname_pwd_err

説明: ユーザーはユーザー名フィールドを空白のままにしました。

メッセージ: 「有効なユーザー名を入力してください。」

auth_fail_exception

説明: 認証に失敗しました。

メッセージ: 「認証に失敗しました。再試行してください。」

null_password_err

説明: ユーザーはパスワード・フィールドを空白のままにしました。

メッセージ: 「ログイン・パスワードを入力する必要があります。」

sso_forced_auth

説明: アプリケーションは認証を必要としています。

メッセージ: 「アクセスしようとしているアプリケーションに以前サインインしている場合でも、再度サインインする必要があります。」

unexpected_exception

説明: 予期しないエラーが認証中に発生しました。

メッセージ: 「予期しないエラーが発生しました。再試行してください。」

unexp_err

説明: 予期しないエラーです。

「予期しないエラーが発生しました。管理者に通知してください。」

internal_server_err

説明: 内部サーバー・エラーのレポートです。

メッセージ: 「内部サーバー・エラーです。管理者に通知してください。」

internal_server_try_again_err

説明: 再試行のプロンプト付きの内部サーバー・エラーのレポートです。

メッセージ: 「内部サーバー・エラーです。操作を再試行してください。」

internal_server_try_later_err

説明: 後での実行のプロンプト付きの内部サーバー・エラーのレポートです。

メッセージ: 「内部サーバー・エラーです。後で操作を実行してください。」

gito_err

説明: 非アクティブのタイムアウトです。ユーザーは再度ログインする必要があります。

メッセージ: 「シングル・サインオン・セッションが期限切れになっています。セキュリティのため、一定の時間操作がないとセッションは期限切れになります。再度サインインしてください。」

cert_auth_err

説明: 証明書サインオンに失敗しました。ユーザーは証明書が有効であることを確認するか、または管理者に連絡する必要があります。

メッセージ: 「証明書ベースのサインインに失敗しました。証明書が有効であるか確認してください。有効でない場合はシステム管理者に連絡してください。

session_exp_error

説明: シングル・サインオン・セッションの時間制限に達しました。

メッセージ: 「シングル・サインオン・セッションが期限切れになっています。セキュリティのため、指定された時間が経過するとセッションは期限切れになります。再度サインインしてください。」

userid_mismatch

説明: 強制認証中に提示されたユーザーIDは、現在のシングル・サインオン・セッションのユーザーIDと一致しません。

メッセージ: 「認証用に送信されたユーザー名は、既存のシングル・サインオン・セッションに存在するユーザー名と一致しません。」

A.4 グローバリゼーション・サポートの追加

OracleAS Single Sign-Onフレームワークにより、デプロイメント固有ページを各々のデプロイメントのニーズに合せてグローバル化できます。どの言語でページで表示するかを決めるとき、様々な方針を採ることができます。2つの方針を次の項で示します。

A.4.1 ページに表示する言語の決定

この項では、「HTTP Accept-Language」ヘッダーとデプロイメント・ページ・ロジックのいずれかを使用して表示言語を選択する方法を説明します。

A.4.1.1 Accept-Languageヘッダーを使用したページの決定

ブラウザでエンド・ユーザーは、Webコンテンツを表示する際の言語(ロケール)を決定できます。ブラウザはユーザーが選択した言語をサーバーへ、HTTP Accept-Languageヘッダーの形式で送信します。デプロイメント固有ページのロジックはこのヘッダーを調べ、それに応じてこのページをレンダリングする必要があります。シングル・サインオン・サーバーでは、このページを受け取ると、Accept-Languageヘッダーの値を読み取り、ユーザーのアイデンティティの伝播時にその値をアプリケーションへ送信します。多くのアプリケーションでは、ユーザーがこのヘッダーをオーバーライドできますが、シングル・サインオフ・ページはサインオン時に確立された言語で表示される点に注意してください。このため、すべてのアプリケーションで同じセッション言語が使用されます。

Accept-Languageヘッダーは、言語設定を決定するための推奨メカニズムです。この方法の主な利点は、エンド・ユーザーが他のWebサイトを閲覧している間に、言語をすでに設定している可能性が高いということです。そのため、これらのページとシングル・サインオンのページ間で閲覧の一貫性が保たれます。

A.4.1.2 ページ・ロジックを使用した言語の決定

前の項で説明した方法をお薦めしますが、ブラウザで設定された言語を拡張(またはオーバーライド)するメカニズムに基づいてグローバリゼーションを実装することもできます。たとえば、次のいずれかの方法があります。

- ログイン・ページに言語一覧を表示し、ユーザーが選択できるようにします。ユーザーの便宜を考慮して、永続Cookieを設定してこの選択を永続的なものにすることもできます。

- 言語を1つ設定して、ページをレンダリングします。この方法は、ユーザーが単一言語で入力することがわかっている場合に適しています。

- 集中管理されたアプリケーション・リポジトリまたはディレクトリから言語設定を取得します。ユーザー設定項目、システム設定項目、構成データの集中管理されたストアは、言語を格納するのに最適です。

ページのロジックを使用して言語を設定する場合、ページではこの情報をシングル・サインオン・サーバーに伝播する必要があります。サーバーは、この情報をアプリケーションに伝播する必要があります。最終的には、一貫性のあるグローバリゼーションが保たれます。ページでは、ログイン・フォームのlocaleパラメータ(表A-2)を使用して、ISO-639形式で言語を渡す必要があります。多くのサイトには、ISO-639の2文字言語コードの全一覧があります。次のサイトにもこの一覧があります。

http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt

次のサイトには、ISO-3166の2文字国コードの全一覧があります。

http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html

注意:

localeパラメータがシングル・サインオン・サーバーに渡されると(表A-1)、パラメータ値はmod_ossoへ送られます。mod_ossoはこの値をHTTP Accept-Languageヘッダーの先頭に追加してから、ヘッダーをアプリケーションに渡します。

A.4.2 ページのレンダリング

エンド・ユーザーのロケールが決定されると、デプロイメント固有ページでは対応する翻訳文字列を使用して、ページをレンダリングする必要があります。これらの文字列の格納方法および取得方法については、『Oracle Application Server グローバリゼーション・ガイド』のロケール認識に関する章を参照してください。Java開発に関する標準的なドキュメントも参照してください。次に2つのリンクを示します。

- Javaの国際化ガイド:

http://java.sun.com/j2se/1.4.2/docs/guide/intl/index.html

- Javaドキュメントの一般的なリンク:

http://java.sun.com/j2se/1.4.2/docs

A.5 デプロイメント固有ページに関するガイドライン

デプロイメント固有ページを実装する場合は、次のガイドラインに従ってください。

- ログイン・ページとパスワード変更ページは、SSLで保護することをお薦めします。

- ログイン・ページとパスワード変更ページでは、クロスサイト・スクリプティング攻撃に備えてコーディングする必要があります。

- ログイン・ページとパスワード変更ページでは、自動埋込みとキャッシュをoffに設定する必要があります。これにより、ユーザーの資格証明がブラウザに保存されたり、キャッシュされる恐れはなくなります。AutoCompleteタグの例を次に示します。

<FORM NAME="foo" AutoComplete="off" METHOD="POST" ACTION="bar">

- オラクル社では、無認可のアクセスに対して警告するバナーを表示するように、ログイン・ページを構成することをお薦めします。たとえば、次のような文章を使用できます。

Unauthorized use of this site is prohibited and may subject you to civil and criminal prosecution.

- シングル・サインオン・サーバーをホスティングするコンピュータに、ログイン・ページおよびパスワード変更ページをデプロイします。これにより、これらのページの不正なバージョンを簡単に検出できます。

A.6 デプロイメント固有ページの例

ipassample.jarファイルには、login-ex.jsp、password-ex.jsp、signoff-ex.jspの各ファイルが含まれています。これらのファイルを、デプロイメントに合せてカスタマイズできます。これらのファイルを使用する場合は、次のようにします。次に示すコマンドを使用してファイルを取り出します。

ORACLE_HOME/jdk/bin/jar -xvf ORACLE_HOME/sso/lib/ipassample.jar

A.6.1 カスタム・クラスの使用

一般に、カスタマイズしたデプロイメント固有ページは、OC4J_SECURITYによって使用されている現在のバージョンのコンポーネント・クラスで動作する必要があります。カスタム・アプリケーションで、特定のクラスの別のバージョンを使用する必要がある場合は、そのクラスをOC4J_SECURITYインスタンスではなく、別のOC4Jインスタンスにデプロイすることが必要です。

たとえば、OC4J_SECURITYで使用されるバージョンと競合するカスタムlog4jクラスを使用する必要のあるデプロイメントでは、そのカスタム・クラスを含むローカルのlog4j jarファイルを使用する別のOC4J_SECURITYインスタンスを起動します。

警告:

OC4J_SECURITYで使用されるクラスをカスタム・バージョンに置き換えると、Oracle Single Sign-Onや他のOracle Application Serverコンポーネントが使用できなくなる場合があります。

A.7 外部アプリケーションの追加

「シングル・サインオン・サーバー管理」ページで「外部アプリケーション管理」リンクをクリックし、「外部アプリケーションの追加」リンクをクリックすると、「外部アプリケーションの追加」ページが表示されます。このページには、次の見出しとフィールドが含まれています。

表A-6 外部アプリケーション・ログイン

フィールド

説明

アプリケーション名

外部アプリケーションを識別する名前を入力します。これは、外部アプリケーションのデフォルト名です。

ログインURL

外部アプリケーションのHTMLログイン・ページを認証するための送信先URLを入力します。例として次にYahoo! MailのログインURLを示します。

http://login.yahoo.com/config/login?6p4f5s403j3h0

ユーザー名/IDフィールド名

外部アプリケーションのHTMLログイン・フォームのユーザー名またはユーザーIDフィールドを識別する用語を入力します。この用語は、ログイン・フォームのHTMLソースで確認できます。(この後の手順の例を参照してください)。このフィールドは、Basic認証を使用している場合は適用されません。

パスワード・フィールド名

外部アプリケーションのHTMLログイン・フォームのパスワード・フィールドを識別する用語を入力します。この用語は、ログイン・フォームのHTMLソースで確認できます。(この後の手順の例を参照してください)。このフィールドは、Basic認証を使用している場合は適用されません。

表A-7 認証方式

フィールド

説明

使用する認証タイプ

プルダウン・メニューから、アプリケーションで使用するフォーム送信方法を選択します。これは、ブラウザがメッセージ・データを送信する方法を示します。この文字列は、ログイン・フォームのHTMLソースで確認できます。次の3つの方法のいずれかを選択します。

POST:シングル・サインオン・サーバーにデータを転送し、ログイン資格証明をフォームの本文内で送信します。

GET: ページ・リクエストをサーバーに送信し、ログイン資格証明をログインURLの一部として発行します。

Basic認証:アプリケーションURL内のログイン資格証明を送信します。この送信は、HTTP Basic認証で保護されます。

注意:

- Basic認証で使用するポップアップ・ウィンドウは、Windows XPのサービス・パック2ではデフォルトでブロックされます。このサービス・パックを使用する場合、シングル・サインオン用ログイン・ページのウィンドウを表示するよう、ブラウザ設定を再構成してください。これには、Internet Explorerの「ツール」メニューにある「ポップアップ ブロック」を使用します。
他のブラウザおよびブラウザ・プラグインでも、ポップアップのブロックが可能です。Mozillaはこれらの1つです。これらのブラウザによってシングル・サインオンのログイン・ページがブロックされないようにしてください。

- Internet Explorer 5.0以上を使用する場合、外部アプリケーションでBasic認証が機能しないことがあります。このバージョンのInternet Explorerには、Microsoft MS04-004 Cumulative Security Update (832894)が含まれます。対処方法は、次のサイトを参照してください。

http://support.microsoft.com

表A-8 追加フィールド

フィールド

説明

フィールド名

ログイン時にユーザー入力を要求するフィールドをHTMLログイン・フォームに追加した場合は、そのフィールドの名前を入力します。このフィールドは、Basic認証を使用している場合は適用されません。

フィールド値

対応するフィールド名のデフォルト値を入力します(該当する場合)。このフィールドは、Basic認証を使用している場合は適用されません。

外部アプリケーションを追加する手順

1. 「外部アプリケーション管理」ページから、「外部アプリケーションの追加」を選択します。
「外部アプリケーションの追加」ページが表示されます。

2. 「外部アプリケーション・ログイン」フィールドに、外部アプリケーション名とHTMLログイン・フォームの送信先URLを入力します。Basic認証を使用する場合は、保護されたURLを入力します。

3. アプリケーションでHTTP POST認証またはHTTP GET認証が使用されている場合は、「ユーザー名/IDフィールド名」フィールドに、HTMLログイン・フォームのユーザー名またはユーザーIDフィールドを識別する用語を入力します。
この名前は、ログイン・フォームのHTMLソースで確認できます。

アプリケーションでBasic認証方式が使用されている場合は、「ユーザー名/IDフィールド名」フィールドを空にします。

4. アプリケーションでHTTP POST認証またはHTTP GET認証が使用されている場合は、「パスワード・フィールド名」フィールドに、アプリケーションのパスワード・フィールドを識別する用語を入力します。
ログイン・フォームのHTMLソースを参照してください。

アプリケーションでBasic認証方式が使用されている場合は、「パスワード・フィールド名」フィールドを空にします。

5. ログイン時にユーザー入力を要求するフィールドをHTMLログイン・フォームに追加した場合は、「追加フィールド」フィールドに、そのフィールドの名前とデフォルト値を入力します。
アプリケーションでBasic認証方式が使用されている場合は、これらのフィールドを空にします。

6. HTMLログイン・フォームでユーザーが追加フィールドのデフォルト値を変更できるようにする場合は、「ユーザーに表示」チェック・ボックスを選択します。

7. 「OK」をクリックします。新しい外部アプリケーションが、「外部アプリケーション管理」ページの「外部アプリケーションの編集/削除」ヘッダーの下に、他の外部アプリケーションとともに表示されます。

8. アプリケーションのリンクをクリックして、ログインをテストします。

次の例は、Yahoo! Mailで使用する値のソースを示しています。

<form method=post action="http://login.yahoo.com/config/login?6p4f5s403j3h0" autocomplete=off name=a>
...
<td><input name=login size=20 maxlength=32></td>
....
<td><input name=passwd type=password size=20 maxlength=32></td>
...
<input type=checkbox name=".persistent" value="Y" >Remember my ID & password
...
</form>

ソースには次の値が示されています。

- ログインURL:

http://login.yahoo.com/config/login?6p4f5s403j3h0

- ユーザー名/IDフィールド名: login

- パスワード・フィールド名: passwd

- 使用する認証タイプ: POST

- フィールド名: .persistent Y

- フィールド値: [off]

注意:

AS中間層のホスト名を変更する場合は、この中間層で外部アプリケーションの「ログインURL」フィールドを手動で更新する必要があります。この変更は、次の項で説明する「外部アプリケーションの編集」ページで行います。

Copyright © 2000, 2012, Oracle and/or its affiliates. All rights reserved.