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

前
 
次
 

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

Oracle Security Token Serviceにおいて、検証または発行するトークンがデフォルトでサポートされていない場合、独自の検証および発行モジュール・クラスを記述できます。この章では、Oracle Security Token Serviceのカスタム・トークン・オプションについて説明します。内容は次のとおりです。

17.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管理者ガイド』を参照してください。

17.2 TokenValidatorModuleクラスの記述

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

17.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に設定し、これを使用してユーザー・レコードにマップします。

例17-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")
      

17.2.2 TokenValidatorModuleクラスの記述

次のタスクを実行し、カスタムTokenValidatorModuleクラスを記述します。

タスクの概要: TokenValidatorModuleクラスの記述

  1. 次を参照して、独自のモジュール・クラスを開発します。

  2. 必要に応じて次に進みます。

17.3 TokenIssuanceModuleクラスの記述

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

17.3.1 TokenIssuanceModuleクラスの記述について

EmailTokenIssuerModuleImpl.javaクラスは、oracle.security.fed.sts.token.tpe.TokenIssuerModuleインタフェースおよびTokenContextの属性を実装する必要があります。

例17-2は、EmailTokenIssuanceModuleImplクラスの例を示しています。次の概要では、このモジュール・クラスの開発におけるハイライトを説明します。

例17-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);
      

注意:

トークン・プロパティとして設定される属性は、コンテキストにおいて使用可能です。これらの属性をトークン・マッピングに使用したり、リライイング・パーティのプロファイル属性セクションで指定して、通常の方法で送信トークンに含めることができます。

17.3.2 TokenIssuanceModuleクラスの記述

タスクの概要: 発行モジュール・クラスの記述

  1. 第17.3.1項「TokenIssuanceModuleクラスの記述について」およびOracle Fusion Middleware Oracle Access Management Security Token Service Java APIリファレンスを参照して、発行モジュール・クラスを記述します。

  2. Security Token Serviceのカスタム構成の管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。