カスタム・メディエーター

OAuth 2.0 メディエーターは、カスタマイズした後処理を実行するために OAuth 2.0 メッセージ処理中にコールバックとして使用されます。

OAuth 2.0 メディエーターの作成

メディエーターを作成するには、com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator というインターフェースを実装する必要があります。 以下の 1 つ以上のメソッドを実装して、カスタム後処理を実行できます。
void init(OAuthComponentConfiguration config)
このメソッドは、このオブジェクトのインスタンスの作成時にファクトリーによって呼び出されます。
void mediateAuthorize(AttributeList attributeList)
このメソッドは、processAuthorization メソッドでのコンポーネント・コンシューマーによるカスタム後処理を可能にするために、基本的なメッセージの検証と処理の後にコア・コンポーネントによって呼び出されます。
void mediateAuthorizeException(AttributeList attributeList, OAuthException exception)
このメソッドは、processAuthorization メソッドでのコンポーネント・コンシューマーによるカスタム後処理を可能にするために、プロトコル例外の発生時にコア・コンポーネントによって呼び出されます。
void mediateResource(AttributeList attributeList)
このメソッドは、processResourceRequest メソッドでのコンポーネント・コンシューマーによるカスタム後処理を可能にするために、基本的なメッセージの検証と処理の後にコア・コンポーネントによって呼び出されます。
void mediateResourceException(AttributeList attributeList, OAuthException exception)
このメソッドは、processResourceRequest メソッドでのコンポーネント・コンシューマーによるカスタム後処理を可能にするために、プロトコル例外の発生時にコア・コンポーネントによって呼び出されます。
void mediateToken(AttributeList attributeList)
このメソッドは、processTokenRequest メソッドでのコンポーネント・コンシューマーによるカスタム後処理を可能にするために、基本的なメッセージの検証と処理の後にコア・コンポーネントによって呼び出されます。
void mediateTokenException(AttributeList attributeList, OAuthException exception)
このメソッドは、processTokenRequest メソッドでのコンポーネント・コンシューマーによるカスタム後処理を可能にするために、プロトコル例外の発生時にコア・コンポーネントによって呼び出されます。

OAuth プロバイダー用の OAuth 2.0 メディエーターの有効化

カスタマイズしたメディエーターを特定の OAuth 2.0 サービス・プロバイダーに追加するには、server.xml ファイル内のプロバイダー定義を更新します。 oauthProvider エレメントの mediatorClassname 属性を追加し、メディエーターのクラス名を指定します。また、oauthProvider エレメントの mediatorClassname サブエレメントを使用することで、メディエーターの複数のクラス名を指定することもできます。複数のメディエーターを指定した場合、メディエーターは指定順に開始されます。 また、メディエーター・クラスが含まれた library エレメントを定義し、libraryRef 属性を使用してそのライブラリーを参照する必要もあります。

以下の例で、server.xml ファイル内のプロバイダー定義のサンプル・カスタム・メディエーター・エントリーを示します。
<oauthProvider id="OAuthConfigSample" libraryRef="myLib"
  mediatorClassname="com.ibm.ws.security.oauth20.mediator.ResourceOwnerValidationMediator" ...>
  ...
</oauthProvider>

<library id="myLib">
  <fileset dir="C:¥mydir" includes="myLib.jar" />
</library>
以下のコード・サンプルでは、リソース所有者パスワード・クレデンシャルのフローで WebSphere® Application Server ユーザー・レジストリーを使用して、クレデンシャルの検証を実装します。
package com.ibm.ws.security.oauth20.mediator;

import com.ibm.oauth.core.api.attributes.AttributeList;
import com.ibm.oauth.core.api.config.OAuthComponentConfiguration;
import com.ibm.oauth.core.api.error.OAuthException;
import com.ibm.oauth.core.api.error.oauth20.OAuth20MediatorException;
import com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator;
import com.ibm.oauth.core.internal.oauth20.OAuth20Constants;
import com.ibm.websphere.security.CustomRegistryException;
import com.ibm.websphere.security.PasswordCheckFailedException;
import com.ibm.websphere.security.UserRegistry;

import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ResourceOwnerValidationMedidator implements OAuth20Mediator {
  private static final String CLASS = ResourceOwnerValidationMedidator.class.getName();
  private static final Logger LOG = Logger.getLogger(CLASS);
  private UserRegistry reg = null;

  public void init(OAuthComponentConfiguration config) {
    try {
      InitialContext ctx = new InitialContext();
      reg = (UserRegistry) ctx.lookup("UserRegistry");
    } catch(NamingException ne) {
      LOG.log(Level.SEVERE, "Cannot lookup UserRegistry", ne);
    }
  }

  public void mediateAuthorize(AttributeList attributeList)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateAuthorizeException(AttributeList attributeList,
                                        OAuthException exception)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateResource(AttributeList attributeList)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateResourceException(AttributeList attributeList,
                                       OAuthException exception)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateToken(AttributeList attributeList)
    throws OAuth20MediatorException {
    final String methodName = "mediateToken";
    LOG.entering(CLASS, methodName, attributeList);
    if("password".equals(attributeList.getAttributeValueByName("grant_type"))) {
      String username = attributeList.getAttributeValueByName("username");
      String password = attributeList.getAttributeValueByName("password");
      try {
        reg.checkPassword(username, password);
      } catch (PasswordCheckFailedException e) {
        throw new OAuth20MediatorException("User doesn't exist or the
                                           password doesn't match.", e);
      } catch (CustomRegistryException e) {
        throw new OAuth20MediatorException("Cannot validate resource owner.", e);
      } catch (RemoteException e) {
        throw new OAuth20MediatorException("Cannot validate resource owner.", e);
      } 
    }
    LOG.exiting(CLASS, methodName);
  }

  public void mediateTokenException(AttributeList attributeList,
                                    OAuthException exception)
    throws OAuth20MediatorException {
    final String methodName = "mediateTokenException";
    LOG.entering(CLASS, methodName, new Object[] {attributeList, exception});
    if("password".equals(attributeList.getAttributeValueByName("grant_type"))) {
      // clear sensitive data
      attributeList.setAttribute("access_token",
                                 OAuth20Constants.ATTRTYPE_RESPONSE_ATTRIBUTE,
                                 new String[0]);
      attributeList.setAttribute("refresh_token",
                                 OAuth20Constants.ATTRTYPE_RESPONSE_ATTRIBUTE,
                                 new String[0]);
    }
    LOG.exiting(CLASS, methodName);
  }

}

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwlp_oauth_custommediator
ファイル名: cwlp_oauth_custommediator.html